diff options
| author | Scott Gasch <[email protected]> | 2016-06-01 19:04:57 -0700 |
|---|---|---|
| committer | Scott Gasch <[email protected]> | 2016-06-01 19:04:57 -0700 |
| commit | 10acef9e6f2d1f56a39c7f4b9ccf4b4be6f8bed7 (patch) | |
| tree | 72a2bacbe76e6bf5b4c344279559f17cccb0ec35 /programs | |
Diffstat (limited to 'programs')
| -rw-r--r-- | programs/ComputerEloList | 197 | ||||
| -rw-r--r-- | programs/FewBits | 252 | ||||
| -rw-r--r-- | programs/PCratings | 30 | ||||
| -rw-r--r-- | programs/SSDF-RatingList | 994 | ||||
| -rw-r--r-- | programs/engine-intf.html | 1895 | ||||
| -rw-r--r-- | programs/harvar93.txt | 519 | ||||
| -rw-r--r-- | programs/minimax.bib | 1338 | ||||
| -rw-r--r-- | programs/minimax.dvi | bin | 0 -> 32832 bytes | |||
| -rw-r--r-- | programs/pentopt.htm | 6723 | ||||
| -rw-r--r-- | programs/testsuites | 2 | ||||
| -rw-r--r-- | programs/uniacke.ps | 12175 | ||||
| -rw-r--r-- | programs/xboard.html | 1300 |
12 files changed, 25425 insertions, 0 deletions
diff --git a/programs/ComputerEloList b/programs/ComputerEloList new file mode 100644 index 0000000..4c7726d --- /dev/null +++ b/programs/ComputerEloList @@ -0,0 +1,197 @@ +Computerrangliste nach Werner Stowasser +(Stand: Dezember 1992) + +Ausgewertet wurden: +38.710 Partien "Computer gegen Computer" + 6.044 Partien "Mensch gegen Computer" + +Erklaerung der Abkuerzungen: +GR = Grossrechner +PC = PC-Programm + +Nr. Schachcomputer Elo +---------------------------------------------------------------------- +1. Deep Thought II (GR) 2.520 +2. Deep Thought I (GR) 2.470 +3. Cray Blitz (GR) 2.435 +4. Hitech (GR) 2.400 +5. Mephisto Vancouver 68030 2.322 +6. Mephisto RISC 1 MB ARM2 2.319 +7. Mephisto Lyon 68030 2.310 +8. Saitek Kasparow RISC 2500 512 KB ARM2 2.309 +9. Gideon ChessMachine 512 KB ARM2 (PC) 2.291 +10. The King ChessMachine 512 KB ARM2 (PC) 2.289 +11. M Chess 1.66 AT 80486 (PC) 2.285 +12. Mephisto Portorose 68030 2.281 +13. BeBe (GR) 2.260 +14. Fidelity Elite 68040 2.255 +15. Mephisto Vancouver 68020 2.236 +16. Fidelity Elite 68030 2.235 +17. M Chess 1.41 AT 80486 (PC) 2.228 +18. M Chess 1.66 AT 80386 (PC) 2.224 +19. Fidelity Elite 68020 2.220 +20. Mephisto Lyon 68020 2.210 +21. Belle (GR) 2.200 +22. Mephisto Portorose 68020 2.189 +23. Fidelity Mach IV 68020 2.174 +24. M Chess 1.41 AT 80386 (PC) 2.164 +25. Fidelity Elite Premiere 68000 2.162 + M Chess 1.66 AT 80286 (PC) 2.162 + Mephisto Vancouver 68000 2.162 +28. Fritz AT 80486 (PC) 2.158 +29. Mephisto Berlin 68000 2.155 +30. Fidelity Designer Master 68020 2.149 +31. Mephisto Almeria 68020 2.145 +32. Mephisto Lyon 68000 2.133 +33. Fidelity Elite 68000 X 2 2.123 +34. Chessmaster 3000 AT 80486 (PC) 2.121 +35. Fidelity Elite 68000 2.108 +36. Mephisto Portorose 68000 2.090 +37. M Chess 1.41 AT 80286 (PC) 2.087 +38. Fidelity Mach III 68000 2.079 +39. Novag Diablo/Scorpio 68000 2.077 +40. Mephisto Roma 68020 2.072 +41. Rexchess V. 2.3 AT 80386 (PC) 2.068 +42. Fidelity Designer Master 68000 2.067 + Peri Epsilon 68000 2.067 +44. Mephisto Dallas 68020 2.066 +45. Fritz AT 80386 (PC) 2.065 +46. Zarkov V. 2.5 AT 80386 (PC) 2.064 +47. Mephisto Almeria 68000 2.062 +48. Saitek Kasparow GK 2000 H8 - 10 MHz 2.060 +49. Chessmaster 3000 AT 80386 (PC) 2.023 +50. Mephisto Milano 6502 - 5 MHz 2.020 +51. Mephisto Roma 68000 2.020 +52. Novag Super Expert/Forte C 6502 - 6 MHz 2.018 +53. Mephisto Polgar 6502 - 5 MHz 2.015 +54. Mephisto Dallas 68000 2.014 +55. Mephisto MM V 6502 - 5 MHz 2.011 +56. Mephisto Roma II 68000 2.000 +57. Fidelity Mach II 68000 1.993 +58. Mephisto Academy 6502 - 5 MHz 1.976 +59. Mephisto Amsterdam 68000 1.974 +60. Saitek Leonardo M D 6502 - 10 MHz 1.972 +61. Fidelity Travel Master H8 - 10 MHz 1.968 +62. Novag Super Expert/Forte B 6502 - 6 MHz 1.966 +63. Fritz AT 80286 (PC) 1.959 +64. Fidelity Prestige Avantgarde 6502 - 8 MHz + GME 1.955 +65. Mephisto Mega IV 6502 - 5 MHz 1.954 +66. Mephisto MM IV 6502 - 5 MHz 1.940 +67. Fidelity Excel 68000 1.927 +68. Psion Chess Atari 68000 (PC) 1.925 +69. Fidelity Designer 2100 6502 - 6 MHz 1.922 +70. Saitek Turboking 6502 - 5 MHz 1.919 +71. Saitek Travel Champion H8 - 8 MHz 1.912 +72. Chessmaster 3000 AT 80286 (PC) 1.910 +73. Fidelity Elite Avantgarde 6502 - 5 MHz 1.905 +74. Saitek Leonardo M C 6502 - 8 MHz 1.902 +75. CXG Sphinx Galaxy/Dominator 6502 - 4 MHz 1.900 +76. Novag Super Expert/Forte A 6502 - 5 MHz 1.898 +77. Fidelity Par Excellence 6502 - 5 MHz 1.895 + Fidelity Phantom 6502 - 5 MHz 1.895 +79. Peri Delta 6502 - 5 MHz 1.891 +80. Conchess Plymate Victoria 6502 - 5,5 MHz 1.885 +81. Novag Expert/Forte B 6502 - 5 MHz 1.880 +82. Novag Expert/Forte A 6502 - 5 MHz 1.872 +83. Mephisto College 6502 - 5 MHz 1.868 +84. Fidelity Kishon Chesster 6502 - 3,6 MHz 1.863 +85. Saitek Leonardo M B 6502 - 6 MHz 1.862 +86. Mephisto Monte Carlo/Supermondial 6502 - 4 MHz 1.860 +87. Mephisto Rebell 6502 - 5 MHz 1.851 +88. Saitek Corona 6502 - 6 MHz 1.850 +89. Fidelity Excel Display 6502 - 3 MHz 1.848 +90. Saitek Leonardo M A 6502 - 6 MHz 1.846 +91. Fidelity Excellence 6502 - 4 MHz 1.845 +92. Novag Constellation Expert 6502 - 4 MHz 1.844 + Saitek Stratos 6502 - 6 MHz 1.844 +94. Saitek Advanced Trainer H8 - 7 MHz 1.837 +95. Conchess Plymate 6502 - 5,5 MHz 1.835 + Fidelity Elegance 6502 - 3,6 MHz 1.835 +97. Peri Gamma 6502 - 3 MHz 1.834 +98. Saitek Simultano 6502 - 5 MHz 1.832 +99. Saitek Renaissance 6502 - 4 MHz 1.816 +100. Fidelity Excellence 6502 - 3 MHz 1.810 +101. Mephisto MM II 6502 - 3,7 MHz 1.809 +102. Conchess Plymate 6502 - 4 MHz 1.806 +103. Saitek Turbostar 432 6502 - 4 MHz 1.803 +104. Mephisto Modena 6502 - 4 MHz 1.800 + Novag Superconstellation 6502 - 4 MHz 1.800 +106. Fidelity Elite Glasgow 6502 - 4 MHz 1.797 +107. Novag Super Nova - Single Chip 1.790 +108. Mephisto Glasgow 68000 1.785 +109. Chessplayer 2150 Atari/Amiga 68000 (PC) 1.784 +110. Fidelity Elite Budapest 6502 - 3,6 MHz 1.772 +111. Saitek Kasparov Blitz/Prisma - Single Chip 1.760 +112. Chessmaster 2100 Amiga 68000 (PC) 1.751 +113. Fidelity Elite A/S 6502 - 3,2 MHz 1.750 +114. Novag Constellation Quattro 6502 - 4 MHz 1.748 +115. Fidelity Prestige 6502 - 4 MHz 1.743 +116. Novag Super Vip - Single Chip 1.742 +117. Mephisto B & P 6502 - 3,7 MHz 1.740 +118. Mephisto Europa 6502 - 3 MHz 1.736 +119. Conchess Glasgow 6502 - 4 MHz 1.735 +120. The Final Chesscard 6502 - 5 MHz (PC) 1.733 +121. Novag Constellation 6502 - 3,6 MHz 1.732 +122. Chess Champion 2175 Atari/Amiga 68000 (PC) 1.712 +123. Fidelity Elite 6502 - 4 MHz 1.710 +124. Novag Constellation Primo - Single Chip 1.703 +125. Chessmaster 2000 Atari 68000 (PC) 1.702 +126. Check-Check AT 80386 (PC) 1.695 +127. Fidelity Playmate-S 6502 - 3,2 MHz 1.690 +128. Conchess Glasgow 6502 - 2 MHz 1.685 +129. Novag Constellation 6502 - 2 MHz 1.677 +130. Mephisto Mondial 6502 - 2 MHz 1.675 +131. Fidelity Sensory 12 6502 - 3 MHz 1.670 +132. Novag Amigo - Single Chip 1.650 +133. Fidelity Sensory Super 9 6502 - 2,5 MHz 1.648 +134. Mephisto Schachschule - Single Chip 1.644 +135. Saitek Cavalier - Single Chip 1.642 +136. Saitek Superstar 6502 - 2 MHz 1.630 +137. Mephisto Excalibur II 68000 1.629 +138. Fidelity Sensory 9 6502 - 2 MHz 1.620 +139. Mephisto Excalibur I 68000 1.608 +140. CXG Sphinx Professor - Single Chip 1.595 +141. CXG Super Enterprise - Single Chip 1.585 +142. Steinitz MGS III 6502 - 2,5 MHz 1.584 +143. Bogol 5.0 ASB 6502 - 3 MHz 1.575 +144. Mephisto Mirage 1806 - 8 MHz 1.562 +145. Morphy MGS III 6502 - 2,5 MHz 1.542 +146. Chess 2001 6502 - 4 MHz 1.540 +147. Mephisto III S ESB 6000 1806 - 6,1 MHz 1.534 +148. Fidelity Champion 6502 - 2 MHz 1.530 +149. Saitek Turbo S 6502 - 3 MHz 1.514 +150. Sandy MGS II 6502 - 2 MHz 1.510 +151. SciSys Mark V 1806 - 2,5 MHz 1.495 +152. Sargon ARB 2.0 / MGS II 1806 - 2 MHz 1.480 +153. Destini MM 6502 2 MHz 1.470 +154. Mephisto III 1806 - 3,5 MHz 1.464 +155. Novag Savant Robot 6502 - 2 MHz 1.462 +156. Regence TSB 4 6502 - 2,5 MHz 1.460 +157. Novag Solo - Single Chip 1.443 +158. CXG Enterprise - Single Chip 1.423 +159. Milton 6502 - 2 MHz 1.420 +160. Saitek Turbo - Single Chip 1.416 +161. Sci Sys President Chess 1806 - 2 MHz 1.414 +162. Mephisto II - 1806 - 3,5 MHz 1.412 +163. Fidelity Sensory Voice - Single Chip 1.394 +164. Fidelity Poppy - Single Chip 1.380 + SciSys Mark III Super System - Single Chip 1.380 +166. Peri Beta - Single Chip 1.376 +167. Novag Savant Royal Z80 1.375 +168. Novag Savant II Z80 1.366 +169. Fidelity Voice Z80 1.359 +170. Mephisto Mobil - Single Chip 1.355 +171. Chess King Master - Single Chip 1.324 +172. Fidelity CC 7 Z80 1.311 +173. Boris Diplomat - Single Chip 1.300 + Fidelity CC 10 Z80 1.300 +175. Mephisto Junior - Single Chip 1.294 +176. Fidelity Sensory 6 - Single Chip 1.275 +177. Novag Savant I Z80 1.273 +178. Mephisto Mini - Single Chip 1.268 +179. Boris 2.5 - Single Chip 1.267 +180. Mephisto I - Single Chip 1.252 +181. CXG Sphinx Granada - Single Chip 1.173 +182. SciSys Mark II - Single Chip 1.090 +183. CXG Sphinx Chesscard - Single Chip 1.087 +184. SciSys Mark I - Single Chip 985 diff --git a/programs/FewBits b/programs/FewBits new file mode 100644 index 0000000..68f0ae5 --- /dev/null +++ b/programs/FewBits @@ -0,0 +1,252 @@ +From: [email protected] (toby robison) +Newsgroups: rec.games.chess +Subject: Notating positions in as few bits as possible +Date: 9 Mar 1993 + + +HOW TO NOTATE CHESS POSITIONS IN THE FEWEST AVERAGE BITS PER POSITION + +This article is Copyright (C) by Toby Robison, Princeton NJ USA 1993. +Please name the author when quoting from it. + +This is a discussion, not a solution to this rather difficult problem. + +Several people provided useful information that I will be quoting below: +- [email protected] (Steven Pigeon) +- [email protected] (J Nievergelt) +- [email protected] (Peter Rainer) + + + +INTRODUCTION: + +The problem here is to come with ways to encode chess positions +that require, on the average, as few bits as possible. We shall +consider legal positions only (illegal positions being less useful +and requiring more bits). + +We are considering idealized solutions. It should not be necessary +to encode or decode a position very fast, and we accept that any +error in the data may make the positions unreadable. + +It turns out that this problem is similar +to general problems of video compression. Consequently we even have +to consider what sorts of positions are intertesting to us -- +the solution could be different if we want to find the best average +result for "every legal position", or for "every typical legal position +that comes up in good games" or in "every typical position of the sorts +that are published (using a diagram or other direct notation, such +as Forsyth) in chess publications". + +I shall not try to decide which is the proper target for this +investigation. Just please bear in mind that the open question will +affect the solutions we consider later. I shall sidestep this issue by +referring to "common" or "likely" positions, without having any idea +what these are. + +Notating a position also requires indicating which player is "to move" +and whether each player can castle (on each side). Strictly speaking we +should also indicate how long since a pawn has moved, whether en passant +captures are currently possible, and what positions +have occurred in the game (so that draws by repetition can be properly +analyzed). However these requirements simply push us back onto the +solutions that represent the position as the entire game, SO I SHALL +IGNORE THESE REQUIREMENTS. Let us just assume that one bit is set aside +to indicate which player is to move, unless the position is a checkmate. + +It is clear that the solution is less than 200 bits per position. +This is quite good considering that there are 64 squares. +Intuitively we have a budget of about 3 bits (8 possibilities) to +tell us what's going on at each square (11 possibilities for the ten +types of pieces and "empty"). + + +Apparently other people have been working on this problem in print. +Peter Rainer sent me this message: + +>Your approach to chess game compression is not new, +>there has been a paper in the ICCA Journal by +>Ingo Althoeffer discribing the idea. +>I think it was in 1991 or 1992. +>Peter Mysliwietz + +See also the information from Nievergelt, below. + +THE INVESTIGATION: + +APPROACH #1: + +Steven Pigeon starts with the number of legal chess positions, which he +says has been claimed to be 10^43 (but he did not check this out). +That value can be stored in 143 bits, so if we simply state an algorithm +for ordering all possible chess positions, we simply record the ordinal +number of the position. + +The drawback of this approach is that it requires +143 bits for ALL positions, but we ought to shoot for a better average than +that. One way to improve the solution is to find an ordering of all positions +such that more common positions come first in the ordering. THEN we use +a method of compressing the ordinal number of a position that favors +lower numbers. It is HIGHLY SPECULATIVE that any such really useful +ordering could be found of course. But if we find an ordering that +morely makes "sensible" positions come before unlikely and bizzarre ones, +we can waste LOTS of bits on the bizzarre and get an average a lot less +than 143 for "common" positions. + +APPROACH #2: + +One basic approach is to record which squares of the board are +occupied (64 bits), and then try to be extremely efficient about how +to say what the pieces in those squares are. For example, we could assume +that following the first 64 bits there is a code to identify the "first" +piece, then the second, and so on, assuming that we will start at A1 and +work, say, across and then up the board. + +Pigeon puts it this way: + +>The trick is to store the board's occupation as an 8x8 bit matrix, +>(1=occupied,0=free) and then list the pieces in order of presence +>in some list, where the codes for the pieces are derived from a +>Huffman adapative coding (since it is exponential coding), and it +>is the upper bound. Less pieces there is, less space it takes. + +>I'd say I should be able to drop it still a few bits, If I can figure +>a way of "discarding" the 8x8 matrix. + +We should note that as the board gets populated, the number of +possibilites for the remaining pieces is reduced, because we are considering +only legal positions. For example, both kings cannot be in check, there can +only be one king of each color, etc. In addition, pawns cannot be on the +first and last ranks; a white bishop at square A1 prevents a white pawn at +B2, etc. + +This approach is terrific for endgame positions even though it +wastes 64 bits on the board. Eight-piece positions will require less than +100 bits. But a position with all 32 pieces threatens to take a lot more +than 143. Consider for example, that we might need 4.5 bits per piece, +or 144 bits plus the 64 for the position. + +However as Pigeon observes above, if we use a code to represent each piece +that requires few bits for LIKELY occurrence of given pieces at each square, +we might do a lot better. + +APPROACH #3: + +This approach is very much like a pure video compression solution. +We divide the board up into smaller regions (such as 2 squares by +2 squares, but it would be better to make a subdivision based on chess +experience). We then use Huffman or some other probability based encoding to +characterize the piece patterns in each subregion. This approach takes advantage +of the fact that (especially in the late middle and endgames), a relatively +small number of piece patterns is common in each region. + +APPROACH #4: + +This is also a video-based compression technique. We encode where the +pices are based on a probabilistic knowledge of where they are likely to be. +(For example, it takes a lot of bits to place a knight on the rim.) +With a few additional bits to characterize the TYPE of position, this +approach might work well. + +APPROACH #5: + +J. Nievergelt sent me this astonishing claim: + +>It should be possible in under 100 bits. If interested, read: + +>J Nievergelt: Information content of chess positions, ACM SIGART Newsletter +>62, 13-14, April 1977. + +>reprinted in: +>Information content of chess positions: Implications for game-specific +>knowledge of chess players, 283-289 in Machine Intelligence 12, (eds. J. E. +>Hayes, D. Michie, E. Tyugu) , Clarendon Press, Oxford, 1991. + +I have not had a chance to check the reference, but I think 100 bits is +incredibly few. In effect, it means specifying the state of each square +in 1.5 bits, or the state of each piece in 3 or 4 bits. + + +IN SUMMARY: + +We have a number of speculative approaches, unless Nievergelt has +really solved the problem. It seems likely that the best solution should +spend a few bits to characterize the position (opening, early middle, +late middle, endgame; open or closed), since different solutions may apply to +each. In particular, for the OPENING the best solution is either to record the +game moves, or else to encode only those differences that make +the position different from the starting one. + +In any case the validity of any solution must be tested against the +type of positions we WANT to encode, and I really think a lot +of experiemntation would be needed (which nobody probably wants to pay for). + +Please keep your comments coming, I will try to summarize... + +-- toby robison (not robinson) + + + + +From: [email protected] (toby robison) +Newsgroups: rec.games.chess +Subject: Notating positions in as few bits as possible +Date: 29 Mar 1993 + +A number of people responded to me regarding the problem of +notating chess positions in as few bits as possible. +The low bidder for REALISTIC positions seems to be J. Nievergelt, +whose solution, and a related game that looks like fun, are discussed below. + +For a solution that includes UNREALISTIC (but legal) positions, +The key question is how many positions there are. +I received several assertions regarding the number of possible chess +positions (roughly 2^143 ?). If one comes up with a method +for ordering all legal positions, then this number of bits can be +used to notate them. + + +TO NOTATE REALISTIC positions, see: + +J Nievergelt: Information content of chess positions, ACM SIGART Newsletter +62, 13-14, April 1977. It is also reprinted in: +Information content of chess positions: Implications for game-specific +knowledge of chess players, 283-289 in Machine Intelligence 12, (eds. J. E. +Hayes, D. Michie, E. Tyugu) , Clarendon Press, Oxford, 1991. + +or correspond with: [email protected] (J Nievergelt) + + +JN's method is based on the observation that realistic positions are a small +fraction of the total possible. To verify this, he presents the following game, +which I encourage others to try (I'm going to try it myself). +Person A looks at a realistic position. Person B cannot see it, and asks +A multiple choice questions. Both A and B are KNOWLEDGABLE chess players. +B tries to figure out the position, using questions that require as few +total bits of answer-information as possible. + +It's obvious that a Y/N question requires one bit to record the answer. +A question with 4 choices requires 2 bits. Two three-way questions +together require slightly more than three bits, and so on. +JN's assertion, based on some experimentation, is that about 70 bits-worth +of answers are reasonable figure out positions. + +NOTE that we assume the questioner and responder can apply chess judgment, +so questions like "does the pawn structure suggest a closed French Defense?" +are acceptable. Even more important, the questioner gets to apply judgment +about what to ask next, depending upon the partial information currently known. + +Now to fully comprehend the solution, imagine a sophisticated program that +both asks and answers the questions, and figures out a position. The position +is recorded as the answers to the questions the program asked. To recreate the +position, we run the same program again and supply the same answer bits. + +The problem of creating this GENERAL program is very difficult. +According to JN, it may be impractical to write a program that gets +anywhere near to the best possible solution. Writing a program that requires +about 100 bits per position might be practical, though! + +The basic assertion looks like fun to test. Can you guess straightforward, +typical positions, in less than 100 bits of answer info? In 70? + +- toby robison (not tony, not robinson) diff --git a/programs/PCratings b/programs/PCratings new file mode 100644 index 0000000..d9b48c8 --- /dev/null +++ b/programs/PCratings @@ -0,0 +1,30 @@ +From: [email protected] (Ralf Stephan) +Newsgroups: rec.games.chess +Subject: Latest ratings for PC programs/cards + + +These are the latest ratings from the Svedish list, the Selective Search/ +News Sheet 41 and the Computer Chess Reports 1/92: (from MUDUL 3/92) +All ratings are USCF. For BCF, subtract 100; for FIDE, subtract 200. + + Processor Svedish CCR SS +-------------------------------------------------- +ChessMachine 512k + Schroeder v.2.1 ARM/16 2422 2435 2448 + The King ARM/16 2410 2416 2422 +MChess 1.1-1.66 486/33 2400 2401 2402 +Zarkov 2.6 486/33 2347 +C'Champion 2175 486/33 2343 +MChess 1.1-1.66 386/25-33 2338 +Grandmaster 486/33 ~2300 +Rexchess 2.30 486/33 2290 2294 2298 +Psion 2 486/33 2294 2294 +Zarkov 2.5 486/33 2277 2283 2289 +Knightstalker 486/33 2239 2260 2280 +Rexchess 2.30 386/25-33 2230 +Chessm. 3000 486/33 2187 2174 2161 +Psion 1 486/33 2140 2140 +Colossus x 486/33 2086 2086 +Chessm. 3000 386/25-33 2083 +Chessm. 2100 486/33 2073 2073 +Final Chesscard 6502 1887 1887 diff --git a/programs/SSDF-RatingList b/programs/SSDF-RatingList new file mode 100644 index 0000000..80e45eb --- /dev/null +++ b/programs/SSDF-RatingList @@ -0,0 +1,994 @@ + THE SSDF RATING LIST 1993-02-28 34065 games played + + Rating +- Games Won Oppo + ------ --- ----- --- ---- + 1 Chess Machine 30-32 MHz Schr�der 3.1 2388 329 27 91% 2013 + 2 Chess Machine 30 MHz King 2.0 aggr 2343 70 140 75% 2152 + 3 Chess Genius 486/50-66 MHz 2301 85 80 64% 2202 + 4 Chess Machine 30 MHz Schr�der 3.0 2281 68 149 76% 2086 + 4 MChess Pro 486/33 MHz 2281 67 133 68% 2148 + 6 Chess Genius 486/33 MHz 2276 69 120 65% 2170 + 7 Mephisto Lyon 68030 36 MHz 2259 59 250 84% 1975 + 8 Mephisto Portorose 68030 36 MHz 2245 47 342 82% 1984 + 8 Mephisto Vancouver 68030 36 MHz 2245 42 346 74% 2060 + 10 MChess Pro 486/50-66 MHz 2233 83 99 73% 2062 + 11 Mephisto RISC 1 MB ARM 2 14 MHz 2232 33 521 73% 2057 + 12 Chess Machine Schr�der 512K ARM2 16MHz 2216 33 528 71% 2057 + 12 Saitek RISC 2500 ARM2 14 MHz 128K 2216 43 299 68% 2082 + 14 Chess Machine The King 512K ARM2 16MHz 2209 45 288 72% 2045 + 15 MChess 1.1-1.71 80486 33 MHz 2198 43 326 74% 2019 + 16 Mephisto Lyon 68020 12 MHz 2155 24 932 71% 1997 + 17 Mephisto Vancouver 68020 12 MHz 2153 30 621 71% 1995 + 18 Mephisto Berlin 68 000 12 MHz 2139 42 335 73% 1966 + 19 M Chess 1.1-1.66 80386 25-33 MHz 2129 37 396 66% 2011 + 19 Fritz 2.0 486/33 MHz 2129 76 95 61% 2049 + 21 Mephisto Portorose 68020 12 MHz 2128 26 816 73% 1955 + 21 Fidelity Elite 68030 32 MHz (vers.9) 2128 44 324 75% 1935 + 23 Mephisto Vancouver 68000 12 MHz 2115 30 612 70% 1971 + 24 Mephisto Lyon 68000 12 MHz 2107 25 806 65% 1997 + 25 Mephisto MM 4 Turbo Kit 6502 16 MHz 2091 46 292 73% 1916 + 26 Mephisto Almeria 68020 12 MHz 2088 47 259 70% 1939 + 27 Fidelity Mach IV 68020 20 MHz 2080 26 760 65% 1972 + 28 Mephisto Portorose 68000 12 MHz 2047 28 667 66% 1929 + 29 Kasparov Brute Force H8 10 MHz 2044 137 40 70% 1896 + 30 Mephisto Polgar 6502 10 MHz 2041 42 283 59% 1978 + 31 Fidelity Elite 68000 x 2 (vers. 5) 2036 49 209 57% 1986 + 32 Rex Chess 2.3 80386 25-33 MHz 2030 64 126 59% 1965 + 33 Mephisto Roma 68020 14 MHz 2029 27 712 65% 1919 + 34 Fritz 1.0 80486 33 MHz 2021 63 128 56% 1980 + 35 Mephisto Dallas 68020 14 MHz 2020 34 492 72% 1858 + 36 Mephisto Almeria 68000 12 MHz 2019 32 534 67% 1896 + 37 Zarkov 2.5 80386 25-33 MHz 2018 56 168 61% 1939 + 38 Fritz 1.0 80386 25-33 MHz 2009 67 113 46% 2041 + 39 Novag Diablo 68000 16 MHz 2001 26 713 54% 1973 + 40 Fidelity Mach III 68000 16 MHz 1997 15 2049 56% 1957 + 41 Mephisto MM 5 6502 5 MHz 1979 22 967 54% 1947 + 42 Mephisto Polgar 6502 5 MHz 1971 19 1314 47% 1992 + 42 Mephisto Dallas 68000 12 MHz 1971 21 1074 63% 1876 + 44 Mephisto Roma 68000 12 MHz 1967 18 1452 57% 1920 + 45 Zarkov 2.6 386/25-33 MHz 1966 105 55 64% 1867 + 46 Mephisto Milano 6502 5 MHz 1955 31 490 48% 1972 + 47 Novag Super Expert C 6502 6 MHz Sel 5 1954 19 1242 50% 1956 + 48 Mephisto Academy 6502 5 MHz 1940 20 1193 48% 1956 + 49 Rex Chess 2.3 80386 16-20 MHz 1928 53 174 49% 1934 + 50 Saitek Leonardo Maestro B 6502 18 MHz 1925 72 105 62% 1839 + 51 Mephisto Amsterdam 68000 12 MHz 1924 22 1020 58% 1870 + 52 Mephisto Mega IV 6502 4.9 MHz 1916 18 1354 48% 1934 + 53 Fidelity Excel Mach IIc 68000 12 MHz 1915 23 913 52% 1904 + 54 Saitek Maestro D 6502 10 MHz 1914 25 730 51% 1905 + 55 Novag Expert Turbo Kit 6502 16 MHz 1906 67 120 61% 1825 + 56 Novag Super Expert B 6502 6 MHz sel 4 1904 32 468 51% 1896 + 56 Kasparov GK-2000 H8 10 MHz 1904 48 223 42% 1960 + 58 Fidelity Travel Master H8/330 10 MHz 1902 79 123 22% 2117 + 59 Mephisto MM 4 6502 5 MHz 1901 19 1268 50% 1898 + 60 Chessmaster 3000 386/25-33 MHz 1900 101 59 36% 2005 + 61 Mephisto Modena 6502 4 MHz 1886 41 305 41% 1951 + 62 Psion Atari 68000 8 MHz 1880 18 1463 44% 1924 + 63 CXG Sphinx Galaxy 6502 4 MHz 1875 19 1293 41% 1943 + 63 Fidelity Excel Mach IIa 68000 12 MHz 1875 46 226 47% 1895 + 65 Saitek Turboking II 6502 5 MHz 1872 25 752 41% 1937 + 66 Conchess Plymate Victoria 6502 5.5 MHz 1862 27 657 40% 1931 + 67 Fidelity Excel Club 68000 12 MHz 1854 22 931 51% 1845 + 68 Mephisto Mega IV Brute Force 1840 45 240 50% 1837 + 69 Fidelity Avant Garde 6502 5 MHz 1832 20 1196 46% 1863 + 70 Novag Super Expert/Forte A 6502 5 MHz 1831 21 1118 41% 1895 + 71 Fidelity Par Excellence 6502 5 MHz 1829 23 912 51% 1825 + 72 Mephisto Rebell 6502 5 MHz 1821 20 1233 40% 1891 + 73 Saitek Stratos/Analys B 6502 6 MHz 1817 20 1213 38% 1905 + 74 Novag Forte B 6502 5 MHz 1813 24 837 44% 1857 + 75 Mephisto Super Mondial 6502 4 MHz 1812 20 1205 39% 1894 + 75 Conchess Glasgow 6 MHz 1812 158 41 78% 1593 + 77 Conchess Plymate 6502 5.5 MHz 1808 16 1920 41% 1870 + 78 Saitek Leonardo Maestro A 6502 6 MHz 1807 30 547 45% 1842 + 79 Novag Forte A 6502 5 MHz 1806 22 939 49% 1814 + 79 Saitek Simultano/Corona C 6502 5 MHz 1806 24 927 33% 1929 + 81 Fidelity Excellence 6502 4 MHz 1798 17 1565 43% 1849 + 82 Novag Expert 6502 4 MHz 1784 24 812 43% 1837 + 83 Conchess Plymate 6502 4 MHz 1775 38 343 55% 1739 + 84 Mephisto MM 2 6502 3.7 MHz 1769 48 208 52% 1752 + 85 Fidelity Elegance 6502 3.6 MHz 1761 39 339 61% 1685 + 86 Saitek Turbostar 432 6502 4 MHz 1759 21 1034 46% 1789 + 87 Fidelity Excellence 6502 3 MHz 1753 22 962 42% 1811 + 88 Saitek Kasparov Blitz 1736 50 202 41% 1798 + 89 Novag Super Nova 1732 38 350 40% 1801 + 90 Novag Super Constellation 6502 4 MHz 1728 17 1695 39% 1807 + 91 Conchess Glasgow 6502 4 MHz 1712 37 342 50% 1713 + 92 Chessplayer 2150 Atari/Amiga 1709 67 126 34% 1828 + 93 Mephisto B&P 6502 3.7 MHz 1700 85 78 38% 1787 + 94 The Final Chesscard 6502 5 MHz 1695 65 149 28% 1861 + 95 Mephisto Europa 1685 54 170 45% 1721 + 96 Novag Super VIP 1684 58 174 32% 1812 + 97 Fidelity Elite A/S 6502 3.2 MHz 1677 21 1149 38% 1762 + 98 Chessmaster 2100 Amiga 68000 1676 85 100 25% 1871 + 99 Saitek Superstar 36K 6502 2 MHz 1675 24 958 31% 1814 + 100 Chess Champion 2175 Atari/Amiga 1670 62 157 30% 1818 + 100 Mephisto Exclusive S 1670 80 81 44% 1709 + 102 Fidelity Prestige 6502 4 MHz 1665 40 341 66% 1545 + 103 Conchess Glasgow 6502 2 MHz 1663 24 863 35% 1775 + 104 Novag Quattro 6502 4 MHz 1659 31 560 33% 1786 + 105 Chessmaster 2000 Atari 68000 8 MHz 1651 45 312 25% 1838 + 106 Novag Constellation 6502 3.6 MHz 1644 28 596 46% 1674 + 107 Novag Constellation Primo 1634 58 149 44% 1679 + 108 Fidelity Elite -81 1604 63 151 69% 1468 + 109 Novag Constellation 6502 2 MHz 1596 23 865 50% 1599 + 110 Sargon III 1 MHz 1590 148 27 44% 1630 + 111 Mephisto Mondial 1581 71 100 46% 1609 + 112 CXG Super Enterprise 1561 37 410 31% 1700 + 113 Fidelity Sensory 9 B 1553 87 68 54% 1527 + 114 Fidelity Sensory 9 A 1494 30 511 50% 1495 + 115 Steinitz 1480 39 324 45% 1516 + 116 Mephisto III Modular 1471 53 189 38% 1557 + 117 Mephisto II 6.1 MHz 1470 33 450 46% 1499 + 118 Saitek Turbo 16K 1463 85 90 29% 1616 + 119 Chess 2001 1462 73 101 40% 1536 + 120 Scisys Superstar 1454 55 179 35% 1561 + 121 Mephisto III 6.1 MHz 1452 56 194 29% 1608 + 122 Saitek Turbo S 24K 1431 89 95 24% 1628 + 123 Conchess -82 2 MHz 1408 41 299 41% 1469 + 124 GMC 1385 40 306 44% 1427 + 125 Mephisto II 3.5 MHz 1380 39 306 49% 1388 + 126 Champion Sensory Challenger 1379 38 336 48% 1395 + 127 Mark VI 1375 62 163 28% 1538 + 128 Mark V 1352 38 353 40% 1425 + 129 Morphy 1334 48 220 41% 1399 + 130 Progidy 1266 205 28 23% 1473 + 131 Enterprise S 1182 139 46 24% 1383 + 132 Boris 2.5 1171 97 75 27% 1348 + + + 1 Chess Machine 30-32 MHz Schr�der 3.1, 2388 +Ch.Gen 486/50 1-0 MChPro 486/33 1-0 Chess M. King 0.5-0.5 +Mach III 9-2 Polgar 5 MHz 13-0 + + 2 Chess Machine 30 MHz King 2.0 aggr, 2343 +Ch.Gen 486/50 3-1 MChPro 486/33 11-9 Ch.Gen 486/33 13.5-6.5 +MChPro 486/50 1.5-1.5 Meph. RISC 13.5-6.5 RISC 2500 7.5-2.5 +Vancou. 68000 2.5-1.5 Lyon 68000 8-3 Roma 68020 18.5-1.5 +Mach III 6-0 Meph. MM 5 2-0 Polgar 5 MHz 18-2 + + 3 Chess Genius 486/50-66 MHz, 2301 +CM30 Schr 3.0 0.5-0.5 Vancou. 68030 12-8 Chess M Schr� 20.5-9.5 +Chess M. King 8.5-5.5 Diablo 68000 3.5-1.5 Polgar 5 MHz 5-0 + + 4 Chess Machine 30 MHz Schr�der 3.0, 2281 +Meph. RISC 11-9 RISC 2500 1.5-2.5 M Chess 486 1-0 +Vancou. 68020 11.5-8.5 Vancou. 68000 17.5-2.5 Lyon 68000 15-5 +Roma 68020 4-1 Diablo 68000 16-4 Mach III 10.5-0.5 +Meph. MM 5 6.5-0.5 Polgar 5 MHz 17.5-2.5 + + 5 MChess Pro 486/33 MHz, 2281 +Ch.Gen 486/33 10-9 RISC 2500 6-4 Lyon 68020 8-2 +Vancou. 68020 7-4 Vancou. 68000 14.5-5.5 Lyon 68000 1-1 +Mach III 17-3 Polgar 5 MHz 18-2 + + 6 Chess Genius 486/33 MHz, 2276 +Meph. RISC 11-8 RISC 2500 12.5-7.5 Lyon 68020 0-1 +Lyon 68000 1-0 Mach III 18.5-1.5 Polgar 5 MHz 19-1 + + 7 Mephisto Lyon 68030 36 MHz, 2259 +Chess M Schr� 1.5-1.5 M Chess 486 4.5-2.5 Lyon 68020 13.5-6.5 +Lyon 68000 14-6 Mach III 18-2 Meph. MM 5 16.5-3.5 +Polgar 5 MHz 15.5-4.5 Roma 68000 17-3 Super Exp. C 16.5-3.5 +Academy 5 MHz 16.5-3.5 Meph. Mega IV 20-0 Psion Atari 19-1 +Turboking II 18.5-1.5 Plym Victoria 19.5-0.5 + + 8 Mephisto Portorose 68030 36 MHz, 2245 +Portor. 68020 12.5-7.5 Elite 68030 14.5-5.5 Almeria 68020 14-6 +Portor. 68000 14-6 Elite vers.5 14-6 Almeria 68000 16-4 +Mach III 17.5-2.5 Polgar 5 MHz 15.5-4.5 Dallas 68000 19.5-0.5 +Roma 68000 19-1 Super Exp. C 13-7 Academy 5 MHz 17-3 +Amsterdam 19.5-0.5 Meph. Mega IV 17.5-3.5 Maestro D 10 20-0 +Psion Atari 19-1 Sphinx Galaxy 17.5-2.5 Rebell 5 MHz 1-0 + + 9 Mephisto Vancouver 68030 36 MHz, 2245 +MChPro 486/50 1.5-0.5 Meph. RISC 11.5-8.5 Chess M Schr� 11-9 +Chess M. King 10-10 M Chess 486 11-9 Vancou. 68020 16-4 +Vancou. 68000 13.5-6.5 Lyon 68000 13-7 Diablo 68000 15.5-4.5 +Meph. MM 5 18.5-1.5 Polgar 5 MHz 16.5-3.5 Dallas 68000 18.5-1.5 +Roma 68000 18-2 Meph. Milano 15.5-4.5 Meph. Mega IV 17.5-2.5 +Psion Atari 19.5-0.5 Sphinx Galaxy 18.5-1.5 Turboking II 4-0 + + 10 MChess Pro 486/50-66 MHz, 2233 +Chess M Schr� 5-7 Chess M. King 2-2 Fritz2 486/33 13.5-6.5 +Vancou. 68000 15-5 Meph. Mega IV 18.5-1.5 Super Exp. B 7.5-0.5 +Psion Atari 8.5-1.5 + + 11 Mephisto RISC 1 MB ARM 2 14 MHz, 2232 +Chess M Schr� 10.5-9.5 Chess M. King 11-9 M Chess 486 11-10 +Lyon 68020 11-9 Vancou. 68020 14-6 Berlin 68 000 12-8 +Portor. 68020 13.5-6.5 Vancou. 68000 12-8 Diablo 68000 17.5-2.5 +Mach III 18.5-1.5 Meph. MM 5 17.5-2.5 Polgar 5 MHz 18-2 +Dallas 68000 10.5-0.5 Meph. Milano 17.5-2.5 Super Exp. C 17-3 +Academy 5 MHz 17.5-2.5 Meph. Mega IV 19-1 Kasp. GK-2000 10-0 +Mephisto MM 4 18-2 Meph. Modena 18-2 Psion Atari 18.5-1.5 +Sphinx Galaxy 18-2 Turboking II 18.5-1.5 + + 12 Chess Machine Schr�der 512K ARM2 16MHz, 2216 +Chess M. King 2-0 M Chess 486 7-7 Lyon 68020 32.5-27.5 +M Chess 386 26-13 Portor. 68020 0.5-0.5 Vancou. 68000 5-2 +Lyon 68000 31.5-14.5 Rex 2.3 33MHz 1.5-0.5 Zark25 386/33 1.5-0.5 +Fritz1 386/33 1.5-0.5 Diablo 68000 18-2 Mach III 35.5-6.5 +Polgar 5 MHz 22-3 Roma 68000 17.5-7.5 Zark26 386/25 2-0 +Super Exp. C 25.5-4.5 Academy 5 MHz 16-4 Amsterdam 20-0 +Meph. Mega IV 9-1 Super Exp. B 14.5-5.5 Psion Atari 3-0 +Sphinx Galaxy 29.5-1.5 Turboking II 19-1 + + 13 Saitek RISC 2500 ARM2 14 MHz 128K, 2216 +M Chess 486 4-0 Vancou. 68020 35.5-24.5 Fritz2 486/33 13.5-6.5 +Vancou. 68000 12-8 Mach IV 68020 28.5-11.5 Fritz1 486/33 12-4 +Mach III 14.5-5.5 Meph. Milano 18-2 Super Exp. C 1.5-1.5 +Kasp. GK-2000 20-0 Travel Master 18-2 Sphinx Galaxy 6-1 +Turboking II 4-1 + + 14 Chess Machine The King 512K ARM2 16MHz, 2209 +M Chess 486 8-3 Lyon 68020 3-2 Vancou. 68020 11-8 +Vancou. 68000 0.5-4.5 Lyon 68000 16.5-7.5 Diablo 68000 21.5-2.5 +Mach III 16.5-3.5 Meph. MM 5 1.5-0.5 Super Exp. C 17-3 +Academy 5 MHz 14-6 Meph. Mega IV 9-1 Psion Atari 23.5-2.5 +Sphinx Galaxy 18.5-1.5 Turboking II 19.5-1.5 + + 15 MChess 1.1-1.71 80486 33 MHz, 2198 +Lyon 68020 9.5-6.5 Vancou. 68020 3-3 Lyon 68000 1.5-1.5 +Portor. 68000 5-0 Roma 68020 7.5-0.5 Polgar 5 MHz 33-7 +Roma 68000 16.5-3.5 Super Exp. C 17.5-2.5 Academy 5 MHz 17-3 +Amsterdam 19-1 Meph. Mega IV 10-0 Travel Master 16.5-3.5 +Psion Atari 17.5-2.5 Sphinx Galaxy 16.5-3.5 Turboking II 18.5-1.5 + + 16 Mephisto Lyon 68020 12 MHz, 2155, (2217 vs humans, 12 games) +Berlin 68 000 9.5-10.5 M Chess 386 41-33 Lyon 68000 10-10 +Mach IV 68020 22.5-17.5 Portor. 68000 12.5-7.5 Polgar 10 MHz 20-10 +Rex 2.3 33MHz 14.5-5.5 Fritz1 486/33 14-6 Zark25 386/33 14-6 +Fritz1 386/33 14-6 Diablo 68000 13-7 Mach III 19-8 +Meph. MM 5 13.5-6.5 Polgar 5 MHz 18-3 Roma 68000 15-5 +Meph. Milano 16-4 Super Exp. C 17-3 Academy 5 MHz 13-7 +Rex 2.3 20MHz 1.5-0.5 Meph. Mega IV 17-3 Excel Mach 2c 31.5-4.5 +Super Exp. B 7.5-2.5 Mephisto MM 4 18.5-1.5 CM3000 386/33 18.5-1.5 +Meph. Modena 17-3 Psion Atari 18-2 Sphinx Galaxy 15-5 +Turboking II 18-2 Plym Victoria 19.5-1.5 Super Exp. A 17.5-2.5 +Rebell 5 MHz 19-1 Stratos 6 MHz 18.5-1.5 Super Mondial 19.5-0.5 +Plymate 5.5 20-0 Simultano C 19-1 Excellence 4 17-2 + + 17 Mephisto Vancouver 68020 12 MHz, 2153 +Berlin 68 000 10.5-10.5 Mach IV 68020 24.5-8.5 Fritz1 386/33 4-1 +Diablo 68000 16.5-3.5 Mach III 2.5-2.5 Meph. MM 5 14.5-5.5 +Polgar 5 MHz 17-4 Meph. Milano 19.5-0.5 Super Exp. C 14.5-5.5 +Academy 5 MHz 18-2 Meph. Mega IV 17-3 Travel Master 17-3 +Mephisto MM 4 16.5-3.5 Meph. Modena 16-4 Psion Atari 17-3 +Sphinx Galaxy 17.5-2.5 Turboking II 17-3 Plym Victoria 17-3 +Super Exp. A 17-3 Rebell 5 MHz 17-3 Stratos 6 MHz 17-3 +Super Mondial 17.5-2.5 Plymate 5.5 20-0 Simultano C 19-1 + + 18 Mephisto Berlin 68 000 12 MHz, 2139 +Portor. 68020 10.5-9.5 Diablo 68000 14.5-5.5 Mach III 6.5-0.5 +Meph. MM 5 16-4 Roma 68000 4-1 Meph. Milano 17-3 +Super Exp. C 27-8 Meph. Mega IV 16-4 Kasp. GK-2000 13-7 +Meph. Modena 16.5-3.5 Plym Victoria 14-2 Mega IV BF 8-0 +Super Mondial 16.5-3.5 Plymate 5.5 17-3 Simultano C 19-4 + + 19 M Chess 1.1-1.66 80386 25-33 MHz, 2129 +Portor. 68020 7.5-5.5 Lyon 68000 29-22 Rex 2.3 33MHz 7.5-2.5 +Zark25 386/33 2.5-1.5 Mach III 1.5-0.5 Meph. MM 5 16.5-10.5 +Polgar 5 MHz 30-7 Academy 5 MHz 15.5-4.5 CM3000 386/33 2-2 +Sphinx Galaxy 20-2 Plym Victoria 22-4 Rebell 5 MHz 3.5-0.5 +Plymate 5.5 12-0 Maestro A 6 5-0 Simultano C 35.5-4.5 +Expert 4 MHz 6-0 + + 20 Fritz 2.0 486/33 MHz, 2129 +Diablo 68000 16-4 Polgar 5 MHz 7-3 Academy 5 MHz 4-1 +Stratos 6 MHz 18-2 + + 21 Mephisto Portorose 68020 12 MHz, 2128, (2181 vs humans, 10 games) +Elite 68030 9.5-14.5 Lyon 68000 10-10 MM 4 Turbo 16 9.5-1.5 +Mach IV 68020 23-17 Portor. 68000 12.5-7.5 Polgar 10 MHz 12.5-7.5 +Roma 68020 2-0 Almeria 68000 13.5-6.5 Mach III 31.5-16.5 +Meph. MM 5 12-8 Polgar 5 MHz 20.5-4.5 Dallas 68000 3.5-0.5 +Roma 68000 18-2 Meph. Milano 15-5 Super Exp. C 33-11 +Academy 5 MHz 12-8 Meph. Mega IV 14.5-5.5 Excel Mach 2c 26.5-5.5 +Maestro D 10 15-6 Super Exp. B 7.5-2.5 Mephisto MM 4 17-3 +Meph. Modena 18-2 Psion Atari 15-5 Sphinx Galaxy 17-3 +Turboking II 17.5-2.5 Plym Victoria 17-3 Avant Garde 19-1 +Super Exp. A 19-1 Rebell 5 MHz 19-1 Stratos 6 MHz 19.5-0.5 +Super Mondial 20.5-4.5 Plymate 5.5 19-1 Simultano C 15-5 +Excellence 4 17-3 Expert 4 MHz 15-1 + + 22 Fidelity Elite 68030 32 MHz (vers.9), 2128 +Portor. 68000 12.5-7.5 Mach III 15-6 Polgar 5 MHz 16.5-3.5 +Super Exp. C 12-8 Academy 5 MHz 13-7 Meph. Mega IV 16.5-3.5 +Maestro D 10 17-3 Psion Atari 17-3 Sphinx Galaxy 17.5-2.5 +Super Exp. A 16-4 Rebell 5 MHz 16-3 Super Mondial 19.5-0.5 +Simultano C 16.5-3.5 Excellence 4 18.5-1.5 + + 23 Mephisto Vancouver 68000 12 MHz, 2115 +Fritz1 386/33 16-4 Diablo 68000 11-9 Mach III 26-15 +Meph. MM 5 29.5-10.5 Meph. Milano 16-4 Super Exp. C 13.5-6.5 +Academy 5 MHz 15.5-4.5 Meph. Mega IV 16.5-3.5 Excel Mach 2c 18-2 +CM3000 386/33 9-4 Psion Atari 14-6 Sphinx Galaxy 17-3 +Turboking II 18-2 Plym Victoria 16-4 Super Exp. A 18-2 +Rebell 5 MHz 16.5-3.5 Stratos 6 MHz 15-5 Super Mondial 17.5-2.5 +Plymate 5.5 19-1 Simultano C 20-0 Excellence 4 19.5-0.5 +Super Const. 18.5-1.5 Meph. Europa 2-0 + + 24 Mephisto Lyon 68000 12 MHz, 2107 +Mach IV 68020 22.5-17.5 Rex 2.3 33MHz 1-0 Fritz1 386/33 6-4 +Diablo 68000 22.5-11.5 Mach III 32.5-6.5 Meph. MM 5 25.5-15.5 +Polgar 5 MHz 16-4 Roma 68000 15-5 Super Exp. C 28-9 +Academy 5 MHz 16.5-3.5 Meph. Mega IV 17-3 Kasp. GK-2000 2-0 +Travel Master 16.5-3.5 Mephisto MM 4 14-6 Psion Atari 17.5-6.5 +Sphinx Galaxy 14-6 Turboking II 17.5-2.5 Plym Victoria 18-2 +Super Exp. A 15.5-4.5 Rebell 5 MHz 16.5-3.5 Stratos 6 MHz 16.5-3.5 +Super Mondial 16.5-3.5 Plymate 5.5 19.5-0.5 Simultano C 17-3 +Excellence 4 17.5-2.5 Super Const. 17-3 + + 25 Mephisto MM 4 Turbo Kit 6502 16 MHz, 2091, (2122 vs humans, 9 games) +Mach IV 68020 16.5-14.5 Roma 68020 7.5-12.5 Mach III 13.5-6.5 +Dallas 68000 21.5-12.5 Roma 68000 14.5-5.5 Amsterdam 1-0 +Excel Mach 2c 4-0 Mephisto MM 4 1-0 Excel Mach 2a 16.5-3.5 +Excel Club 7-2 Super Exp. A 19.5-0.5 Stratos 6 MHz 18.5-1.5 +Forte B 18.5-1.5 Super Mondial 18.5-1.5 Plymate 5.5 16.5-4.5 +Excellence 4 17.5-2.5 + + 26 Mephisto Almeria 68020 12 MHz, 2088, (2030 vs humans, 26 games) +Mach IV 68020 13.5-14.5 Portor. 68000 5.5-6.5 Roma 68020 11.5-8.5 +Almeria 68000 3.5-2.5 Mach III 13-8 Roma 68000 3.5-2.5 +Academy 5 MHz 17.5-2.5 Maestro D 10 2-0 Mephisto MM 4 12.5-7.5 +Psion Atari 17.5-2.5 Sphinx Galaxy 3.5-0.5 Avant Garde 18-2 +Stratos 6 MHz 16.5-3.5 Simultano C 18.5-1.5 Superstar 36K 19-1 + + 27 Fidelity Mach IV 68020 20 MHz, 2080, (2177 vs humans, 19 games) +Roma 68020 24-13 Dallas 68020 13.5-6.5 Almeria 68000 11-9 +Mach III 4-4 Polgar 5 MHz 11.5-8.5 Dallas 68000 7.5-4.5 +Roma 68000 6.5-3.5 Super Exp. C 13-6 Academy 5 MHz 13.5-2.5 +Meph. Mega IV 16.5-3.5 Excel Mach 2c 13-2 Super Exp. B 9.5-2.5 +Travel Master 15-5 Mephisto MM 4 36-11 Psion Atari 17-3 +Sphinx Galaxy 16.5-5.5 Avant Garde 19-1 Par Excell. 15-5 +Rebell 5 MHz 17-6 Stratos 6 MHz 23.5-2.5 Super Mondial 15-2 +Plymate 5.5 36-8 Excellence 4 18.5-1.5 Superstar 36K 20-0 + + 28 Mephisto Portorose 68000 12 MHz, 2047 +Elite vers.5 19-15 Roma 68020 10-10 Mach III 15-10 +Meph. MM 5 11-9 Polgar 5 MHz 16-9 Dallas 68000 14-6 +Super Exp. C 21-8 Academy 5 MHz 20-14 Rex 2.3 20MHz 10.5-9.5 +Meph. Mega IV 14.5-5.5 Maestro D 10 18-9 Super Exp. B 13.5-6.5 +Mephisto MM 4 16-4 Psion Atari 21.5-7.5 Sphinx Galaxy 15-5 +Turboking II 17.5-1.5 Super Exp. A 17-3 Rebell 5 MHz 17.5-2.5 +Stratos 6 MHz 17-3 Super Mondial 14-6 Plymate 5.5 16.5-7.5 +Simultano C 16.5-3.5 Excellence 4 19-1 Super Const. 3-1 +Super VIP 15.5-4.5 Elite A/S 3.2 18-2 + + 29 Kasparov Brute Force H8 10 MHz, 2044 +Meph. MM 5 9.5-2.5 Excel Mach 2c 13-7 Super Const. 5.5-2.5 + + 30 Mephisto Polgar 6502 10 MHz, 2041 +Elite vers.5 13-9 Mach III 21-23 Dallas 68000 14-3 +Roma 68000 14-6 Super Exp. C 15-16 Amsterdam 13-7 +Excel Mach 2c 15-5 Maestro D 10 13-5 Psion Atari 14-6 +Avant Garde 0.5-0.5 Plymate 5.5 16.5-3.5 + + 31 Fidelity Elite 68000 x 2 (vers. 5), 2036 +Almeria 68000 5-5 Dallas 68000 12.5-7.5 Roma 68000 11-9 +Academy 5 MHz 12.5-7.5 Maestro D 10 16-6 Psion Atari 13.5-6.5 +Avant Garde 18.5-2.5 + + 32 Rex Chess 2.3 80386 25-33 MHz, 2030 +Zark25 386/33 0.5-1.5 Mach III 6.5-5.5 Meph. MM 5 1-1 +Polgar 5 MHz 13.5-6.5 Roma 68000 7.5-2.5 Academy 5 MHz 12-8 +Turbostar 432 7-0 Super Const. 18-2 + + 33 Mephisto Roma 68020 14 MHz, 2029, (1979 vs humans, 9 games) +Fritz1 486/33 0-2 Almeria 68000 11-9 Mach III 20.5-19.5 +Dallas 68000 13.5-6.5 Roma 68000 10.5-9.5 Academy 5 MHz 15-6 +Rex 2.3 20MHz 24-5 Amsterdam 11.5-8.5 Meph. Mega IV 14-6 +Excel Mach 2c 26.5-23.5 Maestro D 10 11-9 Mephisto MM 4 14.5-5.5 +Psion Atari 5-1 Sphinx Galaxy 16.5-3.5 Excel Club 16.5-3.5 +Avant Garde 15.5-4.5 Super Exp. A 14.5-5.5 Rebell 5 MHz 9.5-2.5 +Stratos 6 MHz 18-2 Forte B 13.5-6.5 Super Mondial 16.5-3.5 +Plymate 5.5 17.5-2.5 Maestro A 6 15-5 Excellence 4 17.5-2.5 +Expert 4 MHz 14.5-5.5 Excellence 3 17.5-2.5 Super Const. 19-1 +Elite A/S 3.2 18.5-1.5 + + 34 Fritz 1.0 80486 33 MHz, 2021 +Super Exp. C 9.5-10.5 Academy 5 MHz 12-8 Meph. Mega IV 7-3 +Sphinx Galaxy 16.5-3.5 Stratos 6 MHz 14.5-5.5 + + 35 Mephisto Dallas 68020 14 MHz, 2020 +Mach III 10.5-9.5 Dallas 68000 13-7 Super Exp. C 1-2 +Amsterdam 26.5-13.5 Meph. Mega IV 12-8 Excel Mach 2c 15-9 +Mephisto MM 4 14.5-5.5 Excel Mach 2a 14-6 Excel Club 21-8 +Avant Garde 23-8 Par Excell. 16.5-3.5 Rebell 5 MHz 15-5 +Forte B 15.5-4.5 Super Mondial 19-4 Plymate 5.5 17.5-2.5 +Maestro A 6 16.5-4.5 Forte A 16.5-7.5 Excellence 4 16.5-3.5 +Expert 4 MHz 20-6 Turbostar 432 14-6 Excellence 3 28.5-2.5 + + 36 Mephisto Almeria 68000 12 MHz, 2019 +Mach III 21.5-13.5 Polgar 5 MHz 10.5-9.5 Dallas 68000 10.5-9.5 +Roma 68000 10.5-5.5 Academy 5 MHz 11-9 Amsterdam 12-8 +Meph. Mega IV 13-11 Mephisto MM 4 9-2 Psion Atari 20.5-6.5 +Sphinx Galaxy 11.5-5.5 Super Exp. A 14.5-5.5 Par Excell. 8.5-1.5 +Rebell 5 MHz 15.5-4.5 Stratos 6 MHz 20.5-6.5 Plymate 5.5 16.5-3.5 +Simultano C 16.5-3.5 Excellence 4 18.5-1.5 Excellence 3 18-2 +Super Const. 17.5-2.5 Elite A/S 3.2 17.5-2.5 Superstar 36K 20.5-3.5 +Conchess 2MHz 6.5-0.5 + + 37 Zarkov 2.5 80386 25-33 MHz, 2018 +Mach III 12-7 Meph. MM 5 7-5 Polgar 5 MHz 3.5-2.5 +Super Exp. C 6.5-7.5 Academy 5 MHz 10.5-9.5 Super Exp. B 8-2 +Sphinx Galaxy 15.5-4.5 Plym Victoria 4-2 Plymate 5.5 3.5-0.5 +Maestro A 6 9-5 Expert 4 MHz 4-0 Super Const. 1-0 +Chesscard 5 8.5-1.5 + + 38 Fritz 1.0 80386 25-33 MHz, 2009 +Mach III 11.5-8.5 Meph. MM 5 3-1 Polgar 5 MHz 1.5-1.5 +Super Exp. C 6.5-5.5 CM3000 386/33 1.5-0.5 Turboking II 4-1 +Plym Victoria 8-2 + + 39 Novag Diablo 68000 16 MHz, 2001, (1975 vs humans, 9 games) +Mach III 10-10 Meph. MM 5 10-10 Polgar 5 MHz 12.5-7.5 +Roma 68000 11.5-8.5 Meph. Milano 10-10 Super Exp. C 15-5 +Academy 5 MHz 12.5-7.5 Meph. Mega IV 12-8 Kasp. GK-2000 14.5-5.5 +Mephisto MM 4 12-8 Psion Atari 15-9 Sphinx Galaxy 15-7 +Turboking II 15.5-4.5 Plym Victoria 13.5-6.5 Super Exp. A 14.5-5.5 +Rebell 5 MHz 15.5-4.5 Stratos 6 MHz 15-5 Super Mondial 14.5-5.5 +Plymate 5.5 16.5-3.5 Simultano C 15-5 Excellence 4 4-0 +Kasp. Blitz 16.5-3.5 Elite A/S 3.2 18.5-1.5 Superstar 36K 19-1 + + 40 Fidelity Mach III 68000 16 MHz, 1997, (2067 vs humans, 25 games) +Meph. MM 5 13.5-11.5 Polgar 5 MHz 60.5-51.5 Dallas 68000 11-9 +Roma 68000 131.5-90.5 Super Exp. C 40-37 Academy 5 MHz 22.5-14.5 +Rex 2.3 20MHz 5-1 Amsterdam 4-3 Meph. Mega IV 23-19 +Excel Mach 2c 23-12 Maestro D 10 21.5-14.5 Super Exp. B 10-8 +Travel Master 2-1 Mephisto MM 4 22-16 Psion Atari 27.5-11.5 +Sphinx Galaxy 18-16 Turboking II 19.5-7.5 Plym Victoria 14-6 +Excel Club 15.5-4.5 Mega IV BF 16.5-3.5 Avant Garde 17.5-3.5 +Super Exp. A 15-5 Par Excell. 29.5-8.5 Rebell 5 MHz 26.5-6.5 +Stratos 6 MHz 31.5-4.5 Forte B 19.5-5.5 Super Mondial 18-3 +Plymate 5.5 34-8 Maestro A 6 2.5-1.5 Forte A 15-5 +Simultano C 18-4 Excellence 4 28-6 Expert 4 MHz 15.5-4.5 +Excellence 3 17-3 Super Nova 18-3 Super Const. 48-11 +Chesspl. 2150 6-0 Meph. Europa 1.5-1.5 Elite A/S 3.2 18.5-1.5 +Cmaster 2100 16-4 Superstar 36K 16.5-3.5 Champion 2175 1-1 +Conchess 2MHz 18.5-1.5 + + 41 Mephisto MM 5 6502 5 MHz, 1979, (1757 vs humans, 6 games) +Polgar 5 MHz 34-34 Roma 68000 11-9 Meph. Milano 10.5-9.5 +Super Exp. C 12.5-7.5 Academy 5 MHz 11-9 Meph. Mega IV 13-7 +Mephisto MM 4 12.5-7.5 Meph. Modena 13.5-6.5 Psion Atari 13.5-6.5 +Sphinx Galaxy 27.5-14.5 Turboking II 14-6 Plym Victoria 16-4 +Excel Club 8-4 Avant Garde 15.5-4.5 Super Exp. A 15-5 +Rebell 5 MHz 14.5-5.5 Stratos 6 MHz 20.5-7.5 Super Mondial 15.5-5.5 +Plymate 5.5 27-15 Simultano C 15.5-4.5 Excellence 4 17-3 +Super Const. 17.5-2.5 Elite A/S 3.2 14.5-5.5 Superstar 36K 17-3 +Conchess 2MHz 14.5-5.5 Cmaster 2000 16.5-3.5 + + 42 Mephisto Polgar 6502 5 MHz, 1971 +Dallas 68000 9-11 Roma 68000 8-14 Meph. Milano 10-10 +Super Exp. C 9.5-10.5 Academy 5 MHz 11.5-10.5 Rex 2.3 20MHz 5.5-6.5 +Amsterdam 4.5-4.5 Meph. Mega IV 14.5-5.5 Maestro D 10 22.5-17.5 +Super Exp. B 10-10 Travel Master 10.5-9.5 Mephisto MM 4 33.5-9.5 +Psion Atari 26-6 Sphinx Galaxy 15-9 Avant Garde 17.5-2.5 +Super Exp. A 20.5-17.5 Rebell 5 MHz 15.5-4.5 Stratos 6 MHz 14-6 +Super Mondial 16-4 Plymate 5.5 27.5-4.5 Simultano C 15.5-4.5 +Excellence 4 13.5-6.5 Super Nova 17.5-2.5 Super Const. 19-1 +Chesscard 5 18-2 Elite A/S 3.2 3-2 Conchess 2MHz 19-1 +Cmaster 2000 20-4 + + 43 Mephisto Dallas 68000 12 MHz, 1971, (1866 vs humans, 15 games) +Amsterdam 15.5-14.5 Meph. Mega IV 14.5-9.5 Excel Mach 2c 14.5-5.5 +Maestro D 10 3.5-2.5 Mephisto MM 4 42.5-26.5 Psion Atari 14-6 +Sphinx Galaxy 13.5-6.5 Excel Mach 2a 13.5-6.5 Excel Club 13.5-6.5 +Avant Garde 11.5-8.5 Super Exp. A 17.5-5.5 Par Excell. 40.5-18.5 +Rebell 5 MHz 15.5-4.5 Stratos 6 MHz 18.5-1.5 Forte B 59-23 +Super Mondial 19.5-4.5 Plymate 5.5 33-4 Maestro A 6 13.5-6.5 +Forte A 14.5-5.5 Excellence 4 20-7 Expert 4 MHz 38.5-11.5 +Turbostar 432 27.5-7.5 Excellence 3 16.5-3.5 Super Const. 59-11 +Superstar 36K 18-2 Conchess 2MHz 15-5 Quattro 4 MHz 15.5-4.5 + + 44 Mephisto Roma 68000 12 MHz, 1967 +Super Exp. C 16.5-21.5 Academy 5 MHz 11.5-8.5 Rex 2.3 20MHz 3.5-7.5 +Maestro B 18 0.5-2.5 Meph. Mega IV 17-6 Excel Mach 2c 20.5-19.5 +Super Exp. B 4-3 Kasp. GK-2000 13.5-6.5 Mephisto MM 4 19-9 +Psion Atari 27-8 Sphinx Galaxy 13-8 Excel Mach 2a 12-12 +Turboking II 12.5-7.5 Plym Victoria 13-7 Excel Club 16-4 +Mega IV BF 14-6 Avant Garde 20.5-6.5 Super Exp. A 19-5 +Par Excell. 25.5-3.5 Rebell 5 MHz 16.5-4.5 Stratos 6 MHz 36-26 +Forte B 45-15 Super Mondial 14.5-6.5 Plymate 5.5 13-7 +Maestro A 6 17.5-2.5 Forte A 7-1 Simultano C 11.5-5.5 +Excellence 4 17-3 Expert 4 MHz 1-1 Turbostar 432 17.5-4.5 +Excellence 3 36-9 Super Const. 56.5-7.5 Superstar 36K 19-1 +Conchess 2MHz 17.5-2.5 Quattro 4 MHz 18.5-1.5 Cmaster 2000 3.5-0.5 + + 45 Zarkov 2.6 386/25-33 MHz, 1966 +Super Exp. B 6.5-3.5 Kasp. GK-2000 12-8 Plym Victoria 4-3 +Par Excell. 4.5-2.5 Super Mondial 1-0 Chesscard 5 7-1 + + 46 Mephisto Milano 6502 5 MHz, 1955 +Super Exp. C 8.5-11.5 Meph. Mega IV 15.5-14.5 Kasp. GK-2000 7.5-3.5 +Mephisto MM 4 13.5-6.5 Meph. Modena 11-9 Psion Atari 15.5-4.5 +Sphinx Galaxy 7.5-1.5 Plym Victoria 12.5-7.5 Super Exp. A 15-5 +Stratos 6 MHz 12.5-7.5 Super Mondial 16-4 Plymate 5.5 12-8 +Simultano C 14-6 Elite A/S 3.2 17.5-2.5 + + 47 Novag Super Expert C 6502 6 MHz Sel 5, 1954, (1996 vs humans, 15 games) +Academy 5 MHz 12-8 Rex 2.3 20MHz 0.5-0.5 Meph. Mega IV 11.5-10.5 +Excel Mach 2c 19-11 Maestro D 10 8.5-11.5 Mephisto MM 4 11.5-7.5 +Meph. Modena 13-7 Psion Atari 14.5-5.5 Sphinx Galaxy 21-12 +Turboking II 11-9 Plym Victoria 11-9 Excel Club 11-5 +Avant Garde 13-7 Super Exp. A 10.5-9.5 Rebell 5 MHz 10.5-11.5 +Stratos 6 MHz 13.5-6.5 Super Mondial 15.5-4.5 Plymate 5.5 8.5-11.5 +Simultano C 13-7 Excellence 4 14.5-5.5 Expert 4 MHz 15-5 +Excellence 3 6-4 Super Nova 16-4 Super Const. 36.5-9.5 +Elite A/S 3.2 13.5-6.5 Superstar 36K 18.5-1.5 Conchess 2MHz 15.5-4.5 +Cmaster 2000 19.5-1.5 Const. 2 MHz 9.5-0.5 + + 48 Mephisto Academy 6502 5 MHz, 1940, (2057 vs humans, 21 games) +Amsterdam 12-12 Meph. Mega IV 22-11 Excel Mach 2c 12.5-7.5 +Maestro D 10 17-23 Super Exp. B 14-6 Mephisto MM 4 5-3 +Psion Atari 14-6 Sphinx Galaxy 17.5-24.5 Turboking II 12-8 +Plym Victoria 13.5-6.5 Excel Club 21-19 Avant Garde 13-7 +Super Exp. A 15.5-8.5 Rebell 5 MHz 14.5-5.5 Stratos 6 MHz 12.5-7.5 +Super Mondial 12-8 Plymate 5.5 13.5-6.5 Forte A 12.5-7.5 +Simultano C 34-11 Excellence 4 16.5-3.5 Super Nova 14-6 +Conchess 4MHz 1-0 Elite A/S 3.2 14.5-5.5 Superstar 36K 16-4 +Champion 2175 16-4 Conchess 2MHz 6-0 Cmaster 2000 13-2 + + 49 Rex Chess 2.3 80386 16-20 MHz, 1928 +Super Exp. B 2-1 Mephisto MM 4 11-6 Sphinx Galaxy 24.5-15.5 +Excel Club 9.5-4.5 Simultano C 8-11 + + 50 Saitek Leonardo Maestro B 6502 18 MHz, 1925 +Meph. Mega IV 3.5-3.5 Psion Atari 7-5 Excel Club 12.5-7.5 +Rebell 5 MHz 12-8 Forte B 12.5-6.5 Plymate 5.5 15-9 + + 51 Mephisto Amsterdam 68000 12 MHz, 1924 +Meph. Mega IV 10-10 Excel Mach 2c 12.5-12.5 Expert 16 MHz 10.5-9.5 +Super Exp. B 1-2 Mephisto MM 4 12.5-9.5 Psion Atari 9.5-10.5 +Sphinx Galaxy 13-7 Excel Club 31-23 Avant Garde 96.5-58.5 +Super Exp. A 13-7 Par Excell. 28-12 Rebell 5 MHz 12.5-7.5 +Stratos 6 MHz 13-7 Forte B 11.5-8.5 Super Mondial 13-7 +Plymate 5.5 22-7 Maestro A 6 12.5-7.5 Forte A 41-24 +Excellence 4 15.5-4.5 Expert 4 MHz 5-3 Mephisto MM 2 9-1 +Turbostar 432 20-11 Excellence 3 17.5-4.5 Super Const. 62-16 +Mephisto B&P 3.5-0.5 Prestige 4MHz 3-0 Quattro 4 MHz 16.5-3.5 + + 52 Mephisto Mega IV 6502 4.9 MHz, 1916, (1866 vs humans, 28 games) +Excel Mach 2c 16.5-16.5 Maestro D 10 13-22 Super Exp. B 13-7 +Mephisto MM 4 9.5-10.5 Meph. Modena 12-8 Psion Atari 9-11 +Sphinx Galaxy 17-13 Turboking II 9-11 Plym Victoria 13.5-6.5 +Excel Club 11.5-8.5 Avant Garde 13.5-9.5 Super Exp. A 12-8 +Rebell 5 MHz 20-10 Stratos 6 MHz 12.5-7.5 Forte B 52-26 +Super Mondial 9.5-10.5 Plymate 5.5 17-5 Forte A 13.5-6.5 +Simultano C 30.5-4.5 Excellence 4 20.5-3.5 Expert 4 MHz 14.5-5.5 +Turbostar 432 15-5 Excellence 3 19-9 Super Nova 7.5-2.5 +Super Const. 14.5-5.5 Elite A/S 3.2 20.5-4.5 Superstar 36K 17-3 +Champion 2175 2-0 Quattro 4 MHz 9.5-0.5 Cmaster 2000 3-1 +Const. 2 MHz 18.5-0.5 + + 53 Fidelity Excel Mach IIc 68000 12 MHz, 1915 +Mephisto MM 4 13-15 Psion Atari 16.5-3.5 Sphinx Galaxy 13-7 +Excel Club 29-16 Avant Garde 15.5-6.5 Super Exp. A 21.5-20.5 +Par Excell. 6.5-3.5 Rebell 5 MHz 12-8 Stratos 6 MHz 14-6 +Forte B 16.5-3.5 Super Mondial 12.5-7.5 Plymate 5.5 22-10 +Forte A 27-13 Excellence 4 12-8 Expert 4 MHz 13.5-6.5 +Turbostar 432 17-3 Excellence 3 13-7 Super Const. 19.5-10.5 +Elite A/S 3.2 17-3 Superstar 36K 16.5-3.5 + + 54 Saitek Maestro D 6502 10 MHz, 1914, (1722 vs humans, 18 games) +Mephisto MM 4 14-26 Psion Atari 13-7 Sphinx Galaxy 22-18 +Super Exp. A 26.5-16.5 Rebell 5 MHz 24-13 Stratos 6 MHz 25.5-14.5 +Super Mondial 17.5-22.5 Plymate 5.5 23-17 Simultano C 15.5-4.5 +Excellence 4 13.5-6.5 Turbostar 432 2.5-0.5 Super Const. 14.5-5.5 +Elite A/S 3.2 16.5-3.5 Superstar 36K 17.5-2.5 + + 55 Novag Expert Turbo Kit 6502 16 MHz, 1906 +Avant Garde 12-8 Rebell 5 MHz 10.5-9.5 Super Mondial 11-9 +Plymate 5.5 14.5-5.5 Turbostar 432 16-4 + + 56 Novag Super Expert B 6502 6 MHz sel 4, 1904, (1892 vs humans, 9 games) +Mephisto MM 4 8-12 CM3000 386/33 1-3 Psion Atari 10.5-9.5 +Sphinx Galaxy 14-6 Avant Garde 0.5-0.5 Super Exp. A 13-7 +Rebell 5 MHz 10.5-9.5 Stratos 6 MHz 13.5-6.5 Super Mondial 13-7 +Plymate 5.5 15-5 Simultano C 21.5-9.5 Excellence 4 11-9 +Excellence 3 3.5-1.5 Chesscard 5 8.5-1.5 Super VIP 15.5-4.5 +Elite A/S 3.2 13-7 Conchess 2MHz 4-1 Const. 2 MHz 1-0 + + 57 Kasparov GK-2000 H8 10 MHz, 1904 +Meph. Modena 12.5-7.5 Psion Atari 14-6 Turboking II 11-9 +Rebell 5 MHz 12-8 Chesspl. 2150 14-6 + + 59 Mephisto MM 4 6502 5 MHz, 1901 +Psion Atari 19.5-16.5 Sphinx Galaxy 11-9 Excel Mach 2a 12.5-7.5 +Turboking II 5.5-4.5 Plym Victoria 10-10 Excel Club 11-10 +Avant Garde 12-10 Super Exp. A 31-13 Par Excell. 12.5-7.5 +Rebell 5 MHz 16-4 Stratos 6 MHz 18-9 Forte B 14.5-5.5 +Super Mondial 13-7 Plymate 5.5 28.5-11.5 Maestro A 6 12-8 +Forte A 13.5-6.5 Simultano C 11.5-8.5 Excellence 4 11.5-8.5 +Expert 4 MHz 13.5-6.5 Turbostar 432 13.5-6.5 Excellence 3 16.5-3.5 +Super Const. 17-3 Mephisto B&P 6.5-3.5 Elite A/S 3.2 17-3 +Superstar 36K 13.5-6.5 Quattro 4 MHz 14.5-5.5 Cmaster 2000 15.5-1.5 +Super Enterp. 21-5 Turbo S 24K 4-0 + + 60 Chessmaster 3000 386/25-33 MHz, 1900 +Super Mondial 2-2 Chesscard 5 8-4 + + 61 Mephisto Modena 6502 4 MHz, 1886 +Mega IV BF 2.5-2.5 Super Mondial 13-7 Plymate 5.5 14-6 +Simultano C 10.5-9.5 Meph. Europa 15.5-4.5 Elite A/S 3.2 17-3 + + 62 Psion Atari 68000 8 MHz, 1880, (1947 vs humans, 5 games) +Sphinx Galaxy 10-10 Excel Mach 2a 13.5-6.5 Turboking II 9-12 +Plym Victoria 15-5 Excel Club 32.5-18.5 Avant Garde 13.5-7.5 +Super Exp. A 13.5-11.5 Par Excell. 12.5-7.5 Rebell 5 MHz 19-8 +Stratos 6 MHz 16-20 Forte B 13-7 Super Mondial 15-5 +Plymate 5.5 13-9 Maestro A 6 18-14 Forte A 10.5-9.5 +Excellence 4 19.5-9.5 Expert 4 MHz 20-9 Turbostar 432 14.5-5.5 +Excellence 3 22.5-9.5 Kasp. Blitz 14-6 Super Const. 19-4 +Chesspl. 2150 9-6 Mephisto B&P 3-1 Chesscard 5 8-5 +Super VIP 10-0 Superstar 36K 17-3 Champion 2175 6.5-0.5 +Conchess 2MHz 15.5-4.5 Quattro 4 MHz 15.5-4.5 Cmaster 2000 2-0 +Const. 2 MHz 1-0 Super Enterp. 18.5-1.5 + + 63 CXG Sphinx Galaxy 6502 4 MHz, 1875, (1999 vs humans, 28 games) +Turboking II 8-12 Plym Victoria 11.5-8.5 Mega IV BF 4.5-2.5 +Avant Garde 12-8 Rebell 5 MHz 10-10 Stratos 6 MHz 27-12 +Super Mondial 17-3 Plymate 5.5 11.5-8.5 Maestro A 6 1.5-1.5 +Forte A 4.5-3.5 Simultano C 35.5-24.5 Excellence 4 3.5-1.5 +Expert 4 MHz 10.5-9.5 Excellence 3 8-4 Kasp. Blitz 11.5-8.5 +Chesspl. 2150 13.5-6.5 Super VIP 5-0 Elite A/S 3.2 17-3 +Cmaster 2100 15-5 Champion 2175 8.5-11.5 Conchess 2MHz 23.5-9.5 +Const. 3.6MHz 12.5-5.5 Super Enterp. 3-0 + + 64 Fidelity Excel Mach IIa 68000 12 MHz, 1875 +Avant Garde 9.5-10.5 Rebell 5 MHz 12.5-7.5 Plymate 5.5 14-8 +Maestro A 6 15-5 Excellence 3 13.5-6.5 + + 65 Saitek Turboking II 6502 5 MHz, 1872 +Plym Victoria 10.5-9.5 Super Exp. A 12.5-7.5 Rebell 5 MHz 10-10 +Stratos 6 MHz 12.5-7.5 Super Mondial 10.5-9.5 Plymate 5.5 12-8 +Simultano C 12.5-7.5 Excellence 4 10.5-9.5 Super Nova 12-8 +Super Const. 15-5 Elite A/S 3.2 13-7 Cmaster 2100 15-5 +Superstar 36K 16-4 Champion 2175 16.5-3.5 Cmaster 2000 15.5-4.5 + + 66 Conchess Plymate Victoria 6502 5.5 MHz, 1862, (1841 vs humans, 7 games) +Mega IV BF 9.5-10.5 Super Exp. A 11.5-8.5 Rebell 5 MHz 11-9 +Stratos 6 MHz 10-10 Super Mondial 11-9 Plymate 5.5 14-6 +Maestro A 6 7-3 Simultano C 11-9 Excellence 4 0.5-0.5 +Chesscard 5 16.5-3.5 Elite A/S 3.2 18.5-1.5 Superstar 36K 14.5-5.5 +Cmaster 2000 17-3 + + 67 Fidelity Excel Club 68000 12 MHz, 1854, (1774 vs humans, 6 games) +Avant Garde 27-23 Super Exp. A 11-15 Rebell 5 MHz 11.5-8.5 +Stratos 6 MHz 13.5-6.5 Forte B 10.5-9.5 Super Mondial 10-10 +Plymate 5.5 18-6 Maestro A 6 13.5-6.5 Forte A 31.5-18.5 +Excellence 4 16-10 Expert 4 MHz 18-6 Turbostar 432 47.5-31.5 +Excellence 3 15-5 Super Const. 12.5-7.5 Elite A/S 3.2 17.5-2.5 +Superstar 36K 13.5-6.5 Conchess 2MHz 15-5 Quattro 4 MHz 14.5-5.5 +Cmaster 2000 7.5-3.5 Const. 2 MHz 2-0 Super Enterp. 7-1 + + 68 Mephisto Mega IV Brute Force, 1840 +Super Exp. A 8.5-11.5 Rebell 5 MHz 11-9 Stratos 6 MHz 6.5-13.5 +Super Mondial 12-8 Simultano C 11-9 Expert 4 MHz 8.5-3.5 +Super Const. 16.5-6.5 Elite A/S 3.2 22-3 + + 69 Fidelity Avant Garde 6502 5 MHz, 1832 +Super Exp. A 8.5-11.5 Par Excell. 20.5-20.5 Rebell 5 MHz 10-10 +Stratos 6 MHz 12-10 Forte B 11-9 Super Mondial 11-9 +Plymate 5.5 19-17 Maestro A 6 9-11 Forte A 21.5-17.5 +Excellence 4 13-7 Expert 4 MHz 50-35 Plymate 4 MHz 14.5-10.5 +Turbostar 432 20-9 Excellence 3 14-7 Super Const. 23.5-8.5 +Elite A/S 3.2 6-4 Superstar 36K 16-5 Conchess 2MHz 15.5-4.5 +Quattro 4 MHz 15.5-4.5 Cmaster 2000 15.5-4.5 Const. 2 MHz 18-2 + + 70 Novag Super Expert/Forte A 6502 5 MHz, 1831, (1718 vs humans, 9 games) +Rebell 5 MHz 10.5-9.5 Stratos 6 MHz 7-15 Super Mondial 8-12 +Plymate 5.5 12.5-27.5 Maestro A 6 10-10 Simultano C 10-10 +Excellence 4 32-30 Turbostar 432 15-5 Excellence 3 14-6 +Kasp. Blitz 14-6 Super Const. 14-6 Elite A/S 3.2 15.5-4.5 +Superstar 36K 19.5-5.5 Champion 2175 12-8 Conchess 2MHz 14-6 +Quattro 4 MHz 15.5-4.5 + + 71 Fidelity Par Excellence 6502 5 MHz, 1829 +Rebell 5 MHz 21-14 Forte B 15-7 Super Mondial 11.5-8.5 +Plymate 5.5 46.5-41.5 Maestro A 6 10-10 Forte A 47.5-37.5 +Excellence 4 17.5-12.5 Expert 4 MHz 19-15 Plymate 4 MHz 5.5-4.5 +Mephisto MM 2 10.5-9.5 Turbostar 432 12.5-7.5 Excellence 3 11.5-8.5 +Super Nova 8-2 Super Const. 44.5-25.5 Chesscard 5 2-4 +Elite A/S 3.2 16-4 Superstar 36K 16.5-3.5 Conchess 2MHz 16-4 +Quattro 4 MHz 16.5-3.5 Const. 3.6MHz 13-7 Turbo S 24K 7-1 + + 72 Mephisto Rebell 6502 5 MHz, 1821 +Stratos 6 MHz 12.5-7.5 Forte B 20.5-23.5 Super Mondial 13-7 +Plymate 5.5 12.5-8.5 Maestro A 6 13.5-8.5 Forte A 14-11 +Simultano C 11-13 Excellence 4 9.5-10.5 Expert 4 MHz 10-10 +Turbostar 432 10.5-9.5 Excellence 3 14-6 Super Nova 14.5-10.5 +Super Const. 10.5-9.5 Chesspl. 2150 14-6 Mephisto B&P 2-0 +Meph. Europa 5-1 Elite A/S 3.2 12-8 Superstar 36K 14.5-5.5 +Conchess 2MHz 13.5-6.5 Quattro 4 MHz 13.5-6.5 + + 73 Saitek Stratos/Analys B 6502 6 MHz, 1817 +Forte B 8-12 Super Mondial 11-9 Plymate 5.5 8.5-11.5 +Forte A 3-0 Simultano C 10-10 Excellence 4 11-10 +Expert 4 MHz 6-14 Turbostar 432 7.5-4.5 Excellence 3 14-7 +Kasp. Blitz 9-3 Super Nova 14-6 Super Const. 13-7 +Chesscard 5 2-1 Meph. Europa 2-1 Super VIP 9.5-10.5 +Elite A/S 3.2 14-6 Superstar 36K 11-9 Conchess 2MHz 4-0 +Quattro 4 MHz 16-4 Cmaster 2000 14.5-5.5 Const. 2 MHz 6-3 + + 74 Novag Forte B 6502 5 MHz, 1813, (1861 vs humans, 28 games) +Super Mondial 11.5-8.5 Plymate 5.5 25-24 Maestro A 6 9.5-10.5 +Excellence 4 14.5-11.5 Expert 4 MHz 0.5-2.5 Elegance 3.6 3-2 +Turbostar 432 12.5-7.5 Excellence 3 14-6 Super Nova 1.5-0.5 +Super Const. 11-9 Meph. Europa 15.5-4.5 Elite A/S 3.2 14.5-5.5 +Superstar 36K 13-7 Conchess 2MHz 30.5-11.5 Quattro 4 MHz 16.5-3.5 + + 75 Mephisto Super Mondial 6502 4 MHz, 1812 +Plymate 5.5 11.5-16.5 Maestro A 6 11-9 Forte A 8-12 +Simultano C 14.5-5.5 Excellence 4 7.5-12.5 Expert 4 MHz 12-8 +Turbostar 432 8.5-11.5 Excellence 3 9-11 Kasp. Blitz 10-10 +Super Const. 10-10 Chesspl. 2150 15-5 Chesscard 5 15-5 +Elite A/S 3.2 14-6 Cmaster 2100 15.5-4.5 Superstar 36K 14-6 +Conchess 2MHz 16-4 Quattro 4 MHz 15.5-4.5 + + 76 Conchess Glasgow 6 MHz, 1812 +Super Const. 3.5-1.5 Elite A/S 3.2 8.5-3.5 Const. 2 MHz 9-3 +Mephisto III6 11-1 + + 77 Conchess Plymate 6502 5.5 MHz, 1808 +Maestro A 6 14-17 Forte A 47-47 Simultano C 8-11 +Excellence 4 113.5-96.5 Expert 4 MHz 13-9 Mephisto MM 2 2-0 +Elegance 3.6 5.5-4.5 Turbostar 432 20.5-14.5 Excellence 3 14.5-14.5 +Super Nova 9.5-10.5 Super Const. 24.5-7.5 Super VIP 12-8 +Elite A/S 3.2 12.5-7.5 Superstar 36K 11-9 Champion 2175 4-0 +Prestige 4MHz 4-1 Conchess 2MHz 15.5-4.5 Quattro 4 MHz 11-9 +Cmaster 2000 20.5-4.5 Const. 3.6MHz 21.5-4.5 Const. 2 MHz 14.5-5.5 +Sargon III 1M 1-0 Super Enterp. 18.5-1.5 + + 78 Saitek Leonardo Maestro A 6502 6 MHz, 1807, (1896 vs humans, 9 games) +Forte A 8-13 Excellence 4 13-9 Turbostar 432 11-10 +Excellence 3 10.5-9.5 Super Const. 13-7 Superstar 36K 14.5-5.5 +Conchess 2MHz 16-4 Quattro 4 MHz 13-7 Cmaster 2000 1-0 + + 79 Novag Forte A 6502 5 MHz, 1806 +Excellence 4 21.5-29.5 Plymate 4 MHz 7-3 Mephisto MM 2 10.5-9.5 +Elegance 3.6 8.5-11.5 Turbostar 432 19.5-14.5 Excellence 3 10.5-12.5 +Super Const. 21.5-11.5 Elite A/S 3.2 16.5-3.5 Superstar 36K 15.5-4.5 +Conchess 2MHz 13-7 Quattro 4 MHz 18-4 Cmaster 2000 3.5-2.5 +Const. 3.6MHz 16-4 Const. 2 MHz 15-3 Super Enterp. 16.5-3.5 + + 80 Saitek Simultano/Corona C 6502 5 MHz, 1806 +Excellence 4 14.5-10.5 Kasp. Blitz 11-9 Super Nova 6.5-3.5 +Meph. Europa 2-0 Elite A/S 3.2 22.5-17.5 Cmaster 2100 14-6 +Superstar 36K 11.5-3.5 + + 81 Fidelity Excellence 6502 4 MHz, 1798 +Expert 4 MHz 24-22 Plymate 4 MHz 15-14 Mephisto MM 2 12-8 +Turbostar 432 39-39 Excellence 3 12.5-7.5 Kasp. Blitz 13-7 +Super Nova 12.5-7.5 Super Const. 20.5-9.5 Conchess 4MHz 17-7 +Mephisto B&P 0.5-2.5 Super VIP 15.5-4.5 Elite A/S 3.2 13-7 +Superstar 36K 12.5-8.5 Champion 2175 16-4 Conchess 2MHz 17-3 +Quattro 4 MHz 13-7 Cmaster 2000 17.5-2.5 Const. 3.6MHz 24-4 +Const. Primo 5.5-2.5 Const. 2 MHz 2-0 + + 82 Novag Expert 6502 4 MHz, 1784 +Plymate 4 MHz 5.5-14.5 Mephisto MM 2 4-6 Elegance 3.6 11.5-8.5 +Turbostar 432 11-9 Excellence 3 22-13 Super Nova 5.5-5.5 +Super Const. 16.5-12.5 Conchess 4MHz 4.5-2.5 Chesspl. 2150 1.5-1.5 +Mephisto B&P 2-0 Superstar 36K 11-9 Conchess 2MHz 14-6 +Quattro 4 MHz 3-1 Const. 3.6MHz 13.5-6.5 Const. Primo 10.5-2.5 +Super Enterp. 10-1 + + 83 Conchess Plymate 6502 4 MHz, 1775 +Elegance 3.6 25-22 Turbostar 432 9.5-10.5 Excellence 3 11.5-8.5 +Super Const. 38.5-27.5 Elite A/S 3.2 10-10 Superstar 36K 13-7 +Meph. Excl. S 7.5-2.5 Conchess 2MHz 11-9 Const. 3.6MHz 16.5-9.5 + + 84 Mephisto MM 2 6502 3.7 MHz, 1769 +Turbostar 432 16.5-19.5 Excellence 3 7.5-8.5 Super Const. 8.5-6.5 +Elite A/S 3.2 9-5 Superstar 36K 15.5-4.5 Const. 3.6MHz 14-6 +Const. 2 MHz 4-1 + + 85 Fidelity Elegance 6502 3.6 MHz, 1761 +Turbostar 432 16.5-13.5 Excellence 3 0.5-1.5 Super Const. 9-8 +Conchess 4MHz 28.5-23.5 Elite A/S 3.2 11.5-3.5 Meph. Excl. S 8-5 +Conchess 2MHz 7.5-4.5 Const. 3.6MHz 17.5-6.5 Const. 2 MHz 14-6 +Super Enterp. 10.5-1.5 Sensory 9 A 3.5-0.5 Steinitz 3-1 +Mephisto IIIM 4-0 Mephisto II 6 4-0 Chess 2001 2.5-1.5 +Scisys supers 4-0 Mephisto III6 3.5-0.5 Conchess -82 2.5-1.5 +Mark VI 3.5-0.5 Morphy 3-1 + + 86 Saitek Turbostar 432 6502 4 MHz, 1759 +Excellence 3 13-12 Super Const. 31.5-29.5 Conchess 4MHz 10-9 +Mephisto B&P 17.5-9.5 Elite A/S 3.2 15-5 Superstar 36K 10-10 +Meph. Excl. S 3-2 Prestige 4MHz 7-4 Conchess 2MHz 12-8 +Quattro 4 MHz 12-8 Const. 3.6MHz 14.5-7.5 Const. 2 MHz 18-7 +Sargon III 1M 1.5-0.5 Super Enterp. 17-3 Scisys supers 0-1 +Mephisto III6 18.5-1.5 Turbo S 24K 2-1 GMC 1-0 + + 87 Fidelity Excellence 6502 3 MHz, 1753, (1578 vs humans, 5 games) +Super Nova 0-1 Super Const. 30.5-21.5 Conchess 4MHz 14.5-10.5 +Mephisto B&P 4-5 Super VIP 6.5-2.5 Elite A/S 3.2 14.5-5.5 +Superstar 36K 13.5-6.5 Conchess 2MHz 15.5-11.5 Quattro 4 MHz 15-5 +Const. 3.6MHz 21-11 Const. Primo 15-5 Const. 2 MHz 22-4 +Sargon III 1M 1-1 Super Enterp. 14-8 + + 88 Saitek Kasparov Blitz, 1736 +Super Nova 9.5-10.5 Super Enterp. 21-9 + + 89 Novag Super Nova, 1732 +Super Const. 10.5-9.5 Meph. Europa 11-9 Conchess 2MHz 13-7 +Const. 2 MHz 13-7 Super Enterp. 10.5-9.5 + + 90 Novag Super Constellation 6502 4 MHz, 1728, (1555 vs humans, 9 games) +Conchess 4MHz 46-44 Chesspl. 2150 1-0 Mephisto B&P 9.5-7.5 +Chesscard 5 13.5-7.5 Super VIP 5-5 Elite A/S 3.2 10-3 +Superstar 36K 11.5-9.5 Champion 2175 13.5-6.5 Meph. Excl. S 10.5-5.5 +Prestige 4MHz 9.5-10.5 Conchess 2MHz 12.5-11.5 Quattro 4 MHz 14.5-5.5 +Const. 3.6MHz 19.5-5.5 Const. Primo 0.5-0.5 Const. 2 MHz 26-11 +Sargon III 1M 9-3 Meph. Mondial 10-4 Super Enterp. 10.5-1.5 +Sensory 9 A 4.5-1.5 Steinitz 4-0 Mephisto IIIM 16-1 +Mephisto II 6 4-0 Chess 2001 2.5-1.5 Scisys supers 3.5-1.5 +Mephisto III6 21-5 Conchess -82 3-1 GMC 4.5-0.5 +Mark VI 4-0 Mark V 9.5-0.5 Morphy 4-0 + + 91 Conchess Glasgow 6502 4 MHz, 1712 +Elite A/S 3.2 8.5-6.5 Superstar 36K 6-8 Meph. Excl. S 6-7 +Prestige 4MHz 27-12 Const. 3.6MHz 10.5-9.5 Const. 2 MHz 8.5-2.5 +Super Enterp. 5.5-4.5 Scisys supers 1-0 GMC 1-0 + + 92 Chessplayer 2150 Atari/Amiga, 1709 +Conchess 2MHz 11.5-8.5 Const. Primo 0-1 + + 94 The Final Chesscard 6502 5 MHz, 1695 +Const. 2 MHz 5.5-0.5 + + 95 Mephisto Europa, 1685 +Elite A/S 3.2 10.5-9.5 Superstar 36K 9.5-10.5 Conchess 2MHz 13.5-6.5 +Const. 2 MHz 7.5-6.5 Super Enterp. 14-6 + + 96 Novag Super VIP, 1684 +Elite A/S 3.2 12-8 Conchess 2MHz 5-15 + + 97 Fidelity Elite A/S 6502 3.2 MHz, 1677 +Superstar 36K 11.5-8.5 Meph. Excl. S 1.5-1.5 Conchess 2MHz 11.5-8.5 +Quattro 4 MHz 11.5-8.5 Const. 3.6MHz 12.5-16.5 Const. Primo 11-9 +Const. 2 MHz 7-5 Sensory 9 B 3-1 Sensory 9 A 41-13 +Steinitz 28-9 Mephisto IIIM 7-3 Mephisto II 6 11.5-3.5 +Chess 2001 9.5-0.5 Scisys supers 11.5-1.5 Mephisto III6 17.5-3.5 +Turbo S 24K 15-5 Conchess -82 7-1 GMC 1-0 +Mark VI 7-1 Morphy 8.5-0.5 Boris 2.5 0-1 + + 99 Saitek Superstar 36K 6502 2 MHz, 1675 +Conchess 2MHz 11.5-8.5 Quattro 4 MHz 11.5-11.5 Cmaster 2000 9.5-10.5 +Const. 3.6MHz 16.5-13.5 Const. Primo 9.5-10.5 Const. 2 MHz 11-9 +Meph. Mondial 10.5-9.5 Turbo 16K 15-5 Mephisto III6 2.5-1.5 + + 100 Chess Champion 2175 Atari/Amiga, 1670 +Conchess 2MHz 7.5-12.5 Cmaster 2000 0.5-1.5 + + 101 Mephisto Exclusive S, 1670 +Conchess 2MHz 2-2 Const. 3.6MHz 8.5-6.5 Scisys supers 1-0 +GMC 1-0 + + 102 Fidelity Prestige 6502 4 MHz, 1665 +Conchess 2MHz 3.5-3.5 Const. 3.6MHz 5-5 Elite -81 11-11 +Const. 2 MHz 15.5-6.5 Sensory 9 B 8-4 Sensory 9 A 28-6 +Steinitz 10.5-3.5 Mephisto II 6 52-12 Chess 2001 2-0 +Scisys supers 8.5-3.5 Mephisto III6 2-0 Conchess -82 14-4 +Champion chal 4.5-2.5 Mark VI 23-1 Mark V 8.5-1.5 +Morphy 3-0 + + 103 Conchess Glasgow 6502 2 MHz, 1663 +Quattro 4 MHz 7-13 Cmaster 2000 8-12 Const. 3.6MHz 8.5-13.5 +Const. Primo 11.5-8.5 Const. 2 MHz 12.5-7.5 Meph. Mondial 1.5-4.5 +Super Enterp. 12.5-7.5 Mephisto IIIM 1.5-0.5 Turbo S 24K 16-4 +GMC 2-0 + + 104 Novag Quattro 6502 4 MHz, 1659 +Cmaster 2000 9-11 Const. 3.6MHz 12-8 Const. Primo 11-9 +Super Enterp. 14.5-6.5 + + 106 Novag Constellation 6502 3.6 MHz, 1644 +Const. 2 MHz 20-14 Meph. Mondial 9.5-6.5 Super Enterp. 1-1 +Sensory 9 B 1-1 Sensory 9 A 3-1 Steinitz 2.5-1.5 +Mephisto IIIM 21.5-8.5 Mephisto II 6 4-0 Turbo 16K 16-4 +Chess 2001 5.5-0.5 Scisys supers 8.5-0.5 Turbo S 24K 15-5 +Conchess -82 4-0 GMC 4.5-1.5 Mark VI 4-0 +Morphy 3.5-0.5 + + 107 Novag Constellation Primo, 1634 +Const. 2 MHz 3.5-2.5 Super Enterp. 13-7 + + 108 Fidelity Elite -81, 1604 +Const. 2 MHz 4-6 Sensory 9 A 11-5 Steinitz 1-1 +Mephisto II 6 21.5-10.5 Conchess -82 11-3 GMC 13-1 +Mephisto II 3 9-1 Champion chal 11.5-3.5 Mark VI 1-1 +Mark V 9.5-4.5 + + 109 Novag Constellation 6502 2 MHz, 1596 +Sargon III 1M 1-1 Meph. Mondial 13-7 Super Enterp. 34-25 +Sensory 9 B 8-6 Sensory 9 A 34-22 Steinitz 46-17 +Mephisto IIIM 24-12 Mephisto II 6 26.5-10.5 Turbo 16K 16-4 +Chess 2001 13-4 Scisys supers 33.5-20.5 Mephisto III6 15.5-8.5 +Conchess -82 19.5-5.5 GMC 1-1 Mephisto II 3 1-0 +Mark VI 14-2 Mark V 2-0 Morphy 3.5-1.5 +Progidy 9-0 Boris 2.5 1-0 + + 110 Sargon III 1 MHz, 1590 +Conchess -82 6.5-1.5 + + 111 Mephisto Mondial, 1581 +Turbo 16K 11.5-8.5 Mephisto III6 3-1 + + 112 CXG Super Enterprise, 1561 +Turbo 16K 5-5 Mephisto III6 10.5-3.5 Enterprise S 8.5-1.5 + + 113 Fidelity Sensory 9 B, 1553 +Sensory 9 A 1-1 Mephisto IIIM 4-4 Scisys supers 7.5-4.5 +Mephisto III6 1-1 Conchess -82 3.5-0.5 Mark VI 4-0 +Morphy 3.5-0.5 + + 114 Fidelity Sensory 9 A, 1494 +Steinitz 17-18 Mephisto IIIM 13.5-14.5 Mephisto II 6 40.5-29.5 +Chess 2001 1-3 Scisys supers 2-2 Mephisto III6 10.5-4.5 +Conchess -82 18.5-9.5 GMC 18.5-7.5 Mephisto II 3 28.5-11.5 +Champion chal 15.5-6.5 Mark VI 10-7 Mark V 21.5-16.5 +Morphy 1-0 Progidy 4-0 Boris 2.5 3-0 + + 115 Steinitz, 1480, (1546 vs humans, 0 games) +Mephisto IIIM 3-1 Mephisto II 6 20-17 Chess 2001 9-11 +Scisys supers 16-8 Mephisto III6 3.5-1.5 Conchess -82 8.5-3.5 +GMC 17.5-12.5 Mephisto II 3 3.5-1.5 Mark VI 10-8 +Morphy 2.5-2.5 Boris 2.5 1-0 + + 116 Mephisto III Modular, 1471 +Mephisto II 6 1-5 Chess 2001 2-4 Scisys supers 5-1 +Mephisto III6 5-3 Conchess -82 2-2 GMC 3-1 +Mark VI 7.5-4.5 Morphy 2-2 + + 117 Mephisto II 6.1 MHz, 1470 +Chess 2001 2-2 Scisys supers 3-3 Mephisto III6 2-3 +Conchess -82 24-16 GMC 13.5-4.5 Mephisto II 3 15-4 +Champion chal 6-2 Mark VI 16-10 Mark V 29-9 +Morphy 4-1 Progidy 3-2 Boris 2.5 1.5-1.5 + + 119 Chess 2001, 1462 +Scisys supers 2-4 Mephisto III6 3-3 Conchess -82 1.5-2.5 +Mark VI 2.5-1.5 Morphy 3-1 + + 120 Scisys Superstar, 1454 +Mephisto III6 4.5-3.5 Conchess -82 2-2 GMC 1-0 +Mark VI 3-1 Morphy 1.5-2.5 + + 121 Mephisto III 6.1 MHz, 1452 +Conchess -82 4-0 Mark VI 3-1 Morphy 3-2 +Boris 2.5 1-0 + + 122 Saitek Turbo S 24K, 1431 +Champion chal 7-13 + + 123 Conchess -82 2 MHz, 1408 +GMC 2-6 Mephisto II 3 13-5 Champion chal 14.5-11.5 +Mark VI 3.5-4.5 Mark V 14.5-7.5 Morphy 9.5-4.5 +Enterprise S 12-4 Boris 2.5 1.5-0.5 + + 124 GMC, 1385 +Mephisto II 3 20-19 Champion chal 40-40 Mark V 37.5-27.5 +Boris 2.5 2-0 + + 125 Mephisto II 3.5 MHz, 1380 +Champion chal 28.5-14.5 Mark V 25.5-22.5 Morphy 42-28 +Progidy 1.5-0.5 Boris 2.5 10-1 + + 126 Champion Sensory Challenger, 1379 +Mark V 45-36 Morphy 12.5-11.5 Enterprise S 9.5-0.5 + + 127 Mark VI, 1375 +Morphy 3-1 + + 128 Mark V, 1352 +Morphy 6.5-5.5 Progidy 4-4 Boris 2.5 4.5-0.5 + + 129 Morphy, 1334 +Boris 2.5 24.5-10.5 + + 131 Enterprise S, 1182 +Boris 2.5 5-5 + diff --git a/programs/engine-intf.html b/programs/engine-intf.html new file mode 100644 index 0000000..07a2976 --- /dev/null +++ b/programs/engine-intf.html @@ -0,0 +1,1895 @@ +<html> +<head> +<title>Chess Engine Communication Protocol</title> +</head> + +<body> +<hr noshade size="2"> +<h1>Chess Engine Communication Protocol</h1> +<h2><a href="http://www.tim-mann.org/">Tim Mann</a></h2> +<p> +$Id: engine-intf.html,v 2.1 2003/10/27 19:21:00 mann Exp $<br> +Version 2; implemented in xboard/WinBoard 4.2.1 and later.<br> +Changes since version 1 are indicated in <font color=red>red</font>. +<hr noshade size="2"> + +<ul> +<li><a href="#1">1. Introduction</a> +<li><a href="#2">2. Connection</a> +<li><a href="#3">3. Debugging</a> +<li><a href="#4">4. How it got this way</a> +<li><a href="#5">5. WinBoard requires Win32 engines</a> +<li><a href="#6">6. Hints on input/output</a> +<li><a href="#7">7. Signals</a> +<li><a href="#8">8. Commands from xboard to the engine</a> +<li><a href="#9">9. Commands from the engine to xboard</a> +<li><a href="#10">10. Thinking Output</a> +<li><a href="#11">11. Time control</a> +<li><a href="#12">12. Analyze Mode</a> +<li><a href="#13">13. Idioms and backward compatibility features</a> +</ul> + +<hr noshade size="2"> + +<h2><a name="1">1. Introduction</a></h2> + +<p> +This document is a set of rough notes on the protocol that xboard and +WinBoard use to communicate with gnuchessx and other chess engines. +These notes may be useful if you want to connect a different chess +engine to xboard. Throughout the notes, "xboard" means both xboard +and WinBoard except where they are specifically contrasted. +</p> + +<p> +There are two reasons I can imagine someone wanting to do this: +</p> +<ol> +<li>You have, or are developing, a chess engine but you don't want to +write your own graphical interface. +<li>You have, or are developing,a chess engine, and you want to +interface it to the Internet Chess Server. +</ol> + +<p> +In case (2), if you are using xboard, you will need to configure the +"Zippy" code into it, but WinBoard includes this code already. See +the file <a +href="http://www.tim-mann.org/xboard/zippy.README">zippy.README</a> +in the xboard or WinBoard distribution for more information. + +</p> + +<p> +These notes are unpolished, but I've attempted to make them complete +in this release. If you notice any errors, omissions, or misleading +statements, let me know. +</p> + +<p> +I'd like to hear from everyone who is trying to interface their own +chess engine to xboard/WinBoard. Please join the mailing list for +authors of xboard/WinBoard compatible chess engines and post a message +about what you're doing. The list is now hosted by Yahoo Groups; you +can join at <a href="http://groups.yahoo.com/group/chess-engines" +>http://groups.yahoo.com/group/chess-engines</a>, or you can read the +list there without joining. The list is filtered to prevent spam. +</p> + +<h2><a name="2">2. Connection</a></h2> + +<p> +An xboard chess engine runs as a separate process from xboard itself, +connected to xboard through a pair of anonymous pipes. The engine +does not have to do anything special to set up these pipes. xboard +sets up the pipes itself and starts the engine with one pipe as its +standard input and the other as its standard output. The engine then +reads commands from its standard input and writes responses to its +standard output. This is, unfortunately, a little more complicated to +do right than it sounds; see <a href="#6">section 6</a> below. +</p> + +<p> +And yes, contrary to some people's expectations, exactly the same +thing is true for WinBoard. Pipes and standard input/output are +implemented in Win32 and work fine. You don't have to use DDE, COM, +DLLs, BSOD, or any of the other infinite complexity that +Microsoft has created just to talk between two programs. A WinBoard +chess engine is a Win32 console program that simply reads from its +standard input and writes to its standard output. See sections +<a href="#5">5</a> and <a href="#6">6</a> below for additional details. +</p> + +<h2><a name="3">3. Debugging</a></h2> + +<p> +To diagnose problems in your engine's interaction with xboard, use the +-debug flag on xboard's command line to see the messages that are +being exchanged. In WinBoard, these messages are written to the file +WinBoard.debug instead of going to the screen. +</p> + +<p> +You can turn debug mode on or off while WinBoard is running by +pressing Ctrl+Alt+F12. You can turn debug mode on or off while xboard +is running by binding DebugProc to a shortcut key (and pressing the +key!); see the instructions on shortcut keys in the xboard man page. +</p> + +<p> +While your engine is running under xboard/WinBoard, you can send a +command directly to the engine by pressing Shift+1 (xboard) or Alt+1 +(WinBoard 4.0.3 and later). This brings up a dialog that you can type +your command into. Press Shift+2 (Alt+2) instead to send to the +second chess engine in Two Machines mode. On WinBoard 4.0.2 and earlier, +Ctrl+Alt is used in place of Alt; this had to be changed due to a conflict +with typing the @-sign on some European keyboards. +</p> + +<h2><a name="4">4. How it got this way</a></h2> + +<p> +Originally, xboard was just trying to talk to the existing +command-line interface of GNU Chess 3.1+ and 4, which was designed +for people to type commands to. So the communication protocol is very +ad-hoc. It might have been good to redesign it early on, but because +xboard and GNU Chess are separate programs, I didn't want to force +people to upgrade them together to versions that matched. I +particularly wanted to keep new versions of xboard working with old +versions of GNU Chess, to make it easier to compare the play of old +and new gnuchess versions. I didn't foresee the need for a clean +protocol to be used with other chess engines in the future. +</p> + +<p> +Circumstances have changed over the years, and now there are many more +engines that work with xboard. I've had to make the protocol +description more precise, I've added some features that GNU Chess +does not support, and I've specified the standard semantics of a few +features to be slightly different from what GNU Chess 4 does. +</p> + +<p> +<font color=red> +This release of the protocol specification is the first to carry a +version number of its own -- version 2. Previous releases simply +carried a last-modified date and were loosely tied to specific +releases of xboard and WinBoard. The version number "1" applies +generally to all those older versions of the protocol. +</font> + +<font color=red> +<p>Protocol version 2 remains compatible with older engines but has +several new capabilities. In particular, it adds the +"feature" command, a new mechanism for making backward-compatible +changes and extensions to the protocol. Engines that do not support a +particular new feature do not have to use it; new features are not +enabled unless the engine specifically requests them using the feature +command. If an engine does not send the feature command at all, the +protocol behavior is nearly identical to version 1. Several new +features can be selected by the feature command in version 2, +including the "ping" command (recommended for all engines), the +"setboard" command, and many optional parameters. Additional features +will probably be added in future versions. +</p> +</font> + +<h2><a name="5">5. WinBoard requires Win32 engines</a></h2> + +<p> +Due to some Microsoft brain damage that I don't understand, WinBoard +does not work with chess engines that were compiled to use a DOS +extender for 32-bit addressing. (Probably not with 16-bit DOS or +Windows programs either.) WinBoard works only with engines that are +compiled for the Win32 API. You can get a free compiler that targets +the Win32 API from <a href="http://sources.redhat.com/cygwin/" +>http://sources.redhat.com/cygwin/</a>. I think DJGPP 2.x should also +work if you use the RSXNTDJ extension, but I haven't tried it. Of +course, Microsoft Visual C++ will work. Most likely the other +commercial products that support Win32 will work too (Borland, etc.), +but I have not tried them. Delphi has been successfully used to write +engines for WinBoard; if you want to do this, Tony Werten has donated +some <a href="http://www.tim-mann.org/winboard/delphi.txt" >sample +code</a> that should help you get started. +</p> + +<h2><a name="6">6. Hints on input/output</a></h2> + +<p> +Beware of using buffered I/O in your chess engine. The C stdio +library, C++ streams, and the I/O packages in most other languages use +buffering both on input and output. That means two things. First, +when your engine tries to write some characters to xboard, the library +stashes them in an internal buffer and does not actually write them to +the pipe connected to xboard until either the buffer fills up or you +call a special library routine asking for it to be flushed. (In C +stdio, this routine is named <tt>fflush</tt>.) Second, when your engine tries +to read some characters from xboard, the library does not read just +the characters you asked for -- it reads all the characters that are +currently available (up to some limit) and stashes any characters you +are not yet ready for in an internal buffer. The next time you ask to +read, you get the characters from the buffer (if any) before the +library tries to read more data from the actual pipe. +</p> + +<p> +Why does this cause problems? First, on the output side, remember +that your engine produces output in small quantities (say, a few +characters for a move, or a line or two giving the current analysis), +and that data always needs to be delivered to xboard/WinBoard for +display immediately. If you use buffered output, the data you print +will sit in a buffer in your own address space instead of being +delivered. +</p> + +<p> +You can usually fix the output buffering problem by asking for the +buffering to be turned off. In C stdio, you do this by calling +<tt>setbuf(stdout, NULL)</tt>. A more laborious and error-prone +method is to carefully call <tt>fflush(stdout)</tt> after every line +you output; I don't recommend this. In C++, you can try +<tt>cout.setf(ios::unitbuf)</tt>, which is documented in current +editions of "The C++ Programming Language," but not older ones. +Another C++ method that might work is +<tt>cout.rdbuf()->setbuf(NULL, 0)</tt>. Alternatively, you can +carefully call <tt>cout.flush()</tt> after every line you output; +again, I don't recommend this. +</p> + +<p> +Another way to fix the problem is to use unbuffered operating system +calls to write directly to the file descriptor for standard output. +On Unix, this means <tt>write(1, ...)</tt> -- see the man page for write(2). +On Win32, you can use either the Unix-like <tt>_write(1, ...)</tt> or Win32 +native routines like <tt>WriteFile</tt>. +</p> + +<p> +Second, on the input side, you are likely to want to poll during your +search and stop it if new input has come in. If you implement +pondering, you'll need this so that pondering stops when the user +makes a move. You should also poll during normal thinking on your +move, so that you can implement the "?" (move now) command, and so +that you can respond promptly to a "result", "force", or "quit" +command if xboard wants to end the game or terminate your engine. +Buffered input makes polling more complicated -- when you poll, you +must stop your search if there are <em>either</em> characters in the buffer +<em>or</em> characters available from the underlying file descriptor. +</p> + +<p> +The most direct way to fix this problem is to use unbuffered operating +system calls to read (and poll) the underlying file descriptor +directly. On Unix, use <tt>read(0, ...)</tt> to read from standard input, and +use <tt>select()</tt> to poll it. See the man pages read(2) and select(2). +(Don't follow the example of GNU Chess 4 and use the FIONREAD ioctl to +poll for input. It is not very portable; that is, it does not exist +on all versions of Unix, and is broken on some that do have it.) On +Win32, you can use either the Unix-like <tt>_read(0, ...)</tt> or the native +Win32 <tt>ReadFile()</tt> to read. Unfortunately, under Win32, the function to +use for polling is different depending on whether the input device is +a pipe, a console, or something else. (More Microsoft brain damage +here -- did they never hear of device independence?) For pipes, you +can use <tt>PeekNamedPipe</tt> to poll (even when the pipe is unnamed). +For consoles, +you can use <tt>GetNumberOfConsoleInputEvents</tt>. For sockets only, you can +use <tt>select()</tt>. It might be possible to use +<tt>WaitForSingleObject</tt> more +generally, but I have not tried it. Some code to do these things can +be found in Crafty's utility.c, but I don't guarantee that it's all +correct or optimal. +</p> + +<p> +A second way to fix the problem might be to ask your I/O library not +to buffer on input. It should then be safe to poll the underlying +file descriptor as described above. With C, you can try calling +<tt>setbuf(stdin, NULL)</tt>. However, I have never tried this. Also, there +could be problems if you use <tt>scanf()</tt>, at least with certain patterns, +because <tt>scanf()</tt> sometimes needs to read one extra character and "push +it back" into the buffer; hence, there is a one-character pushback +buffer even if you asked for stdio to be unbuffered. With C++, you +can try <tt>cin.rdbuf()->setbuf(NULL, 0)</tt>, but again, I have never tried +this. +</p> + +<p> +A third way to fix the problem is to check whether there are +characters in the buffer whenever you poll. C I/O libraries generally +do not provide any portable way to do this. Under C++, you can use +<tt>cin.rdbuf()->in_avail()</tt>. This method has been reported to +work with +EXchess. Remember that if there are no characters in the buffer, you +still have to poll the underlying file descriptor too, using the +method described above. +</p> + +<p> +A fourth way to fix the problem is to use a separate thread to read +from stdin. This way works well if you are familiar with thread +programming. This thread can be blocked waiting for input to come in +at all times, while the main thread of your engine does its thinking. +When input arrives, you have the thread put the input into a buffer +and set a flag in a global variable. Your search routine then +periodically tests the global variable to see if there is input to +process, and stops if there is. WinBoard and my Win32 ports of ICC +timestamp and FICS timeseal use threads to handle multiple input +sources. +</p> + +<h2><a name="7">7. Signals</a></h2> + +<p>Engines that run on Unix need to be concerned with two Unix +signals: <tt>SIGTERM</tt> and <tt>SIGINT</tt>. This applies both to +engines that run under xboard and (the unusual case of) engines that +WinBoard remotely runs on a Unix host using the -firstHost or +-secondHost feature. It does not apply to engines that run on +Windows, because Windows does not have Unix-style signals. +<font color=red> +Beginning with version 2, you can now turn off the use of +either or both +signals. See the "feature" command in <a href="#6">section 9</a> below. +</font> +</p> + +<p>First, when an engine is sent the "quit" command, it is also given +a <tt>SIGTERM</tt> signal shortly afterward to make sure it goes away. +If your engine reliably responds to "quit", and the signal causes +problems for you, you should either ignore it by calling +<tt>signal(SIGTERM, SIG_IGN)</tt> at the start of your program, +or disable it with the "feature" command.</p> + +<p>Second, xboard will send an interrupt signal (<tt>SIGINT</tt>) at +certain times when it believes the engine may not be listening to user +input (thinking or pondering). WinBoard currently does this only when +the engine is running remotely using the -firstHost or -secondHost +feature, not when it is running locally. You probably need to know +only enough about this grungy feature to keep it from getting in your +way. +</p> + +<p> +The <tt>SIGINT</tt>s are basically tailored to the needs of GNU Chess 4 +on systems where its input polling code is broken or disabled. +Because they work in a rather peculiar way, it is recommended that you +either ignore <tt>SIGINT</tt> by having your engine call +<tt>signal(SIGINT, SIG_IGN)</tt>, or disable it with the "feature" +command.</p> + +<p> +Here are details for the curious. If xboard needs to send a command +when it is the chess engine's move (such as before the "?" command), +it sends a <tt>SIGINT</tt> first. If xboard needs to send commands when it is +not the chess engine's move, but the chess engine may be pondering +(thinking on its opponent's time) or analyzing (analysis or analyze +file mode), xboard sends a <tt>SIGINT</tt> before the first such command only. +Another <tt>SIGINT</tt> is not sent until another move is made, even if xboard +issues more commands. This behavior is necessary for GNU Chess 4. The +first <tt>SIGINT</tt> stops it from pondering until the next move, but on some +systems, GNU Chess 4 will die if it receives a <tt>SIGINT</tt> when not +actually thinking or pondering. +</p> + +<p> +There are two reasons why WinBoard does not send the Win32 equivalent +of <tt>SIGINT</tt> (which is called <tt>CTRL_C_EVENT</tt>) to local +engines. First, the Win32 GNU Chess 4 port does not need it. Second, I +could not find a way to get it to work. Win32 seems to be designed +under the assumption that only console applications, not windowed +applications, would ever want to send a <tt>CTRL_C_EVENT</tt>. +</p> + +<h2><a name="8">8. Commands from xboard to the engine</a></h2> + +<p> +All commands from xboard to the engine end with a newline (\n), even +where that is not explicitly stated. All your output to xboard must +be in complete lines; any form of prompt or partial line will cause +problems. +</p> + +<p> +At the beginning of each game, xboard sends an initialization string. +This is currently "new\nrandom\n" unless the user changes it with the +initString or secondInitString option. +</p> + +<p> +xboard normally reuses the same chess engine process for multiple +games. At the end of a game, xboard will send the "force" command +(see below) to make sure your engine stops thinking about the current +position. It will later send the initString again to start a new +game. If your engine can't play multiple games, you can disable reuse +<font color=red> +either with the "feature" command (beginning in protocol version +2; see below) or +</font> +with xboard's -xreuse (or -xreuse2) command line +option. xboard will then ask the process to quit after each game and +start a new process for the next game. +</p> + +<dl> +<dt><strong>xboard</strong> +<dd>This command will be sent once immediately after your engine +process is started. You can use it to put your engine into "xboard +mode" if that is needed. If your engine prints a prompt to ask for +user input, you must turn off the prompt and output a newline when the +"xboard" command comes in. +<p> + +<dt><font color=red><strong>protover N</strong></font> +<dd><font color=red> +Beginning in protocol version 2 (in which N=2), this command will +be sent immediately after the "xboard" command. If you receive some +other command immediately after "xboard" (such as "new"), you can +assume that protocol version 1 is in use. The "protover" command is +the only new command that xboard always sends in version 2. All other +new commands to the engine are sent only if the engine first enables +them with the "feature" command. Protocol versions will always be +simple integers so that they can easily be compared. + +<p>Your engine should reply to the protover command by sending the +"feature" command (see below) with the list of non-default feature +settings that you require, if any. + +<p>Your engine should never refuse to run due to receiving a higher +protocol version number than it is expecting! New protocol versions +will always be compatible with older ones by default; the larger +version number is simply a hint that additional "feature" command +options added in later protocol versions may be accepted. +</font> +<p> + +<dt><font color=red><strong>accepted</strong></font> +<dt><font color=red><strong>rejected</strong></font> +<dd><font color=red> +These commands may be sent to your engine in reply to the "feature" +command; see its documentation below. +</font> +<p> + +<dt><strong>new</strong> +<dd>Reset the board to the standard chess starting position. Set +White on move. Leave force mode and set the engine to play Black. +Associate the engine's clock with Black and the opponent's clock with +White. Reset clocks and time controls to the start of a new game. +Stop clocks. Do not ponder on this move, even if pondering is on. +Remove any search depth limit previously set by the sd command. +<p> + +<dt><strong>variant VARNAME</strong> +<dd>If the game is not standard chess, but a variant, this command is +sent after "new" and before the first move or "edit" command. Currently +defined variant names are: + +<table> +<tr align="left"><th>wildcastle<td>Shuffle chess where king can castle from d file +<tr align="left"><th>nocastle<td>Shuffle chess with no castling at all +<tr align="left"><th>fischerandom<td>Fischer Random (not supported yet) +<tr align="left"><th>bughouse<td>Bughouse, ICC/FICS rules +<tr align="left"><th>crazyhouse<td>Crazyhouse, ICC/FICS rules +<tr align="left"><th>losers<td>Win by losing all pieces or getting mated (ICC) +<tr align="left"><th>suicide<td>Win by losing all pieces including king, +or by having fewer pieces when one player has no legal moves (FICS) +<tr align="left"><th><font color=red>giveaway</font> +<td><font color=red>Win by losing all pieces including king, +or by having no legal moves (ICC)</font> +<tr align="left"><th>twokings<td>Weird ICC wild 9 +<tr align="left"><th>kriegspiel<td>Kriegspiel (engines not supported) +<tr align="left"><th>atomic<td>Atomic +<tr align="left"><th>3check<td>Win by giving check 3 times +<tr align="left"><th>unknown<td>Unknown variant (not supported) +</table> +<p> + +<dt><strong>quit</strong> +<dd>The chess engine should immediately exit. This command is used +when xboard is itself exiting, and also between games if the -xreuse +command line option is given (or -xreuse2 for the second engine). +See also <a href="#7">Signals</a> above. +<p> + +<dt><strong>random</strong> +<dd>This command is specific to GNU Chess 4. You can either ignore it +completely (that is, treat it as a no-op) or implement it as GNU Chess +does. The command toggles "random" mode (that is, it sets random = +!random). In random mode, the engine adds a small random value to its +evaluation function to vary its play. The "new" command sets random +mode off. +<p> + +<dt><strong>force</strong> +<dd>Set the engine to play neither color ("force mode"). Stop clocks. +The engine should check that moves received in force mode are legal +and made in the proper turn, but should not think, ponder, or make +moves of its own. +<p> + +<dt><strong>go</strong> +<dd>Leave force mode and set the engine to play the color that is on +move. Associate the engine's clock with the color that is on move, +the opponent's clock with the color that is not on move. Start the engine's +clock. Start thinking and eventually make a move. +<p> + +<dt><font color=red><strong>playother</strong></font> +<dd> +<font color=red> +(This command is new in protocol version 2. It is not +sent unless you enable it with the feature command.) +Leave force mode and set the engine to play the color that is <i>not</i> on +move. Associate the opponent's clock with the color that is on move, +the engine's clock with the color that is not on move. Start the opponent's +clock. If pondering is enabled, the engine should begin pondering. +If the engine later receives a move, it should start thinking and eventually +reply. +</font> +<p> + +<dt><strong>white</strong> +<dd> +<font color=red> +(This command is obsolete as of protocol version 2, but is still +sent in some situations to accommodate older engines unless you disable it +with the feature command.) +</font> +Set White on move. Set the engine to play Black. Stop clocks. +<p> + +<dt><strong>black</strong> +<dd> +<font color=red> +(This command is obsolete as of protocol version 2, but is still +sent in some situations to accommodate older engines unless you disable it +with the feature command.) +</font> +Set Black on move. Set the engine to play White. Stop clocks. +<p> + +<dt><strong>level MPS BASE INC</strong> +<dd>Set time controls. See the <a href="#11">Time Control</a> section below. +<p> + +<dt><strong>st TIME</strong> +<dd>Set time controls. See the <a href="#11">Time Control</a> section +below. The commands "level" and "st" are not used together. +<p> + +<dt><strong>sd DEPTH</strong> +<dd>The engine should limit its thinking to DEPTH ply. +<p> + +<dt><strong>time N</strong> +<dd>Set a clock that always belongs to the engine. N is a number in + centiseconds (units of 1/100 second). Even if the engine changes to + playing the opposite color, this clock remains with the engine. +<p> + +<dt><strong>otim N</strong> + +<dd>Set a clock that always belongs to the opponent. N is a number in +centiseconds (units of 1/100 second). Even if the opponent changes to +playing the opposite color, this clock remains with the opponent. +<p> +If needed for purposes of board display in force mode (where the +engine is not participating in the game) the time clock should be +associated with the last color that the engine was set to play, the +otim clock with the opposite color. +</p> + +<p> +<font color=red> +Beginning in protocol version 2, if you can't handle the time and +otim commands, you can use the "feature" command to disable them; see +below. +</font> +The following techniques from older protocol versions also +work: You can ignore the time and otim commands (that is, treat them +as no-ops), or send back "Error (unknown command): time" the first +time you see "time". +</p> + +<dt><strong>MOVE</strong> +<dd>See below for the syntax of moves. If the move is illegal, print +an error message; see the section "<a href="#9">Commands from the engine to +xboard</a>". If the move is legal and in turn, make it. If not in force +mode, stop the opponent's clock, start the engine's clock, start +thinking, and eventually make a move. +<p> +When xboard sends your engine a move, it normally sends coordinate +algebraic notation. Examples: +<p> +<table> +<tr align="left"><td>Normal moves:<td>e2e4 +<tr align="left"><td>Pawn promotion:<td>e7e8q +<tr align="left"><td>Castling:<td>e1g1, e1c1, e8g8, e8c8 +<tr align="left"><td>Bughouse/crazyhouse drop:<td>P@h3 +<tr align="left"><td>ICS Wild 0/1 castling:<td>d1f1, d1b1, d8f8, d8b8 +<tr align="left"><td>FischerRandom castling:<td>O-O, O-O-O (oh, not zero) +</table> + +<p> +<font color=red> +Beginning in protocol version 2, you can use the feature command +to select SAN (standard algebraic notation) instead; for example, e4, +Nf3, exd5, Bxf7+, Qxf7#, e8=Q, O-O, or P@h3. Note that the last form, +P@h3, is a extension to the PGN standard's definition of SAN, which does +not support bughouse or crazyhouse. +</font> +</p> + +<p> +xboard doesn't reliably detect illegal moves, because it does not keep +track of castling unavailability due to king or rook moves, or en +passant availability. If xboard sends an illegal move, send back an +error message so that xboard can retract it and inform the user; see +the section "<a href="#9">Commands from the engine to xboard</a>". +</p> + +<dt><font color=red><strong>usermove MOVE</strong></font> +<dd><font color=red> +By default, moves are sent to the engine without a command name; +the notation is just sent as a line by itself. +Beginning in protocol version 2, you can use the feature command +to cause the command name "usermove" to be sent before the move. +Example: "usermove e2e4". +</font> +</p> + +<dt><strong>?</strong> +<dd>Move now. If your engine is thinking, it should move immediately; + otherwise, the command should be ignored (treated as a no-op). It + is permissible for your engine to always ignore the ? command. The + only bad consequence is that xboard's Move Now menu command will do + nothing. +<p> +It is also permissible for your engine to move immediately if it gets +any command while thinking, as long as it processes the command right +after moving, but it's preferable if you don't do this. For example, +xboard may send post, nopost, easy, hard, force, quit, +<font color=red> +or other commands +</font> +while the engine is on move. +</p> + +<dt><font color=red><strong>ping N</strong></font> +<dd> +<font color=red> +In this command, N is a decimal number. When you receive the command, +reply by sending the string <strong>pong N</strong>, where N is the +same number you received. Important: You must not reply to a "ping" +command until you have finished executing all commands that you +received before it. Pondering does not count; if you receive a ping +while pondering, you should reply immediately and continue pondering. +Because of the way xboard uses the ping command, if you implement the +other commands in this protocol, you should never see a "ping" command +when it is your move; however, if you do, you must not send the "pong" +reply to xboard until after you send your move. For example, xboard +may send "?" immediately followed by "ping". If you implement the "?" +command, you will have moved by the time you see the subsequent ping +command. Similarly, xboard may send a sequence like "force", "new", +"ping". You must not send the pong response until after you have +finished executing the "new" command and are ready for the new game to +start. + +<p> +The ping command is new in protocol version 2 and will not be sent +unless you enable it with the "feature" command. Its purpose is to +allow several race conditions that could occur in previous versions of +the protocol to be fixed, so it is highly recommended that you +implement it. It is especially important in simple engines that do +not ponder and do not poll for input while thinking, but it is needed in all +engines. +</p> +</font> + +<dt><strong>draw</strong> +<dd>The engine's opponent offers the engine a draw. To accept the +draw, send "offer draw". To decline, ignore the offer (that is, send +nothing). If you're playing on ICS, it's possible for the draw offer +to have been withdrawn by the time you accept it, so don't assume the +game is over because you accept a draw offer. Continue playing until +xboard tells you the game is over. See also "offer draw" below. +<p> + +<dt><strong>result RESULT {COMMENT}</strong> +<dd>After the end of each game, xboard will send you a result command. +You can use this command to trigger learning. RESULT is either 1-0, +0-1, 1/2-1/2, or *, indicating whether white won, black won, the game +was a draw, or the game was unfinished. The COMMENT string is purely +a human-readable comment; its content is unspecified and subject to +change. In ICS mode, it is passed through from ICS uninterpreted. +Example: <pre>result 1-0 {White mates}</pre> +<p> +Here are some notes on interpreting the "result" command. Some apply +only to playing on ICS ("Zippy" mode). +</p> + +<p> +If you won but did not just play a mate, your opponent must have +resigned or forfeited. If you lost but were not just mated, you +probably forfeited on time, or perhaps the operator resigned manually. +If there was a draw for some nonobvious reason, perhaps your opponent +called your flag when he had insufficient mating material (or vice +versa), or perhaps the operator agreed to a draw manually. +</p> + +<p> +You will get a result command even if you already know the game ended +-- for example, after you just checkmated your opponent. In fact, if +you send the "RESULT {COMMENT}" command (discussed below), you will +simply get the same thing fed back to you with "result" tacked in +front. You might not always get a "result *" command, however. In +particular, you won't get one in local chess engine mode when the user +stops playing by selecting Reset, Edit Game, Exit or the like. +</p> + +<dt><font color=red><strong>setboard FEN</strong></font> +<dd><font color=red> +The setboard command is the new way to set up positions, beginning +in protocol version 2. It is not used unless it has been selected +with the feature command. Here FEN is a position in Forsythe-Edwards +Notation, as defined in the PGN standard. + +<p><i>Illegal positions:</i> Note that either setboard or edit can +be used to send an illegal position to the engine. The user can +create any position with xboard's Edit Position command (even, say, +an empty board, or a board with 64 white kings and no black ones). +If your engine receives a position that it considers illegal, +I suggest that you send the response "tellusererror Illegal position", +and then respond to any attempted move with "Illegal move" until +the next new, edit, or setboard command.</p> +</font> +<p> + +<dt><strong>edit</strong> +<dd> +<font color=red> +The edit command is the old way to set up positions. For compatibility +with old engines, it is still used by default, but new engines may prefer +to use the feature command (see below) to cause xboard to use setboard instead. +</font> +The edit command puts the chess engine into a special mode, where +it accepts the following subcommands: +<table> +<tr align="left"><th>c<td>change current piece color, initially white +<tr align="left"><th>Pa4 (for example)<td>place pawn of current color on a4 +<tr align="left"><th>xa4 (for example)<td>empty the square a4 (not used by xboard) +<tr align="left"><th>#<td>clear board +<tr align="left"><th>.<td>leave edit mode +</table> +<font color=red> +See the Idioms section below for additional subcommands used in +ChessBase's implementation of the protocol. +</font> + +<p>The edit command does not change the side to move. To set up a +black-on-move position, xboard uses the following command sequence: +</p> +<pre> + new + force + a2a3 + edit + <edit commands> + . +</pre> + +<p> +This sequence is used to avoid the "black" command, which is now +considered obsolete and which many engines never did implement as +specified in this document. +</p> + +<p> +After an edit command is complete, if a king and a rook are on their +home squares, castling is assumed to be available to them. En passant +capture is assumed to be illegal on the current move regardless of the +positions of the pawns. The clock for the 50 move rule starts at +zero, and for purposes of the draw by repetition rule, no prior +positions are deemed to have occurred. +</p> + +<dt><strong>hint</strong> +<dd>If the user asks for a hint, xboard sends your engine the command +"hint". Your engine should respond with "Hint: xxx", where xxx is a +suggested move. If there is no move to suggest, you can ignore the +hint command (that is, treat it as a no-op). +<p> + +<dt><strong>bk</strong> +<dd>If the user selects "Book" from the xboard menu, xboard will send +your engine the command "bk". You can send any text you like as the +response, as long as each line begins with a blank space or tab (\t) +character, and you send an empty line at the end. The text pops up in +a modal information dialog. +<p> + +<dt><strong>undo</strong> +<dd>If the user asks to back up one move, xboard will send you the +"undo" command. xboard will not send this command without putting you +in "force" mode first, so you don't have to worry about what should +happen if the user asks to undo a move your engine made. (GNU Chess 4 +actually switches to playing the opposite color in this case.) +<p> + +<dt><strong>remove</strong> +<dd>If the user asks to retract a move, xboard will send you the +"remove" command. It sends this command only when the user is on +move. Your engine should undo the last two moves (one for each +player) and continue playing the same color. +<p> + +<dt><strong>hard</strong> +<dd>Turn on pondering (thinking on the opponent's time, also known as +"permanent brain"). xboard will not make any assumption about what +your default is for pondering or whether "new" affects this setting. +<p> + +<dt><strong>easy</strong> +<dd>Turn off pondering. +<p> + +<dt><strong>post</strong> +<dd>Turn on thinking/pondering output. +See <a href="#10">Thinking Output</a> section. +<p> + +<dt><strong>nopost</strong> +<dd>Turn off thinking/pondering output. +<p> + +<dt><strong>analyze</strong> +<dd>Enter analyze mode. See <a href="#12">Analyze Mode</a> section. +<p> + +<dt><strong>name X</strong> <dd>This command informs the engine of its +opponent's name. When the engine is playing on a chess server, xboard +obtains the opponent's name from the server. +<font color=red> +When the engine is +playing locally against a human user, xboard obtains the user's login +name from the local operating system. When the engine is playing +locally against another engine, xboard uses either the other engine's +filename or the name that the other engine supplied in the myname +option to the feature command. By default, xboard uses the name +command only when the engine is playing on a chess server. Beginning +in protocol version 2, you can change this with the name option to the +feature command; see below. +</font> +<p> + +<dt><strong>rating</strong> +<dd>In ICS mode, xboard obtains the ICS opponent's rating from the +"Creating:" message that appears before each game. (This message may +not appear on servers using outdated versions of the FICS code.) In +Zippy mode, it sends these ratings on to the chess engine using the +"rating" command. The chess engine's own rating comes first, and if +either opponent is not rated, his rating is given as 0. +<font color=red> +In the future this command may also be used in other modes, if ratings +are known. +</font> +Example: <pre>rating 2600 1500</pre> +<p> + +<dt><font color=red><strong>ics HOSTNAME</strong></font> +<dd><font color=red> +If HOSTNAME is "-", the engine is playing against a local +opponent; otherwise, the engine is playing on an Internet Chess Server +(ICS) with the given hostname. This command is new in protocol +version 2 and is not sent unless the engine has enabled it with +the "feature" command. Example: "ics freechess.org" +</font> +<p> + +<dt><strong>computer</strong> +<dd>The opponent is also a computer chess engine. Some engines alter +their playing style when they receive this command. +<p> + +<dt><font color=red><strong>pause</strong></font> +<dt><font color=red><strong>resume</strong></font> +<dd><font color=red>(These commands are new in protocol +version 2 and will not be sent unless feature pause=1 is set. At +this writing, xboard actually does not use the commands at all, but it +or other interfaces may use them in the future.) +The "pause" command puts the engine into a special state where it +does not think, ponder, or otherwise consume significant CPU time. +The current thinking or pondering (if any) is suspended and both +player's clocks are stopped. The only command that the interface may +send to the engine while it is in the paused state is "resume". The +paused thinking or pondering (if any) resumes from exactly where it +left off, and the clock of the player on move resumes running from +where it stopped. +</font> +</dl> + +<h3>Bughouse commands:</h3> + +<p> +xboard now supports bughouse engines when in Zippy mode. See +<a href="http://www.tim-mann.org/xboard/zippy.README" +>zippy.README</a> for information on Zippy mode and how to turn on the +bughouse support. The bughouse move format is given above. xboard +sends the following additional commands to the engine when in bughouse +mode. +Commands to inform your engine of the partner's game state may +be added in the future. +</p> + +<dl> +<dt><strong>partner <player></strong> +<dd><player> is now your partner for future games. Example: <pre>partner mann</pre> +<p> + +<dt><strong>partner</strong> +<dd>Meaning: You no longer have a partner. +<p> + +<dt><strong>ptell <text></strong> +<dd>Your partner told you <text>, either with a ptell or an ordinary tell. +<p> + +<dt><strong>holding [<white>] [<black>]</strong> +<dd>White currently holds <white>; black currently holds <black>. + Example: <pre>holding [PPPRQ] []</pre> + +<dt><strong>holding [<white>] [<black>] <color><piece></strong> +<dd>White currently holds <white>; black currently holds <black>, after + <color> acquired <piece>. Example: <pre>holding [PPPRQ] [R] BR</pre> +</dl> + +<h2><a name="9">9. Commands from the engine to xboard</a></h2> + +<p> +<font color=red> +In general, an engine should not send any output to xboard that is not +described in this document. As the protocol is extended, newer +versions of xboard may recognize additional strings as commands that +were previously not assigned a meaning. +</font> +</p> + +<dl> +<dt><font color=red> +<strong>feature FEATURE1=VALUE1 FEATURE2=VALUE2 ...</strong> +</font> + +<dd><font color=red> +Beginning with version 2, the protocol includes the "feature" +command, which lets your engine control certain optional protocol +features. Feature settings are written as FEATURE=VALUE, where +FEATURE is a name from the list below and VALUE is the value to be +assigned. Features can take string, integer, or boolean values; the +type of value is listed for each feature. String values are written +in double quotes (for example, <tt>feature myname="Miracle Chess +0.9"</tt>), integers are written in decimal, and boolean values are +written as 0 for false, 1 for true. Any number of features can be set +in one feature command, or multiple feature commands can be given. + +<p> +Your engine should send one or more feature commands immediately after +receiving the "protover" command, since xboard needs to know the +values of some features before sending further commands to the engine. +Because engines that predate protocol version 2 do not send "feature", +xboard uses a timeout mechanism: when it first starts your engine, it +sends "xboard" and "protover N", then listens for feature commands for +two seconds before sending any other commands. To end this timeout +and avoid the wait, set the feature "done=1" at the end of your last +feature command. To increase the timeout, if needed, set the feature +"done=0" before your first feature command and "done=1" at the end. +If needed, it is okay for your engine to set done=0 soon as it starts, +even before it receives the xboard and protover commands. This can be +useful if your engine takes a long time to initialize itself. It +should be harmless even if you are talking to a (version 1) user +interface that does not understand the "feature" command, since such +interfaces generally ignore commands from the engine that they do not +understand. +</p> + +<p> +The feature command is designed to let the protocol change without +breaking engines that were written for older protocol versions. When +a new feature is added to the protocol, its default value is always +chosen to be compatible with older versions of the protocol that did +not have the feature. Any feature that your engine does not set in a +"feature" command retains its default value, so as the protocol +changes, you do not have to change your engine to keep up with it +unless you want to take advantage of a new feature. Because some +features are improvements to the protocol, while others are meant to +cater to engines that do not implement all the protocol features, the +recommended setting for a feature is not always the same as the +default setting. The listing below gives both default and recommended +settings for most features. +</p> + +<p> +You may want to code your engine so as to be able to work with +multiple versions of the engine protocol. Protocol version 1 does not +send the protover command and does not implement the feature command; +if you send a feature command in protocol version 1, it will have no +effect and there will be no response. In protocol version 2 or later, +each feature F that you set generates the response "accepted F" if the +feature is implemented, or "rejected F" if it is not. Thus an engine +author can request any feature without having to keep track of which +protocol version it was introduced in; you need only check whether the +feature is accepted or rejected. This mechanism also makes it +possible for a user interface author to implement a subset of a +protocol version by rejecting some features that are defined in that +version; however, you should realize that engine authors are likely to +code for xboard and may not be prepared to have a feature that they +depend on be rejected. +</p> + +<p> +Here are the features that are currently defined. +</p> +</font> + +<dl> +<dt><font color=red> +<strong>ping</strong> (boolean, default 0, recommended 1) +</font> +<dd><font color=red> +If ping=1, xboard may use the protocol's new "ping" command; +if ping=0, xboard will not use the command. +</font> + +<dt><font color=red> +<strong>setboard</strong> (boolean, default 0, recommended 1) +</font> +<dd><font color=red> +If setboard=1, xboard will use the protocol's new "setboard" command +to set up positions; if setboard=0, it will use the older "edit" command. +</font> + +<dt><font color=red> +<strong>playother</strong> (boolean, default 0, recommended 1) +</font> +<dd><font color=red> +If playother=1, xboard will use the protocol's new "playother" command +when appropriate; if playother=0, it will not use the command. +</font> + +<dt><font color=red> +<strong>san</strong> (boolean, default 0) +</font> +<dd><font color=red> +If san=1, xboard will send moves to the engine in standard algebraic +notation (SAN); for example, Nf3. If san=0, xboard will send moves in +coordinate notation; for example, g1f3. See MOVE in +<a href="#8">section 8</a> above for more details of both kinds of notation. +</font> + +<dt><font color=red> +<strong>usermove</strong> (boolean, default 0) +</font> +<dd><font color=red> +If usermove=1, xboard will send moves to the engine with the +command "usermove MOVE"; if usermove=0, xboard will send just the move, +with no command name. +</font> + +<dt><font color=red> +<strong>time</strong> (boolean, default 1, recommended 1) +</font> +<dd><font color=red> +If time=1, xboard will send the "time" and "otim" commands to +update the engine's clocks; if time=0, it will not. +</font> + +<dt><font color=red> +<strong>draw</strong> (boolean, default 1, recommended 1) +</font> +<dd><font color=red> +If draw=1, xboard will send the "draw" command if the engine's opponent +offers a draw; if draw=0, xboard will not inform the engine about +draw offers. Note that if draw=1, you may receive a draw offer while you +are on move; if this will cause you to move immediately, you should set +draw=0. +</font> + +<dt><font color=red> +<strong>sigint</strong> (boolean, default 1) +</font> +<dd><font color=red> +If sigint=1, xboard may send SIGINT (the interrupt signal) to +the engine as <a href="#7">section 7</a> above; if sigint=0, it will +not. +</font> + +<dt><font color=red> +<strong>sigterm</strong> (boolean, default 1) +</font> +<dd><font color=red> +If sigterm=1, xboard may send SIGTERM (the termination signal) to +the engine as <a href="#7">section 7</a> above; if sigterm=0, it will +not. +</font> + +<dt><font color=red> +<strong>reuse</strong> (boolean, default 1, recommended 1) +</font> +<dd><font color=red> +If reuse=1, xboard may reuse your engine for multiple games. If +reuse=0 (or if the user has set the -xreuse option on xboard's command +line), xboard will kill the engine process after every game and start +a fresh process for the next game. +</font> + +<dt><font color=red> +<strong>analyze</strong> (boolean, default 1, recommended 1) +</font> +<dd><font color=red> +If analyze=0, xboard will not try to use the "analyze" command; it +will pop up an error message if the user asks for analysis mode. If +analyze=1, xboard will try to use the command if the user asks for +analysis mode. +</font> + +<dt><font color=red> +<strong>myname</strong> (string, default determined from engine filename) +</font> +<dd><font color=red> +This feature lets you set the name that xboard will use for your +engine in window banners, in the PGN tags of saved game files, and when +sending the "name" command to another engine. +</font> + +<dt><font color=red> +<strong>variants</strong> (string, see text below) +</font> +<dd><font color=red> +This feature indicates which chess variants your engine accepts. +It should be a comma-separated list of variant names. See the table +under the "variant" command in <a href="#8">section 8</a> above. If +you do not set this feature, xboard will assume by default that your +engine supports all variants. (However, the -zippyVariants +command-line option still limits which variants will be accepted in +Zippy mode.) It is recommended that you set this feature to the +correct value for your engine (just "normal" in most cases) rather +than leaving the default in place, so that the user will get an +appropriate error message if he tries to play a variant that your +engine does not support. +</font> + +<dt><font color=red> +<strong>colors</strong> (boolean, default 1, recommended 0) +</font> +<dd><font color=red> +If colors=1, xboard uses the obsolete "white" and "black" +commands in a stylized way that works with most older chess engines +that require the commands. See the "<a href="#13">Idioms</a>" section +below for details. If colors=0, xboard does not use the "white" and +"black" commands at all. +</font> + +<dt><font color=red> +<strong>ics</strong> (boolean, default 0) +</font> +<dd><font color=red> +If ics=1, xboard will use the protocol's new "ics" command +to inform the engine of whether or not it is playing on a chess server; +if ics=0, it will not. +</font> + +<dt><font color=red> +<strong>name</strong> (boolean, see text below) +</font> +<dd><font color=red> +If name=1, xboard will use the protocol's "name" command +to inform the engine of the opponent's name; if name=0, it will not. +By default, name=1 if the engine is playing on a chess server; name=0 if not. +</font> + +<dt><font color=red> +<strong>pause</strong> (boolean, default 0) +</font> +<dd><font color=red> +If pause=1, xboard may use the protocol's new "pause" command; +if pause=0, xboard assumes that the engine does not support this command. +</font> + +<dt><font color=red> +<strong>done</strong> (integer, no default) +</font> +<dd><font color=red> +If you set done=1 during the initial two-second timeout after +xboard sends you the "xboard" command, the +timeout will end and xboard will not look for any more feature +commands before starting normal operation. +If you set done=0, the initial timeout is increased to one hour; +in this case, you must set done=1 before xboard will enter normal operation. +</font> +</dl> +<p> + +<dt><strong>Illegal move: MOVE</strong> +<dt><strong>Illegal move (REASON): MOVE</strong> +<dd>If your engine receives a MOVE command that is recognizably a move +but is not legal in the current position, your engine must print an +error message in one of the above formats so that xboard can pass the +error on to the user and retract the move. The (REASON) is entirely +optional. Examples: + +<pre> + Illegal move: e2e4 + Illegal move (in check): Nf3 + Illegal move (moving into check): e1g1 +</pre> +<p> +Generally, xboard will never send an ambiguous move, so it does not +matter whether you respond to such a move with an Illegal move message +or an Error message. +</p> + +<dt><strong>Error (ERRORTYPE): COMMAND</strong> +<dd>If your engine receives a command it does not understand or does +not implement, it should print an error message in the above format so +that xboard can parse it. Examples: +<pre> + Error (ambiguous move): Nf3 + Error (unknown command): analyze + Error (command not legal now): undo + Error (too many parameters): level 1 2 3 4 5 6 7 +</pre> + +<dt><strong>move MOVE</strong> +<dd>Your engine is making the move MOVE. Do not echo moves from +xboard with this command; send only new moves made by the engine. + +<font color=red> +<p>For the actual move text from your chess engine (in place of MOVE +above), your move should be either +<ul> +<li>in coordinate notation (e.g., +e2e4, e7e8q) with castling indicated by the King's two-square move (e.g., +e1g1), or +<li>in Standard Algebraic Notation (SAN) as defined in the +Portable Game Notation standard (e.g, e4, Nf3, O-O, cxb5, Nxe4, e8=Q), +with the extension piece@square (e.g., P@f7) to handle piece placement +in bughouse and crazyhouse. +</ul> +xboard itself also accepts some variants of SAN, but for compatibility +with non-xboard interfaces, it is best not to rely on this behavior. +</p> + +<p>Warning: Even though all versions of this protocol specification +have indicated that xboard accepts SAN moves, some non-xboard +interfaces are known to accept only coordinate notation. See the +Idioms section for more information on the known limitations of some +non-xboard interfaces. It should be safe to send SAN moves if you +receive a "protover 2" (or later) command from the interface, but +otherwise it is best to stick to coordinate notation for maximum +compatibility. An even more conservative approach would be for your +engine to send SAN to the interface only if you have set feature san=1 +(which causes the interface to send SAN to you) and have received +"accepted san" in reply. +</p> +</font> + +<dt><strong>RESULT {COMMENT}</strong> <dd>When your engine detects +that the game has ended by rule, your engine must output a line of the +form "RESULT {comment}" (without the quotes), where RESULT is a PGN +result code (1-0, 0-1, or 1/2-1/2), and comment is the reason. Here +"by rule" means that the game is definitely over because of what +happened on the board. In normal chess, this includes checkmate, +stalemate, triple repetition, the 50 move rule, or insufficient +material; it does not include loss on time or the like. +Examples: +<pre> + 0-1 {Black mates} + 1-0 {White mates} + 1/2-1/2 {Draw by repetition} + 1/2-1/2 {Stalemate} +</pre> + +<p> +xboard relays the result to the user, the ICS, the other engine in Two +Machines mode, and the PGN save file as required. +</p> + +<dt><strong>resign</strong> +<dd>If your engine wants to resign, it can send the command "resign". +Alternatively, it can use the "RESULT {comment}" command if the string +"resign" is included in the comment; for example "0-1 {White +resigns}". xboard relays the resignation to the user, the ICS, the +other engine in Two Machines mode, and the PGN save file as required. +<p> + +<dt><strong>offer draw</strong> +<dd>If your engine wants to offer a draw by agreement (as opposed to +claiming a draw by rule), it can send the command "offer draw". +xboard relays the offer to the user, the ICS, the other engine in Two +Machines mode, and the PGN save file as required. In Machine White, +Machine Black, or Two Machines mode, the offer is considered valid +until your engine has made two more moves. +<p> + +<dt><font color=red><strong>tellopponent MESSAGE</strong></font> +<dd><font color=red> +This command lets the engine give a message to its opponent, +independent of whether the opponent is a user on the local machine or +a remote ICS user (Zippy mode). MESSAGE consists of any characters, +including whitespace, to the end of the line. When the engine is +playing against a user on the local machine, xboard pops up an +information dialog containing the message. When the engine is playing +against an opponent on the ICS (Zippy mode), xboard sends "say +MESSAGE\n" to the ICS. +<p> + +<dt><strong>tellothers MESSAGE</strong> +<dd>This command lets the engine give a message to people watching the +game other than the engine's opponent. MESSAGE consists of any +characters, including whitespace, to the end of the line. When the +engine is playing against a user on the local machine, this command +does nothing. When the engine is playing against an opponent on the +ICS (Zippy mode), xboard sends "whisper MESSAGE\n" to the ICS. +<p> + +<dt><strong>tellall MESSAGE</strong> +<dd>This command lets the engine give a message to its opponent and +other people watching the game, +independent of whether the opponent is a user on the local machine or +a remote ICS user (Zippy mode). MESSAGE consists of any characters, +including whitespace, to the end of the line. When the engine is +playing against a user on the local machine, xboard pops up an +information dialog containing the message. When the engine is playing +against an opponent on the ICS (Zippy mode), xboard sends "kibitz +MESSAGE\n" to the ICS. +</font> +<p> + +<dt><strong>telluser MESSAGE</strong> +<dd>xboard pops up an information dialog containing the message. +MESSAGE consists of any characters, including whitespace, to the end +of the line. +<p> + +<dt><strong>tellusererror MESSAGE</strong> +<dd>xboard pops up an error dialog containing the message. +MESSAGE consists of any characters, including whitespace, to the end +of the line. +<p> + +<dt><strong>askuser REPTAG MESSAGE</strong> +<dd>Here REPTAG is a string containing no whitespace, and MESSAGE +consists of any characters, including whitespace, to the end of the +line. xboard pops up a question dialog that says MESSAGE and +has a typein box. If the user types in "bar", xboard sends "REPTAG +bar" to the engine. The user can cancel the dialog and send nothing. +<p> + +<dt><strong>tellics MESSAGE</strong> +<dd>In Zippy mode, xboard sends "MESSAGE\n" to ICS. MESSAGE consists +of any characters, including whitespace, to the end of the line. +<p> + +<dt><font color=red><strong>tellicsnoalias MESSAGE</strong></font> +<dd><font color=red> +In Zippy mode, xboard sends "xMESSAGE\n" to ICS, where "x" is a +character that prevents the ICS from expanding command aliases, if +xboard knows of such a character. (On chessclub.com and chess.net, +"/" is used; on freechess.org, "$" is used.) MESSAGE consists of any +characters, including whitespace, to the end of the line. +</font> +</dl> +<p> + +<h2><a name="10">10. Thinking Output</a></h2> + +<p> +If the user asks your engine to "show thinking", xboard sends your +engine the "post" command. It sends "nopost" to turn thinking off. +In post mode, your engine sends output lines to show the progress of +its thinking. The engine can send as many or few of these lines as it +wants to, whenever it wants to. Typically they would be sent when the +PV (principal variation) changes or the depth changes. The thinking +output should be in the following format: +</p> + +<pre>ply score time nodes pv</pre> + +Where: +<table> +<tr align="left"><th>ply<td>Integer giving current search depth. +<tr align="left"><th>score<td>Integer giving current evaluation in centipawns. +<tr align="left"><th>time<td>Current search time in centiseconds (ex: +1028 = 10.28 seconds). + +<tr align="left"><th>nodes<td>Nodes searched. +<tr align="left"><th>pv<td>Freeform text giving current "best" line. +You can continue the pv onto another line if you start each +continuation line with at least four space characters. +</table> + +<p> +Example: +</p> + +<pre> 9 156 1084 48000 Nf3 Nc6 Nc3 Nf6</pre> + +<p> +Meaning: +</p> + +9 ply, score=1.56, time = 10.84 seconds, nodes=48000, +PV = "Nf3 Nc6 Nc3 Nf6" + +<p> +Longer example from actual Crafty output: +</p> +<pre> + 4 109 14 1435 1. e4 d5 2. Qf3 dxe4 3. Qxe4 Nc6 + 4 116 23 2252 1. Nf3 Nc6 2. e4 e6 + 4 116 27 2589 1. Nf3 Nc6 2. e4 e6 + 5 141 44 4539 1. Nf3 Nc6 2. O-O e5 3. e4 + 5 141 54 5568 1. Nf3 Nc6 2. O-O e5 3. e4 +</pre> + +<p> +You can use the PV to show other things; for instance, while in book, +Crafty shows the observed frequency of different reply moves in its +book. In situations like this where your engine is not really +searching, start the PV with a '(' character: +</p> + +<pre> + 0 0 0 0 (e4 64%, d4 24%) +</pre> + +<p> +GNU Chess output is very slightly different. The ply number is +followed by an extra nonblank character, and the time is in seconds, +not hundredths of seconds. For compatibility, xboard accepts the +extra character and takes it as a flag indicating the different time +units. Example: +</p> + +<pre> + 2. 14 0 38 d1d2 e8e7 + 3+ 78 0 65 d1d2 e8e7 d2d3 + 3& 14 0 89 d1d2 e8e7 d2d3 + 3& 76 0 191 d1e2 e8e7 e2e3 + 3. 76 0 215 d1e2 e8e7 e2e3 + 4& 15 0 366 d1e2 e8e7 e2e3 e7e6 + 4. 15 0 515 d1e2 e8e7 e2e3 e7e6 + 5+ 74 0 702 d1e2 f7f5 e2e3 e8e7 e3f4 + 5& 71 0 1085 d1e2 e8e7 e2e3 e7e6 e3f4 + 5. 71 0 1669 d1e2 e8e7 e2e3 e7e6 e3f4 + 6& 48 0 3035 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 + 6. 48 0 3720 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 + 7& 48 0 6381 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 + 7. 48 0 10056 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 + 8& 66 1 20536 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5 + 8. 66 1 24387 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5 + 9& 62 2 38886 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4 + d4e4 + 9. 62 4 72578 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4 + d4e4 +10& 34 7 135944 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4 + d4e4 f7f5 e4f4 +10. 34 9 173474 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4 + d4e4 f7f5 e4f4 +</pre> + +<p>If your engine is pondering (thinking on its opponent's time) in post +mode, it can show its thinking then too. In this case your engine may +omit the hint move (the move it is assuming its opponent will make) +from the thinking lines <em>if and only if</em> it sends xboard the move in +the usual "Hint: xxx" format before sending the first line. +</p> + +<h2><a name="11">11. Time control</a></h2> + +<p> +xboard supports three styles of time control: conventional chess clocks, +the ICS-style incremental clock, and an exact number of seconds per move. +</p> + +<p>In conventional clock mode, every time control period is the same. +That is, if the time control is 40 moves in 5 minutes, then after each +side has made 40 moves, they each get an additional 5 minutes, and so +on, ad infinitum. At some future time it would be nice to support a +series of distinct time controls. This is very low on my personal +priority list, but code donations to the xboard project are accepted, +so feel free to take a swing at it. I suggest you talk to me first, +though. +</p> + +<p> +The command to set a conventional time control looks like this: +</p> + +<pre> + level 40 5 0 + level 40 0:30 0 +</pre> + +<p> +The 40 means that there are 40 moves per time control. The 5 means +there are 5 minutes in the control. In the second example, the 0:30 +means there are 30 seconds. The final 0 means that we are in +conventional clock mode. +</p> + +<p> +The command to set an incremental time control looks like this: +</p> + +<pre> + level 0 2 12 +</pre> + +<p> +Here the 0 means "play the whole game in this time control period", +the 2 means "base=2 minutes", and the 12 means "inc=12 seconds". As +in conventional clock mode, the second argument to level can be in +minutes and seconds. +</p> + +<p> +At the start of the game, each player's clock is set to base minutes. +Immediately after a player makes a move, inc seconds are added to his +clock. A player's clock counts down while it is his turn. Your flag +can be called whenever your clock is zero or negative. (Your clock +can go negative and then become positive again because of the +increment.) +</p> + +<p> +A special rule on some ICS implementations: if you ask for a game with +base=0, the clocks really start at 10 seconds instead of 0. xboard +itself does not know about this rule, so it passes the 0 on to the +engine instead of changing it to 0:10. +</p> + +<p> +ICS also has time odds games. With time odds, each player has his own +(base, inc) pair, but otherwise things work the same as in normal +games. The Zippy xboard accepts time odds games but ignores the fact +that the opponent's parameters are different; this is perhaps not +quite the right thing to do, but gnuchess doesn't understand time +odds. Time odds games are always unrated. +</p> + +<p> +The command to set an exact number of seconds per move looks like this: +</p> + +<pre> + st 30 +</pre> + +<p> +This means that each move must be made in at most 30 seconds. Time not used +on one move does not accumulate for use on later moves. +</p> + +<h2><a name="12">12. Analyze Mode</a></h2> + +<p>xboard supports analyzing fresh games, edited positions, and games +from files. However, all of these look the same from the chess +engine's perspective. Basically, the engine just has to respond to the +"analyze" command. +<font color=red> +Beginning in protocol version 2, +if your engine does not support analyze mode, it should use +the feature command to set analyze=0. +</font> +The older method of +printing the error message "Error (unknown command): analyze" in +response to the "analyze" command will also work, however. +</p> + +<p> +To enter analyze mode, xboard sends the command sequence "post", "analyze". +Analyze mode in your engine should be +similar to force mode, except that your engine thinks about what move +it would make next if it were on move. Your engine should accept the +following commands while in analyze mode: +</p> + +<ul> +<li>Any legal move, as in force mode +<li><strong>undo</strong> Back up one move and analyze previous position. +<li><strong>new</strong> Reset position to start of game but stay in analyze mode. +<li><font color=red><strong>setboard</strong> if you have set feature setboard=1; otherwise <strong>edit</strong>. Exiting edit mode returns to analyze mode. +</font> +<li><strong>exit</strong> Leave analyze mode. +<li><strong>.</strong> Send a search status update (optional); see below. +<li><font color=red> +<strong>bk</strong> Show book moves from this position, +if any; see above.</font> +<li><font color=red> +<strong>hint</strong> Show the predicted move from this +position, if any; see above.</font> +</ul> + +<p> +If the user selects "Periodic Updates", xboard will send the string +".\n" to the chess engine periodically during analyze mode, unless the +last PV received began with a '(' character. +</p> + +<p> +The chess engine should respond to ".\n" with a line like this: +</p> + +<pre> +stat01: time nodes ply mvleft mvtot <font color=red>mvname</font> +</pre> + +Where: +<table> +<tr align="left"><th>time<td>Elapsed search time in centiseconds (ie: 567 = 5.67 seconds). +<tr align="left"><th>nodes<td>Nodes searched so far. +<tr align="left"><th>ply<td>Search depth so far. +<tr align="left"><th>mvleft<td>Number of moves left to consider at this depth. +<tr align="left"><th>mvtot<td>Total number of moves to consider. +<tr align="left"><th><font color=red>mvname</font><td><font color=red> +Move currently being considered (SAN or coordinate notation). Optional; +added in protocol version 2.</font> +</table> + +<p> +Examples: +</p> +<pre> + stat01: 1234 30000 7 5 30 + stat01: 1234 30000 7 5 30 Nf3 +</pre> + +<p> +Meaning: +</p> + +<p>After 12.34 seconds, I've searched 7 ply/30000 nodes, there are a + total of 30 legal moves, and I have 5 more moves to search + before going to depth 8. In the second example, of the 30 legal + moves, the one I am currently searching is Nf3.</p> + +<p> +Implementation of the "." command is optional. If the engine does not +respond to the "." command with a "stat01..." line, xboard will stop +sending "." commands. If the engine does not implement this command, +the analysis window will use a shortened format to display the engine +info. +</p> + +<p> +To give the user some extra information, the chess engine can output +the strings "++\n" and "--\n", to indicate that the current search is +failing high or low, respectively. You don't have to send anything +else to say "Okay, I'm not failing high/low anymore." xboard will +figure this out itself. +</p> + +<h2><a name="13">13. Idioms and backward compatibility features</a></h2> + +<p> +Some engines have variant interpretations of the force/go/white/black, +time/otim, and hard/easy command sets. +In order to accommodate these older engines, xboard uses these commands +only according to the stylized patterns ("idioms") given in this section. +The obsolete white and black commands +have historically been particularly troublesome, and it is recommended +that new engines set the feature colors=0 and/or ignore the commands. +</p> + +<dl> + +<dt><strong>time N</strong> +<dt><strong>otim N</strong> +<dt><strong>MOVE</strong> +<dd>Sent when the opponent makes a move and the engine is already +playing the opposite color. +<p> + +<dt><strong>white</strong> +<dt><strong>go</strong> +<dd>Sent when the engine is in force mode or playing Black but should +switch to playing White. This sequence is sent only when White is +already on move. +<font color=red> +If you set the feature colors=0, "white" is not sent. +</font> +<p> + +<dt><strong>black</strong> +<dt><strong>go</strong> +<dd>Sent when the engine is in force mode or playing White but should +switch to playing Black. This sequence is sent only when Black is +already on move. +<font color=red> +If you set the feature colors=0, "black" is not sent. +</font> +<p> + +<dt><strong>white</strong> +<dt><strong>time N</strong> +<dt><strong>otim N</strong> +<dt><strong>black</strong> +<dt><strong>go</strong> +<dd>Sent when Black is on move, the engine is in force mode or playing +White, and the engine's clock needs to be updated before it starts +playing. +The initial "white" is a kludge to accommodate GNU Chess +4's variant interpretation of these commands. +<font color=red> +If you set the feature colors=0, "white" and "black" are not sent. +</font> +<p> + +<dt><strong>black</strong> +<dt><strong>time N</strong> +<dt><strong>otim N</strong> +<dt><strong>white</strong> +<dt><strong>go</strong> +<dd>Sent when White is on move, the engine is in force mode or playing +Black, and the engine's clock needs to be updated before it starts +playing. See previous idiom. +The initial "black" is a kludge to accommodate GNU Chess +4's variant interpretation of these commands. +<font color=red> +If you set the feature colors=0, "black" and "white" are not sent. +</font> +<p> + +<dt><strong>hard</strong> +<dt><strong>easy</strong> +<dd>Sent in sequence to turn off pondering if xboard is not sure +whether it is on. When xboard is sure, it will send "hard" or "easy" +alone. xboard does this because "easy" is a toggle in GNU Chess 4 but +"hard" is an absolute on. + +</dl> + +<p> +To support older engines, certain additional commands from the engine +to xboard are also recognized. (These are commands by themselves, not +values to be placed in the comment field of the PGN result code.) +These forms are not recommended for new engines; use the PGN result +code commands or the resign command instead. +</p> + +<table> +<tr align="left"><th>Command <th>Interpreted as +<tr align="left"><td>White resigns <td>0-1 {White resigns} +<tr align="left"><td>Black resigns <td>1-0 {Black resigns} +<tr align="left"><td>White <td>1-0 {White mates} +<tr align="left"><td>Black <td>0-1 {Black mates} +<tr align="left"><td>Draw <td>1/2-1/2 {Draw} +<tr align="left"><td>computer mates <td>1-0 {White mates} or 0-1 {Black mates} +<tr align="left"><td>opponent mates <td>1-0 {White mates} or 0-1 {Black mates} +<tr align="left"><td>computer resigns <td>0-1 {White resigns} or 1-0 {Black resigns} +<tr align="left"><td>game is a draw <td>1/2-1/2 {Draw} +<tr align="left"><td>checkmate <td>1-0 {White mates} or 0-1 {Black mates} +</table> + +<p> +Commands in the above table are recognized if they begin a line and +arbitrary characters follow, so (for example) "White mates" will be +recognized as "White", and "game is a draw by the 50 move rule" will +be recognized as "game is a draw". All the commands are +case-sensitive. +</p> + +<p> +An alternative move syntax is also recognized: +</p> + +<table> +<tr align="left"><th>Command <th>Interpreted as +<tr align="left"><td>NUMBER ... MOVE <td>move MOVE +</table> + +<p> +Here NUMBER means any string of decimal digits, optionally ending in a +period. MOVE is any string containing no whitespace. In this command +format, xboard requires the "..." even if your engine is playing +White. A command of the form NUMBER MOVE will be ignored. This odd +treatment of the commands is needed for compatibility with gnuchessx. +The original reasons for it are lost in the mists of time, but I +suspect it was originally a bug in the earliest versions of xboard, +before I started working on it, which someone "fixed" in the wrong +way, by creating a special version of gnuchess (gnuchessx) instead of +changing xboard. +</p> + +<p> +Any line that contains the words "offer" and "draw" is recognized as +"offer draw". +</p> + +<p> +The "Illegal move" message is recognized even if spelled "illegal +move" and even if the colon (":") is omitted. This accommodates GNU +Chess 4, which prints messages like "Illegal move (no matching +move)e2e4", and old versions of Crafty, which print just "illegal move". +</p> + +<p> +In Zippy mode, for compatibility with older versions of Crafty, +xboard passes through to ICS any line that begins "kibitz", "whisper", +"tell", or "draw". Do not use this feature in new code. Instead, use the +commands "tellall", "tellothers", "tellopponent", "tellics" (if needed), +"1/2-1/2 {COMMENT}", or "offer draw", as appropriate. +</p> + +<p> +<font color=red> +If the engine responds to the "sd DEPTH" command with an error message +indicating the command is not supported (such as "Illegal move: sd"), +xboard sets an internal flag and subsequently uses the command +"depth\nDEPTH" instead, for the benefit of GNU Chess 4. Note the +newline in the middle of this command! New engines should not rely on +this feature. +</font> +</p> + +<p> +<font color=red> +If the engine responds to the "st TIME" command with an error message +indicating the command is not supported (such as "Illegal move: st"), +xboard sets an internal flag and subsequently uses the command "level +1 TIME" instead, for the benefit of GNU Chess 4. Note that this is +not a standard use of the level command, as TIME seconds are not added +after each player makes 1 move; rather, each move is made in at most +TIME seconds. New engines should not implement or rely on this +feature. +</font> +</p> + +<font color=red> +<p> +In support of the -firstHost/-secondHost features, which allow a chess +engine to be run on another machine using the rsh protocol, xboard recognizes +error messages that are likely to come from rsh as fatal errors. The following +messages are currently recognized: +</p> + +<blockquote> +unknown host<br> +No remote directory<br> +not found<br> +No such file<br> +can't alloc<br> +Permission denied<br> +</blockquote> +</font> + +<p> +<font color=red> +ChessBase/Fritz now implements the xboard/winboard protocol and can use +WinBoard-compatible engines in its GUI. ChessBase's version of the +protocol is generally the same as version 1, except that they have +added the commands <strong>fritz</strong>, <strong>reset</strong>, and +<strong>ponder</strong>, and the edit subcommands +<strong>castle</strong> and <strong>ep</strong>. If you want your +engine to work well with the ChessBase/Fritz GUI, you may need to +implement these additional commands, and you should also be aware of +the peculiar way that ChessBase uses the protocol. See their <a +href="http://www.chessbase.com/Products/engines/winboard/tech.htm" +>web page</a> for documentation. +</font> +</p> + +<p> +<font color=red> +ChessMaster 8000 also implements version 1 of the xboard/winboard +protocol and can use WinBoard-compatible engines. The original +release of CM8000 also has one additional restriction: only pure +coordinate notation (e.g., e2e4) is accepted in the move command. A +patch to correct this should be available from The Learning Company +(makers of CM8000) in February 2001. +</font> +</p> + +<hr noshade size="2"> +<address>converted to HTML by <a href="http://www.jakob.at/steffen/">Steffen A. Jakob</a></address> +</body> +</html> diff --git a/programs/harvar93.txt b/programs/harvar93.txt new file mode 100644 index 0000000..7ce4506 --- /dev/null +++ b/programs/harvar93.txt @@ -0,0 +1,519 @@ +4TH HARVARD CUP HUMAN VERSUS COMPUTER CHESS CHALLENGE +Saturday, 6 November 1993, 10:00 AM-5:30 PM +The Computer Museum, Boston + + + +HUMANS: Patrick Wolff, Michael Rohde, Boris Gulko, Joel Benjamin, +Ilya Gurevich, Alexander Ivanov -- all International Grandmasters. + +PROGRAMS: Kasparov's Gambit (Electronic Arts), BattleChess 4000 +SVGA (Interplay Productions), Socrates Exp (Heuristic Software), +M-Chess Professional (M Chess) -- all running on 60MHz Intel Pentium +processor-based systems. Renaissance SPARC (Saitek Industries +Ltd.) -- SPARC processor. ChessSystem R30 (TASC B.V.) -- ARM processor. + +RULES: Six rounds, six games per round, time control G/25, minimum +10 minute intermission between rounds. Chief Arbiter -- Joel Salman. + +PRIZES: 1st place (human), $1000; 2nd place (human), $500. Top +human and top computer have their names engraved on the permanent +Malcolm H. Weiner Trophy and are invited back to the 5th Harvard Cup. + +SPONSORS: Intel Corporation, Electronic Arts, Interplay +Productions, Heuristic Software/Machiavelli Designs Inc., M Chess, +Saitek Industries Ltd., TASC B.V., Prodigy, USA Today Information +Center, Amerigames International, American Chess Foundation, IBM +PC Company (official computer equipment supplier), United States +Chess Federation (official chess equipment supplier). Special +thanks to The Computer Museum and its staff, the Harvard Chess +Club and its members, the Millburn Ridgefield Corporation, +Malcolm H. Wiener, and everyone who volunteered and helped make +the event a success. + +RESULTS: + +PLAYER (FIDE) SocExp CSR30 MCPro BC400 RenSPARC KGambit TOTAL +Benjamin (2620) b 1-0 b 1-0 w 1-0 b 1-0 w 1-0 w 1-0 6.0 +Ivanov (2535) b 0-1 w 1-0 b 1-0 b 1-0 w 1-0 w 1-0 5.0 +Gulko (2635) b 1/2 w 1-0 b =-= w =-= b 1-0 w 1-0 4.5 +Wolff (2585) w 1-0 b =-= w 0-1 b 1-0 w 1-0 b 1-0 4.5 +Gurevich (2575) w =-= w 0-1 b 1-0 w 1-0 b 1-0 b 1-0 4.5 +Rohde (2575) w 0-1 b 0-1 w 1-0 w 0-1 b =-= b 1-0 2.5 + TOTAL 3.0 2.5 1.5 1.5 0.5 0.0 27-9 + TPR* 2588 2528 2395 2395 2168 ---- + SE* 142 144 164 164 257 --- + +(Tournament performance ratings and standard errors calculated by +Mark Glickman using Newton-Raphson algorithm.) + +Final score: Humans 27 -- Computers 9 (75%-25%) +Top Humans: Joel Benjamin, 6-0 ($1000) + Alexander Ivanov, 5-1 ($500) +Top Computer: Socrates Exp, 3-3 + + +ROUND 1 + +Alexander Ivanov -- Kasparov's Gambit +4th Harvard Cup (1) 1993 +1 e4 e5 2 Nf3 Nc6 3 Bb5 a6 4 Ba4 Nf6 5 0-0 Be7 6 Re1 b5 7 Bb3 d6 8 +c3 0-0 9 h3 Nb8 10 d4 Nbd7 11 Nbd2 Bb7 12 Bc2 Re8 13 Nf1 Bf8 14 +Ng3 g6 15 a4 Bg7 16 Bd3 c6 17 Bg5 h6 18 Bd2 Kh7 19 h4 exd4 20 cxd4 +Kg8 21 Qc1 Kh7 22 h5 c5 23 hxg6+ fxg6 24 e5 dxe5 25 dxe5 Ng4 26 +Bxg6+ Kxg6 27 Qc2+ Kf7 28 Qf5+ Kg8 29 Qxg4 Bxf3 30 Qxf3 Nxe5 31 +Qd1 Nc4 32 Rxe8+ Qxe8 33 Bc3 Rd8 34 Qg4 Ne5 35 Bxe5 Qxe5 36 axb5 +axb5 37 Nf5 Kh8 38 Ra6 Qxb2 39 Rg6 Rd4 40 Nxd4 Qa1+ 41 Kh2 Qxd4 42 +Qxd4 Bxd4 43 Rxh6+ Kg7 44 Rb6 Bxf2 45 Rxb5 Bd4 46 Kg3 Kf6 47 Kf4 +Be5+ 48 Ke4 Bd4 49 Rb8 Kg5 50 Rc8 Kf6 51 g4 Kf7 52 Rd8 Kg6 53 Kf4 +Bg7 54 Rd6+ Kf7 55 Kf5 Ke7 56 Re6+ Kd7 57 g5 Bd4 58 Re4 Kd6 59 g6 +Bg7 60 Re6+ Kd7 61 Ra6 Ke7 62 Ra7+ Kf8 63 Ra8+ Ke7 64 Rc8 Bd4 65 +Kg5 Kd6 66 Kh6 Kd7 67 Rxc5 Kd6 68 Rc8 1-0 + +Ilya Gurevich -- BattleChess 4000 SVGA +4th Harvard Cup (1) 1993 +1 e4 e5 2 Nf3 d6 3 d4 Nf6 4 Nc3 Nbd7 5 Bc4 Be7 6 a4 exd4 7 Nxd4 +Ne5 8 Ba2 0-0 9 0-0 Bd7 10 f4 Bg4 11 Qe1 Ng6 12 h3 Bd7 13 Qf2 Qe8 +14 Bd2 Bxa4 15 Nxa4 Nxe4 16 Qe3 Bh4 17 Nc3 Ng3 18 Rf3 Qxe3+ 19 +Bxe3 a6 20 Bf2 Nh5 21 Bxh4 Nxh4 22 Rf2 Rae8 23 g4 Nf6 24 Kh2 Re3 +25 Re2 Rxe2+ 26 Ndxe2 Re8 27 Kg3 Ng6 28 Kf3 Nh4+ 29 Kf2 h5 30 g5 +Ne4+ 31 Nxe4 Rxe4 32 Bd5 Rb4 33 b3 Kf8 34 Bc4 c6 35 Ra4 Rxa4 36 +bxa4 Ng6 37 Bd3 b5 38 axb5 cxb5 39 Bxg6 fxg6 40 Ke3 Kf7 41 Nd4 d5 +42 Kd3 b4 43 Nc6 Ke6 44 Nxb4 a5 45 Nc6 a4 46 Nd4+ Kf7 47 Kc3 a3 +48 Kb3 a2 49 Kxa2 Ke7 50 Kb3 Kd7 51 Kb4 1-0 + +Socrates Exp -- Joel Benjamin +4th Harvard Cup (1) 1993 +1 e4 c5 2 c3 d5 3 exd5 Qxd5 4 d4 Nf6 5 Nf3 Nc6 6 Na3 Bg4 7 Be2 +cxd4 8 cxd4 e5 9 dxe5 Qxd1+ 10 Bxd1 Bb4+ 11 Bd2 Bxd2+ 12 Kxd2 0-0-0+ +13 Kc1 Ne4 14 Rf1 Rd5 15 Nd2 Nxd2 16 Bxg4+ Kb8 17 Re1 Rhd8 18 +f4 Rc5+ 19 Nc2 Nb4 20 Bd1 Nxc2 21 Bxc2 Rdc8 22 Kxd2 Rxc2+ 23 Ke3 +Rxb2 24 Re2 Rc3+ 25 Kf2 Rxe2+ 26 Kxe2 Ra3 27 Kd2 g6 28 g3 h5 29 +Ke2 b5 30 Kd2 Kb7 31 Kc2 Kb6 32 Kb2 Re3 33 Rc1 Re2+ 34 Rc2 Rxc2+ +35 Kxc2 Kc5 36 Kd3 Kd5 37 Ke3 a5 38 Kd3 b4 39 Ke3 a4 40 Kd3 Kc5 41 +h3 Kd5 42 g4 h4 43 f5 gxf5 44 gxf5 Kxe5 45 f6 Kxf6 46 Kc4 b3 47 +axb3 axb3 48 Kxb3 Ke5 49 Kc3 Kf4 50 Kd4 Kg3 51 Ke4 Kxh3 0-1 + +Patrick Wolff -- M-Chess Professional 3.42 +4th Harvard Cup (1) 1993 +1 e4 c5 2 Nf3 d6 3 d4 cxd4 4 Nxd4 Nf6 5 Nc3 a6 6 Bc4 e6 7 Bb3 b5 8 +0-0 Be7 9 Qf3 Qc7 10 Qg3 b4 11 Nce2 0-0 12 Bh6 Ne8 13 c3 bxc3 14 +Nxc3 Nd7 15 Bxe6 fxe6 16 Nxe6 Qc4 17 Bxg7 Qxe6 18 Bxf8+ Kxf8 19 f4 +Rb8 20 b3 Nef6 21 Rae1 Qg4 22 Qxg4 Nxg4 23 h3 Ngf6 24 e5 Ne8 25 +Nd5 Bh4 26 Re3 dxe5 27 fxe5+ Kg7 28 Re4 Bg5 29 Rg4 Kh6 30 Rf5 Ndf6 +31 Rgxg5 Bxf5 32 Rxf5 Nxd5 33 g4 Ng7 34 Rf7 Ne6 35 Kg2 Rc8 36 Kg3 +Ng5 37 Ra7 Rc3+ 38 Kf2 Nxh3+ 39 Ke1 Re3+ 40 Kd2 Nhf4 41 Rxa6+ Kg5 +42 Ra7 Re2+ 43 Kc1 Nd3+ 0-1 + +Renaissance SPARC -- Boris Gulko +4th Harvard Cup (1) 1993 +1 c4 e5 2 Nf3 e4 3 Nd4 Nc6 4 Nxc6 dxc6 5 Nc3 Nf6 6 g3 Bc5 7 Qb3 0-0 +8 Bg2 Re8 9 0-0 h5 10 Na4 Bd4 11 e3 Be5 12 Nc5 h4 13 Nxb7 Qe7 14 +d4 exd3 15 Na5 hxg3 16 Nxc6 gxf2+ 17 Kh1 Qd6 18 c5 Qxc5 19 Nxe5 +Qxe5 20 Rxf2 Bf5 21 Bxa8 Rxa8 22 a4 Ng4 23 Rf4 Be4+ 24 Kg1 Qh5 25 +Qxf7+ Qxf7 26 Rxf7 Kxf7 27 Bd2 Ke6 28 Rc1 Rh8 29 Rc4 Kd5 30 Rd4+ +Ke5 31 Ba5 c5 32 Bc7+ Kf5 33 Rd7 Nf6 34 Rd6 Ne8 35 Rd8 Nxc7 36 +Rxh8 d2 37 Rf8+ Ke5 38 Rf1 Bc2 39 a5 d1/Q 0-1 + +ChessSystem R30 -- Michael Rohde +4th Harvard Cup (1) 1993 +1 d4 Nf6 2 c4 e6 3 Nf3 Bb4+ 4 Bd2 c5 5 Bxb4 cxb4 6 g3 0-0 7 Nbd2 +Nc6 8 Bg2 d6 9 0-0 e5 10 Qc2 Bg4 11 e3 a5 12 dxe5 dxe5 13 Rfd1 Qe7 +14 Ne4 Rad8 15 h3 Bf5 16 Nfd2 Kh8 17 g4 Bg6 18 Rac1 Rd7 19 g5 Ng8 +20 Nf1 Rfd8 21 Nfg3 h6 22 h4 f5 23 Rxd7 Rxd7 24 h5 fxe4 25 hxg6 +Qxg5 26 Bxe4 Nf6 27 Bf5 Rd8 28 Kf1 Nh5 29 Nxh5 Qxh5 30 Be4 Ne7 31 +Bxb7 Nxg6 32 c5 Nh4 33 c6 Qg4 34 c7 Qh3+ 35 Ke1 Rc8 36 Rd1 1-0 + + +ROUND 2 + +Kasparov's Gambit -- Ilya Gurevich +4th Harvard Cup (2) 1993 +1 d4 Nf6 2 c4 g6 3 Nc3 d5 4 Bf4 Bg7 5 e3 c5 6 dxc5 Qa5 7 Rc1 Ne4 8 +cxd5 Nxc3 9 Qd2 Qxa2 10 bxc3 Qa5 11 Nf3 Nd7 12 c6 bxc6 13 dxc6 Nc5 +14 Qb2 Na4 15 Qa3 0-0 16 Nd4 e5 17 Nb3 Qd5 18 Bxe5 Bxe5 19 Qxa4 +Rb8 20 Nd4 Rb2 21 Qxa7 Bh3 22 Qa3 Rfb8 23 c4 Qe4 24 f3 Qh4+ 25 g3 +Qh6 26 Nb5 Bxf1 27 c7 Re8 28 Rxf1 Qxh2 29 Qd3 Bxc7 30 Kd1 Red8 31 +Nd4 Qg2 32 Ra1 Be5 33 Kc1 Bxd4 34 exd4 Re8 0-1 + +BattleChess 4000 SVGA -- Joel Benjamin +4th Harvard Cup (2) 1993 +1 e4 c5 2 Nc3 Nc6 3 f4 e6 4 Nf3 Nge7 5 d4 cxd4 6 Nxd4 d5 7 Nxc6 +bxc6 8 Be3 Rb8 9 Rb1 Qc7 10 Qd2 dxe4 11 Nxe4 Nd5 12 Bc4 f5 13 Bxd5 +cxd5 14 Nc3 Ba6 15 Bd4 Bd6 16 Qe3 Kf7 17 g3 Rb4 18 a3 Rc4 19 b4 +Rc8 20 Kd2 Qd7 21 Rhe1 Be7 22 Rb3 Rxd4+ 23 Qxd4 Bf6 24 Qf2 Bc4 25 +Rbb1 d4 26 Nd1 d3 27 c3 Qa4 28 Rc1 Qxa3 29 h4 Bb3 30 c4 Qxb4+ 31 +Nc3 Bc2 32 Qxa7+ Kg8 33 Re5 Bxe5 34 fxe5 Qxc4 35 Qa3 Qd4 36 Rf1 +Qxe5 37 Rf4 h6 38 Qb4 Rxc3 39 Qxc3 Qe2+ 40 Kc1 Qd1+ 41 Kb2 Qb1+ 42 +Ka3 d2 43 Rd4 d1/Q 44 Rxd1 Bxd1 45 Qc8+ Kh7 46 Qxe6 Qb3+ 47 Qxb3 +Bxb3 48 Kxb3 Kg6 49 Kc4 Kh5 50 Kd3 Kg4 51 Ke2 Kxg3 52 h5 Kg4 53 +Kd3 Kxh5 54 Kc4 f4 0-1 + +Michael Rohde -- Socrates Exp +4th Harvard Cup (2) 1993 +1 Nf3 Nf6 2 c4 b6 3 Nc3 Bb7 4 d4 d5 5 cxd5 Nxd5 6 Qc2 e6 7 e4 Nxc3 +8 bxc3 Nd7 9 Bd3 Be7 10 0-0 0-0 11 Bf4 c5 12 d5 exd5 13 exd5 Bxd5 +14 Bxh7+ Kh8 15 Bf5 Bxf3 16 gxf3 Bg5 17 Bd6 Be7 18 Bg3 Nf6 19 Rfe1 +Rg8 20 Rad1 Qf8 21 Qe2 Re8 22 Bc2 Bd6 23 Qf1 Rxe1 24 Qxe1 Bxg3 25 +hxg3 Qa8 26 Qe7 Qxf3 27 Re1 Qxc3 28 Bb1 Ra8 29 Rd1 Re8 30 Rd8 Qc1+ +31 Kg2 Rxd8 32 Qxd8+ Ng8 33 Be4 Qh6 34 Bd5 Qh5 35 Qd7 Nf6 36 Qc8+ +Kh7 37 Bf3 Qe5 38 Qb7 Qe6 39 Qxa7 c4 40 a4 c3 41 Qc7 Qb3 42 Qc8 c2 +43 Qh3+ Kg6 44 Qc8 Qb2 45 Be2 c1/Q 46 Bd3+ Kg5 47 Qf5+ Kh6 48 Qh3 +Nh5 49 Qf5 Qf6 0-1 + +M-Chess Professional 3.42 -- Alexander Ivanov +4th Harvard Cup (2) 1993 +1 e4 g6 2 d4 Bg7 3 Nc3 c6 4 Bc4 b5 5 Bb3 a5 6 a4 b4 7 Nce2 d5 8 e5 +Na6 9 Bg5 f6 10 exf6 exf6 11 Bf4 Ne7 12 h3 0-0 13 Nf3 g5 14 Bg3 +Ng6 15 h4 g4 16 Nd2 h5 17 c3 Bf5 18 0-0 Bh6 19 Bc2 Bxc2 20 Qxc2 f5 +21 Nb3 Kg7 22 Be5+ Kh7 23 Ng3 Qxh4 24 Nxf5 Qg5 25 Nxh6 Kxh6 26 +Nxa5 Rac8 27 Bd6 Rf6 28 Bxb4 Nxb4 29 cxb4 Nh4 30 Kh1 Nf3 31 g3 +Nxd4 32 Qc3 Nf3 33 Rfd1 Kg7 34 Nb3 h4 35 Nd4 Kf7 36 Kg2 Rh8 37 +gxh4 Nxh4+ 38 Kf1 g3 39 f3 Ng6 40 b5 Nf4 41 Ne2 Rh1+ 42 Ng1 Rxg1+ +43 Kxg1 Ne2+ 44 Kg2 Nxc3 45 Rd3 Ne2 46 Rb3 Nf4+ 47 Kf1 g2+ 48 Kf2 +Re6 49 Re3 Nh3+ 50 Ke2 Qxe3+ 51 Kd1 Qd3+ 52 Kc1 g1/R mate 0-1 + +Patrick Wolff -- Renaissance SPARC +4th Harvard Cup (2) 1993 +1 e4 c5 2 Nf3 d6 3 d4 Nf6 4 Nc3 cxd4 5 Nxd4 g6 6 Be3 Bg7 7 f3 0-0 +8 Qd2 Nc6 9 Bc4 Qa5 10 0-0-0 Bd7 11 Bb3 Rfc8 12 h4 Ne5 13 Kb1 Nc4 +14 Bxc4 Rxc4 15 Nb3 Qc7 16 h5 gxh5 17 Bh6 Kh8 18 Bxg7+ Kxg7 19 Nd5 +Nxd5 20 Qg5+ Kf8 21 exd5 Rc8 22 Qh6+ Ke8 23 Qxh7 Kd8 24 Rd2 Be8 25 +Re1 a5 26 Nd4 Rb4 27 Qe4 Qd7 28 Rde2 Rc7 29 a3 Rb6 30 Kc1 Qa4 31 +Nf5 Qb3 32 Qxe7+ Rxe7 33 cxb3 Rxe2 34 Rxe2 Bd7 35 Nd4 h4 36 Kd2 +Bc8 37 Re1 h3 38 g4 a4 39 b4 Bd7 40 Rh1 Ra6 41 Rxh3 Rb6 42 Rh7 Be8 +43 g5 Kc8 44 f4 Ra6 45 f5 Rb6 46 f6 Kd8 47 g6 fxg6 48 Ne6+ Kc8 49 +Re7 Bf7 50 Rxf7 Kb8 51 Rd7 Ka7 52 f7 1-0 + +Boris Gulko -- ChessSystem R30 +4th Harvard Cup (2) 1993 +1 d4 c6 2 Nf3 Nf6 3 Bf4 d6 4 e3 Nd5 5 Bg3 Qb6 6 Qc1 g6 7 c4 Nf6 8 +Nc3 Bf5 9 Be2 Bg7 10 0-0 0-0 11 c5 dxc5 12 Na4 Qb4 13 Nxc5 Nbd7 14 +a3 Qb6 15 Na4 Qb3 16 Nc3 Nb6 17 Nd2 Qe6 18 Re1 Nfd5 19 e4 Nxc3 20 +bxc3 Bg4 21 f3 Bh5 22 Rb1 Rfc8 23 Qc2 c5 24 d5 Qf6 25 e5 Qg5 26 f4 +Qh6 27 c4 Bxe2 28 Rxe2 Qh5 29 Nf3 Rc7 30 h3 Qf5 31 Qxf5 gxf5 32 +Rc2 Bh6 33 Ne1 Bg7 34 Nd3 f6 35 Bf2 fxe5 36 fxe5 Na4 37 Re1 Rac8 +38 Nf4 Rd7 39 Bh4 b5 40 cxb5 c4 41 e6 Rb7 42 Bxe7 Bc3 43 Rd1 Rxe7 +44 d6 Rg7 45 Nd5 Rb8 46 Nxc3 Nc5 47 Re2 Kf8 48 Rd5 Rg3 49 Rxc5 +Rxc3 50 d7 Ke7 51 Rc8 Rd3 52 Rxb8 1-0 + + +ROUND 3 + +Boris Gulko -- Kasparov's Gambit +4th Harvard Cup (3) 1993 +1 d4 Nf6 2 Bf4 Nc6 3 Nf3 e6 4 c4 Bb4+ 5 Nbd2 d6 6 a3 Bxd2+ 7 Qxd2 +0-0 8 e3 Qe8 9 Be2 e5 10 Bg3 e4 11 Ng1 Bf5 12 Bh4 Qe7 13 Bd1 a6 14 +Ne2 h6 15 Nc3 g5 16 Bg3 Rad8 17 h4 g4 18 h5 d5 19 cxd5 Nxd5 20 +Nxd5 Rxd5 21 Bb3 Rd7 22 Rc1 Be6 23 Bxe6 Qxe6 24 Rc5 f5 25 0-0 Qf7 +26 Qc2 Rfd8 27 Rc1 Re8 28 Qc4 Qxc4 29 R1xc4 Rf8 30 b4 Rff7 31 a4 +Ne7 32 Bxc7 Nd5 33 Be5 Nb6 34 Rc1 Nxa4 35 Rc8+ Rf8 36 Rxf8+ Kxf8 +37 Rc8+ Ke7 38 Rh8 Nb2 39 Rxh6 Nd3 40 Rh7+ Ke6 41 Rxd7 1-0 + +Michael Rohde -- BattleChess 4000 SVGA +4th Harvard Cup (3) 1993 +1 Nf3 Nf6 2 c4 g6 3 Nc3 d5 4 cxd5 Nxd5 5 Qa4+ Nc6 6 Nxd5 Qxd5 7 e4 +Qe6 8 Bb5 Bd7 9 0-0 Bg7 10 d3 Qd6 11 Be3 Bxb2 12 Rab1 Bg7 13 d4 a6 +14 e5 Qe6 15 d5 Qxd5 16 Rfd1 Qe6 17 Bc4 Nxe5 18 Bxe6 Nxf3+ 19 gxf3 +Bxa4 20 Bb3 Bc6 21 Bd5 Bxd5 22 Rxd5 e6 23 Rd2 b6 24 Rc2 Be5 25 f4 +Bd6 26 Kg2 0-0 27 Rc6 Rfd8 28 Kf3 Kf8 29 Ke2 Ke7 30 h3 Kf6 31 Rd1 +Rab8 32 Kf3 Kf5 33 Rg1 h6 34 h4 Rd7 35 Rcc1 Be7 36 Rh1 h5 37 Rc6 +Rb7 38 Rh2 Rd3 39 Rh1 Bd6 40 Rg1 Bxf4 [time] 0-1 + +Socrates Exp -- Alexander Ivanov +4th Harvard Cup (3) 1993 +1 e4 g6 2 d4 Bg7 3 Nf3 d6 4 Be2 b6 5 0-0 Bb7 6 Nc3 e6 7 d5 e5 8 +Be3 Nd7 9 a4 Ne7 10 a5 a6 11 axb6 cxb6 12 Qd2 0-0 13 Bh6 b5 14 +Bxg7 Kxg7 15 Rfe1 h6 16 Rad1 Rc8 17 Bd3 Qc7 18 Nh4 g5 19 Nf3 Nc5 +20 Rc1 Ng6 21 Qe3 Qd7 22 Bf1 b4 23 Na2 a5 24 Nd2 f5 25 exf5 Rxf5 +26 Nc4 Qc7 27 Qh3 Rcf8 28 Ne3 R5f6 29 Qh5 Bc8 30 Qe2 Rxf2 31 Qxf2 +Rxf2 32 Kxf2 Ne4+ 33 Kg1 Qf7 34 Bd3 Qf2+ 35 Kh1 Nc5 36 Re2 Qh4 37 +Bf5 Ba6 38 g3 Qd4 39 c3 bxc3 40 bxc3 Qa4 41 c4 Ne7 42 Rcc2 Qe8 43 +Rf2 Bc8 44 Bxc8 Qxc8 45 Nc3 Nd3 46 Rfd2 Nb4 47 Rb2 Qc5 48 Re2 Qd4 +49 Nb5 Qe4+ 50 Kg1 Qg6 51 Nc7 Kg8 52 Ne6 Qd3 53 Re1 Ng6 54 Rbb1 h5 +55 Nxg5 h4 56 Rbd1 Qb3 57 Ne4 Nd3 58 Rb1 Qa2 59 Rb8+ Kf7 60 Rf1+ +Ke7 61 Nf5+ Kd7 62 Rb7+ Kd8 63 Nxd6 h3 64 Rf8+ Nxf8 65 Nf7+ 1-0 + +Joel Benjamin -- M-Chess Professional 3.42 +4th Harvard Cup (3) 1993 +1 d4 Nf6 2 Nf3 d5 3 c4 e6 4 Nc3 c5 5 cxd5 exd5 6 Bg5 Be7 7 e3 Nc6 +8 dxc5 0-0 9 Rc1 h6 10 Bh4 Be6 11 Be2 Bxc5 12 Nxd5 Qa5+ 13 Qd2 +Qxd2+ 14 Nxd2 Bxd5 15 Rxc5 g5 16 Bg3 Bxg2 17 Rg1 Bh3 18 f4 Nh7 19 +Nf3 Rfc8 20 fxg5 b6 21 Rc3 hxg5 22 Ba6 Bg4 23 Bxc8 Rxc8 24 Ne5 +Nxe5 25 Bxe5 Rxc3 26 Bxc3 Be6 27 Kf2 f6 28 Bd4 a6 29 a3 b5 30 Rc1 +Bc4 31 Rc3 Kf7 32 b3 Bd5 33 Rc7+ Kg6 34 b4 Nf8 35 Ra7 Ne6 36 Rxa6 +Nxd4 37 exd4 Kf5 38 Ke3 Kg6 39 Rd6 Bb3 40 Rb6 Bc4 41 Rc6 Bb3 42 +Rc3 Be6 43 Rc5 Bd7 44 d5 f5 45 Rc7 f4+ 46 Kd4 Bf5 47 d6 Kf6 48 d7 +Ke7 49 d8/Q+ Kxd8 50 Rc5 Bd7 51 Rxg5 f3 52 Ke3 f2 53 Kxf2 Ke7 54 +h4 Kf6 55 Ke3 Be8 56 Kf4 Bc6 57 h5 1-0 + +Renaissance SPARC -- Ilya Gurevich +4th Harvard Cup (3) 1993 +1 Nf3 Nf6 2 d4 g6 3 c4 Bg7 4 Nc3 d5 5 Qa4+ Bd7 6 Qb3 dxc4 7 Qxc4 +a6 8 Bf4 b5 9 Qc5 0-0 10 Bxc7 Qc8 11 Be5 Qxc5 12 dxc5 Nc6 13 e3 +Nxe5 14 Nxe5 Rfc8 15 Nd3 Bf5 16 a4 Bxd3 17 Bxd3 b4 18 Na2 Nd7 19 +c6 Nc5 20 Nxb4 a5 21 Rc1 Nb3 22 Rc4 axb4 23 Rxb4 Na5 24 Be4 Nxc6 +25 Bxc6 Rxc6 26 0-0 Rc2 27 b3 Bf6 28 Rd1 Ra2 29 Rb7 Rc8 30 g3 Rcc2 +31 Rf1 Bg5 32 Kg2 Bxe3 33 Rxe7 Bxf2 34 Kh3 h5 35 Kh4 Kg7 36 Kh3 +Kh6 37 Rxf7 Bg1 38 g4 Rxh2+ 39 Kg3 h4+ 40 Kf4 Rhf2+ 41 Ke4 Rxf7 42 +Rxf7 h3 43 Rf8 h2 44 Rh8+ Kg5 45 Kd3 Kxg4 46 Rh6 g5 47 Rh7 Kg3 48 +Rh5 g4 49 a5 Kg2 50 Ke4 h1/Q 0-1 + +ChessSystem R30 -- Patrick Wolff +4th Harvard Cup (3) 1993 +1 e4 c5 2 c3 Nf6 3 e5 Nd5 4 d4 cxd4 5 cxd4 d6 6 Nf3 Nc6 7 Nc3 dxe5 +8 dxe5 Nxc3 9 Qxd8+ Nxd8 10 bxc3 Bd7 11 Bd3 e6 12 0-0 Rc8 13 Bd2 +h6 14 Rfe1 Bc5 15 Nd4 0-0 16 Nb3 Be7 17 Rad1 Nc6 18 f4 Rfd8 19 Be3 +Be8 20 Bf2 Kf8 21 Re3 b6 22 Rh3 Nb8 23 Bd4 Ba4 24 f5 exf5 25 Bxf5 +Bd7 26 Rf3 Kg8 27 Bxd7 Rxd7 28 Re1 Nc6 29 Rxf7 Nxd4 30 Nxd4 Kxf7 +31 e6+ Ke8 32 exd7+ Kxd7 33 Rd1 Bf6 34 Nb5+ Ke6 35 Nxa7 Rxc3 36 +Nb5 Rc6 37 Re1+ Kd5 38 Rd1+ Kc4 39 Rc1+ Kd5 40 Rd1+ Ke4 41 a4 Ke3 +42 Re1+ Kd3 43 Kf2 Kc2 44 Kf3 Kb3 45 Re4 Rc4 46 Rxc4 Kxc4 47 Nc7 +Kb4 48 Nd5+ Ka5 49 Ke4 Bd8 50 Nc3 Kb4 51 Kd3 Kb3 52 g3 Be7 53 Nd5 +Bc5 54 Nc3 Bb4 55 Nd5 Ba5 56 Ne7 h5 57 Nd5 Kxa4 58 Nf4 b5 59 Nxh5 +Ka3 60 Nxg7 b4 61 Nf5 b3 62 Ne3 Bc7 63 Nd5 b2 64 Kc2 Ka2 65 Nc3+ +Ka1 1/2-1/2 + + +ROUND 4 + +Joel Benjamin -- Kasparov's Gambit +4th Harvard Cup (4) 1993 +1 d4 Nf6 2 Nf3 d5 3 c4 e6 4 Nc3 Be7 5 Bg5 0-0 6 e3 h6 7 Bh4 Ne4 8 +Bxe7 Qxe7 9 Rc1 Nxc3 10 Rxc3 c6 11 Bd3 dxc4 12 Rxc4 Nd7 13 0-0 e5 +14 dxe5 Nxe5 15 Re4 Nxf3+ 16 Qxf3 Be6 17 Bc4 Rad8 18 Bxe6 fxe6 19 +Qe2 Rd5 20 h3 Rfd8 21 b4 Rd2 22 Qc4 R8d5 23 a4 Kh8 24 b5 c5 25 a5 +b6 26 a6 e5 27 Rg4 Qd7 28 Rg6 Rb2 29 Rc6 Rb4 30 Qe2 Rd2 31 Qf3 Kg8 +32 Qg3 Rxb5 33 Rxh6 Qd3 34 Re1 Rbb2 35 Rg6 Qd7 36 Qxe5 Rxf2 37 Kh2 +Ra2 38 e4 Rad2 39 Re3 Rf7 40 Reg3 Re7 41 Qb8+ Qd8 42 Qf4 Rd4 43 +Qg5 Qd7 44 e5 Rd5 45 Qh4 Rexe5 46 Rh6 Qe7 47 Rh8+ Kf7 48 Rf3+ Ke6 +49 Qg4+ Kd6 50 Qc8 Qc7 51 Qa8 Kd7 52 Rg3 Rg5 53 Re8 Kd6 54 Rge3 c4 +55 Rd8+ Qxd8 56 Qxd8+ Kc6 57 Qc8+ Kb5 58 Qc7 Rd2 59 Rg3 Rxg3 60 +Kxg3 Kxa6 61 Qxc4+ Kb7 62 h4 a5 63 Qf4 [time] 1-0 + +BattleChess 4000 SVGA -- Patrick Wolff +4th Harvard Cup (4) 1993 +1 e4 c5 2 Nf3 d6 3 d4 cxd4 4 Nxd4 Nf6 5 Nc3 Nc6 6 Bg5 e6 7 Qd2 Be7 +8 0-0-0 0-0 9 Nb3 Qb6 10 f3 Rd8 11 Be3 Qc7 12 Qf2 d5 13 Kb1 dxe4 +14 Rxd8+ Bxd8 15 Nxe4 Nxe4 16 fxe4 b6 17 Bf4 e5 18 Be3 Be6 19 Bb5 +Be7 20 Rd1 Nd8 21 Qg3 Nb7 22 Bh6 Bf6 23 Rf1 Qd8 24 Be3 Nd6 25 Rd1 +Qc7 26 Bd3 Qc6 27 Nd2 Rc8 28 Rf1 Kh8 29 h4 Nc4 30 Nxc4 Bxc4 31 Bf2 +Bxh4 32 Qh3 Bxd3 33 Qxd3 Rd8 34 Qe2 Bxf2 35 Qxf2 Qxe4 36 Qxf7 Qf4 +37 a3 Rd1+ 38 Rxd1 Qxf7 39 Rd8+ Qg8 40 Rxg8+ Kxg8 41 b4 h5 42 c4 +h4 43 c5 bxc5 44 bxc5 Kf7 45 Kc2 g5 46 Kd3 g4 47 c6 Ke6 48 Ke3 Kd6 +49 Ke2 Kxc6 50 Kf1 h3 51 gxh3 gxh3 52 Kf2 e4 0-1 + +Ilya Gurevich -- Socrates Exp +4th Harvard Cup (4) 1993 +1 e4 e5 2 Nf3 Nf6 3 Nxe5 d6 4 Nf3 Nxe4 5 d3 Nf6 6 d4 g6 7 Bd3 Bg7 +8 Qe2+ Be6 9 Ng5 Qe7 10 0-0 Nc6 11 c3 Bf5 12 Qxe7+ Nxe7 13 Bxf5 +Nxf5 14 Re1+ Kf8 15 Na3 h6 16 Nf3 Re8 17 Bf4 g5 18 Bg3 Nd5 19 Nc2 +Nde7 20 Re4 Nxg3 21 hxg3 f5 22 Re2 Nd5 23 Rae1 Rxe2 24 Rxe2 Kf7 25 +Kf1 Bf6 26 Nd2 h5 27 Nc4 h4 28 N4e3 hxg3 29 fxg3 Ne7 30 Kf2 Rh7 31 +Nb4 Rh2 32 Nbd5 Nxd5 33 Nxd5 Bd8 34 Ne3 Kg6 35 g4 f4 36 Nf5 Bf6 37 +Re8 Rh8 38 Rxh8 Bxh8 39 Kf3 Kf6 40 Ke4 Ke6 41 d5+ Kf7 42 g3 fxg3 +43 Nxg3 Be5 44 Ne2 Kg6 45 Nc1 Kf6 46 Nd3 Bh2 47 c4 a5 48 a3 a4 49 +Kd4 Bg1+ 50 Kc3 Bc5 51 b4 axb3 52 Kxb3 Bd4 53 Kb4 Ke7 54 Kb5 Kd7 +55 a4 c6+ 56 Kb4 Be3 57 Kc3 c5 58 Ne1 Bf4 59 Nf3 b6 60 Ng1 Ke7 61 +Ne2 Be5+ 62 Kd3 Kf6 63 Ke4 Bb2 64 Ng3 Bc1 65 Nh1 Bf4 66 Nf2 Be5 67 +Kf3 Ke7 68 Ne4 Bf4 69 Ke2 Kd7 70 Kd3 Ke7 71 Kc2 Ke8 72 Kb3 Ke7 73 +a5 bxa5 74 Ka4 Kd7 75 Kxa5 Kd8 76 Kb6 Kd7 77 Kb7 Be3 78 Nc3 Bd2 79 +Na4 Ba5 80 Nb6+ Ke8 81 Kc6 Kd8 82 Nd7 Ke7 83 Nb8 Bc3 84 Kc7 Ba5+ +85 Kc8 Kf6 86 Kd7 Be1 87 Kxd6 Bg3+ 88 Kxc5 Bxb8 89 Kc6 Be5 90 d6 +Ke6 91 c5 Bf4 92 Kb7 Bxd6 93 cxd6 Kxd6 94 Kb6 Ke5 95 Kc5 Kf4 96 +Kd4 Kxg4 97 Ke4 Kg3 98 Kf5 g4 99 Ke4 Kf2 100 Kf4 g3 [time] 1/2-1/2 + +M-Chess Professional 3.42 -- Boris Gulko +4th Harvard Cup (4) 1993 +1 e4 g6 2 d4 Bg7 3 Nc3 Nc6 4 d5 Nb8 5 Nf3 d6 6 Bd3 Nf6 7 0-0 0-0 8 +h3 Nbd7 9 Be3 c6 10 Bd4 Qc7 11 Be2 Re8 12 Qd2 a6 13 Qg5 c5 14 Be3 +b5 15 Qh4 b4 16 Na4 e6 17 dxe6 Rxe6 18 Ng5 Re7 19 Bc4 Bb7 20 Rad1 +Ne5 21 Bd5 Bxd5 22 exd5 Rae8 23 Nxc5 h6 24 Nge4 Nxe4 25 Nxe4 Nd7 +26 Ng3 Qxc2 27 Qxb4 Qxb2 28 Qxb2 Bxb2 29 Bxh6 Ba3 30 f3 f5 31 Bg5 +Re5 32 Bf4 R5e7 33 Kh2 Nb6 34 h4 Kf7 35 h5 Kf6 36 h6 Rh7 37 Rd3 +Bc5 38 Bc1 g5 39 Bb2+ Kg6 40 Bd4 Rxh6+ 41 Kg1 Bxd4+ 42 Rxd4 Rh4 43 +Rd2 Re5 44 Rb1 Rxd5 45 Rxd5 Nxd5 46 Rd1 Ne3 47 Rxd6+ Kf7 48 Rxa6 +Rc4 49 Ra3 Rc1+ 50 Kh2 Re1 51 Rb3 Kg6 52 a4 f4 53 Rb6+ Kg7 54 Nh5+ +Kf7 55 g3 Nf1+ 56 Kg2 Nxg3 57 Nxg3 fxg3 58 a5 Ra1 59 a6 Ra4 60 +Kxg3 Kg7 61 Kf2 Ra3 62 Ke2 Kh7 63 Rc6 Kg7 64 Rd6 Kh7 65 Rb6 Kg7 66 +Re6 Kh7 67 Rd6 Kg7 68 Rd7+ Kg6 69 a7 Kf5 70 Rf7+ Kg6 71 Rb7 Kf5 72 +Rc7 Kf6 73 Rh7 Kf5 74 Rb7 Kf4 75 Rf7+ Ke5 76 Kf2 Ke6 77 Rg7 Kf6 78 +Rc7 Kg6 79 Re7 Kf6 80 Rh7 Kg6 81 Rd7 Kf6 82 Rb7 Kg6 83 Ke1 Kf5 84 +Kd2 Kf4 85 Rf7+ Ke5 86 Rd7 Kf4 87 Kc2 Ra6 88 Rf7+ Ke3 89 Kc3 Ra1 +90 Kc4 Ra2 91 Kc5 Ra1 92 Kb6 Rb1+ 93 Kc7 Rc1+ 94 Kb8 Rb1+ 95 Rb7 +Ra1 96 Rb3+ Kf4 97 a8/Q Rxa8+ 98 Kxa8 1/2-1/2 + +Renaissance SPARC -- Michael Rohde +4th Harvard Cup (4) 1993 +1 Nf3 Nf6 2 d4 e6 3 c4 b6 4 Nc3 Bb4 5 Bg5 h6 6 Bd2 Bb7 7 e3 0-0 8 +Bd3 d6 9 0-0 Nbd7 10 Qa4 c5 11 a3 Bxc3 12 Bxc3 Ne4 13 Be1 Rc8 14 +d5 Ndf6 15 dxe6 fxe6 16 Nh4 Ng4 17 Ng6 Qg5 18 Nxf8 Nxe3 19 fxe3 +Nd2 20 Bh7+ Kh8 21 Bg3 Nxf1 22 Nxe6 Qxe3+ 23 Kxf1 Qxe6 24 Qc2 Qe3 +25 Bxd6 Re8 26 Bg6 Re6 27 Bg3 Rxg6 28 Re1 Qg5 29 Re5 Qf6+ 30 Kg1 +Bc6 31 Qe2 Kh7 32 Qd3 Qf7 33 b4 cxb4 34 axb4 Qd7 35 Qxd7 Bxd7 36 +Re7 Bf5 37 Rxa7 Re6 38 Rc7 Re2 39 Bf2 Be4 40 g4 Kg8 41 Bxb6 Rg2+ +42 Kf1 Rxg4 43 Rd7 Bf5 44 Rd8+ Kf7 45 Bd4 Bd3+ 46 Kf2 Bxc4 47 Kf3 +Rg5 48 Rd7+ Kf8 49 Rc7 Bb5 50 Kf4 Rg2 51 h3 Bd3 52 Kf3 Rg5 1/2-1/2 + +Alexander Ivanov -- ChessSystem R30 +4th Harvard Cup (4) 1993 +1 e4 c5 2 Nf3 Nc6 3 d4 cxd4 4 Nxd4 Nf6 5 Nc3 g6 6 Nxc6 bxc6 7 e5 +Ng8 8 Bc4 Bg7 9 Bf4 Qa5 10 0-0 Bxe5 11 Bxe5 Qxe5 12 Re1 Qf4 13 Re4 +Qf6 14 Re3 d5 15 Bxd5 Bf5 16 Ne4 Bxe4 17 Bxe4 Rc8 18 c3 Nh6 19 Qa4 +Kf8 20 Qxa7 Ng4 21 Rg3 Qe6 22 Qd4 Nf6 23 Bd3 c5 24 Qe3 Qxe3 25 +Rxe3 c4 26 Bf1 e6 27 a4 Ke7 28 a5 Rc5 29 Ra4 Nd5 30 Re2 Ra8 31 Rd2 +Raxa5 32 Rxa5 Rxa5 33 Bxc4 Ra1+ 34 Bf1 Ra2 35 Re2 h5 36 g3 g5 37 +Rc2 g4 38 Bc4 Ra1+ 39 Kg2 Kd6 40 Rd2 Kc5 41 Bxd5 exd5 42 Rd4 Ra7 +43 b4+ Kc6 44 c4 dxc4 45 Rxc4+ Kb5 46 Rc5+ Kxb4 47 Rxh5 Kc3 48 Rf5 +Rc7 49 Rf4 Kd3 50 Rxg4 f6 51 Rf4 Rf7 52 h4 Rf8 53 g4 Rg8 54 Kf3 +Rg6 55 h5 Rh6 56 Rf5 Kd4 57 Kf4 Kd3 58 f3 Kd4 59 Ra5 Kd3 60 Ra3+ +Kc4 61 Kf5 Kb5 62 Re3 Kc5 63 Re6 Kd5 64 Rxf6 1-0 + + +ROUND 5 + +Kasparov's Gambit -- Michael Rohde +4th Harvard Cup (5) 1993 +1 d4 Nf6 2 c4 e6 3 Nc3 Bb4 4 Nf3 b6 5 Bg5 h6 6 Bd2 Bb7 7 e3 0-0 8 +Bd3 d6 9 0-0 Nbd7 10 a3 Bxc3 11 Bxc3 Ne4 12 Be1 f5 13 Nd2 Ndf6 14 +f3 Ng5 15 Bg3 Qe7 16 b4 Rad8 17 Qa4 a6 18 Kh1 Rb8 19 Rae1 Ba8 20 +Qxa6 Bc6 21 c5 d5 22 Bc2 Qd7 23 cxb6 Bb5 24 bxc7 Bxa6 25 cxb8/Q +Rxb8 26 Bxb8 Bxf1 27 h4 Nf7 28 Rxf1 Qc8 29 Bxf5 exf5 30 Bf4 Qc3 31 +Nb1 Qb2 32 Bg3 Nh5 33 Kh2 Nxg3 34 Kxg3 Nd6 35 Re1 Nc4 36 Kh3 Qf2 +0-1 + +Boris Gulko -- BattleChess 4000 SVGA +4th Harvard Cup (5) 1993 +1 d4 Nf6 2 Bf4 d5 3 e3 Bf5 4 c4 Nc6 5 Nc3 e6 6 Nf3 Bb4 7 a3 Bxc3+ +8 bxc3 0-0 9 Bg5 Qe7 10 Bd3 Bxd3 11 Qxd3 dxc4 12 Qxc4 h6 13 Bh4 +Qd8 14 0-0 Qd5 15 Qd3 Ne4 16 Rab1 Nd6 17 Nd2 Ne5 18 Qe2 Ng6 19 Bg3 +Qc6 20 c4 Nf5 21 Rb4 Nxg3 22 hxg3 b6 23 Qh5 Rad8 24 Rc1 Rd6 25 Qb5 +e5 26 Qxc6 Rxc6 27 d5 Rd6 28 e4 Re8 29 c5 Rd7 30 Ra4 Ra8 31 cxb6 +cxb6 32 Rc6 Re8 33 Rac4 f6 34 a4 Ra8 35 Kf1 Kf7 36 Nf3 Ne7 37 Rc7 +Ke8 38 Rc2 Kd8 39 R7c3 Rc8 40 Rxc8+ Nxc8 41 Ke2 Nd6 42 Kd3 f5 43 +Nxe5 fxe4+ 44 Kd4 Rc7 45 Nc6+ Ke8 46 g4 Kd7 47 Re2 Kc8 48 Ke5 Kd7 +49 Rc2 Rc8 50 Kd4 Rc7 51 Rc3 Ke8 52 Ke5 Kd7 53 Kd4 Ke8 54 Re3 Kf7 +55 f3 exf3 56 gxf3 h5 57 Re6 Rxc6 58 dxc6 Kxe6 59 gxh5 Ne8 60 Kc4 +Kd6 61 Kd4 Nf6 62 c7 Kxc7 63 Ke5 Nh5 64 Kf5 Ng3+ 65 Kg6 Ne2 66 +Kxg7 Nd4 67 f4 Ne6+ 68 Kf6 Nxf4 69 Ke5 Ne2 70 Kd5 Nc3+ 71 Kc4 Nxa4 +72 Kb5 Nc5 73 Kb4 Kd6 74 Kb5 Kd5 75 Kb4 a6 76 Kc3 a5 77 Kb2 b5 78 +Kc3 b4+ 79 Kb2 Kc4 80 Kc2 Nd3 81 Kd2 b3 82 Ke3 b2 83 Ke4 a4 84 Kf5 +a3 85 Ke6 Nb4 [time] 1/2-1/2 + +Patrick Wolff -- Socrates Exp +4th Harvard Cup (5) 1993 +1 e4 e5 2 Nf3 Nf6 3 Nc3 Bb4 4 Nxe5 0-0 5 Be2 Re8 6 Nd3 Bxc3 7 dxc3 +Nxe4 8 c4 d6 9 0-0 Nc6 10 Nf4 Ne5 11 f3 Nc5 12 Re1 Bf5 13 Be3 Ng6 +14 Qd2 Bxc2 15 Nh5 Bf5 16 g4 Bd7 17 b4 Ne6 18 f4 Nef8 19 f5 Ne5 20 +Bh6 Qh4 21 Qf4 Bc6 22 Bxg7 Nf3+ 23 Bxf3 Rxe1+ 24 Rxe1 Qxe1+ 25 Kg2 +Bxf3+ 26 Qxf3 Qxb4 27 Bc3 Qxc4 28 Nf6+ Kh8 29 Qe3 Qxa2+ 30 Kh3 Qb1 +31 Nd5+ f6 32 Nxf6 Qf1+ 33 Kh4 Qc4 34 Nxh7+ Qxc3 35 Qxc3+ Kxh7 36 +Qxc7+ Kg8 37 f6 Ne6 38 Qe7 Kh8 39 Qxe6 Rf8 40 g5 a5 41 g6 Rg8 42 +Qf7 Rxg6 43 Qxg6 a4 44 Qg7 mate 1-0 + +M-Chess Professional 3.42 -- Ilya Gurevich +4th Harvard Cup (5) 1993 +1 e4 c5 2 Nf3 e6 3 d4 cxd4 4 Nxd4 a6 5 Bd3 Qc7 6 0-0 Nf6 7 Be3 Be7 +8 Nc3 d6 9 Qf3 Nbd7 10 Qg3 0-0 11 Be2 Re8 12 Bh6 Bf8 13 Bd2 b5 14 +a3 Bb7 15 f3 Rac8 16 Kh1 d5 17 Qxc7 Rxc7 18 exd5 Nxd5 19 Bd3 Nc5 +20 Nxd5 Bxd5 21 Be2 g6 22 Bg5 Rcc8 23 Rfd1 Na4 24 Rab1 Ba2 25 Ra1 +Nxb2 26 Rxa2 Nxd1 27 Bxd1 Red8 28 Bxd8 Rxd8 29 c3 e5 30 Rd2 exd4 +31 Rxd4 Rxd4 32 cxd4 Bxa3 33 Kg1 Bb2 34 d5 Kf8 35 Kf2 Ke7 36 Ke3 +Kd6 37 Kd3 a5 38 Be2 Be5 39 Kc2 b4 40 Kb3 Bxh2 41 Ka4 Kxd5 42 Bd1 +Kd4 43 Kxa5 Bd6 44 Bb3 Ke3 45 Bxf7 Kf2 46 Bd5 Kxg2 47 Be4 Kg3 48 +Kb5 Kf4 49 Kc6 h5 50 Kxd6 h4 51 Bxg6 h3 52 Kc5 h2 53 Kxb4 h1/Q 54 +Be4 Qc1 0-1 + +Alexander Ivanov -- Renaissance SPARC +4th Harvard Cup (5) 1993 +1 e4 c6 2 d4 d5 3 e5 Bf5 4 h4 h5 5 c4 e6 6 Nc3 Nd7 7 cxd5 cxd5 8 +Bg5 Be7 9 Qd2 Bxg5 10 hxg5 Rc8 11 Be2 Bg6 12 Nb5 Rc2 13 Qb4 Qxg5 +14 Nf3 Qxg2 15 Rg1 Qh3 16 Nd6+ Kd8 17 Nxb7+ Kc7 18 Qd6+ Kc8 19 Ba6 +Rc7 20 Nc5+ Kd8 21 Ng5 Qf5 22 Ngxe6+ fxe6 23 Nxe6+ Qxe6 24 Qxe6 +Ne7 25 Rxg6 Rc6 26 Qxc6 Nxc6 27 Rxc6 1-0 + +ChessSystem R30 -- Joel Benjamin +4th Harvard Cup (5) 1993 +1 e4 c5 2 c3 d5 3 exd5 Qxd5 4 d4 Nf6 5 Nf3 Nc6 6 dxc5 Qxd1+ 7 Kxd1 +e5 8 b4 Bf5 9 Nbd2 0-0-0 10 b5 Na5 11 Nxe5 Bxc5 12 Nxf7 Ne4 13 Ke1 +Nxf2 14 Be2 Nxh1 15 Nxh8 Rxh8 16 g4 Bg6 17 a4 Nf2 18 Ba3 Re8 19 +Bxc5 Nd3+ 20 Kf1 Nxc5 21 Ra3 Rf8+ 22 Kg1 Rd8 23 Nf3 Nab3 24 c4 Nd4 +25 Nxd4 Rxd4 26 a5 Bd3 27 Bxd3 Rxd3 28 Rxd3 Nxd3 29 h3 Kc7 30 Kg2 +Kd6 31 Kf3 Ne5+ 32 Ke4 Nxc4 33 Kd4 Nxa5 0-1 + + +ROUND 6 + +Kasparov's Gambit -- Patrick Wolff +4th Harvard Cup (6) 1993 +1 d4 Nf6 2 c4 c5 3 d5 b5 4 cxb5 a6 5 bxa6 g6 6 e4 Nxe4 7 Qa4 Nf6 8 +a7 Na6 9 Nf3 Bg7 10 Bxa6 Rxa7 11 Nc3 0-0 12 Qc4 Bxa6 13 Qxc5 Qb8 +14 a4 Rc8 15 Qa3 Rb7 16 a5 Rb3 17 Qa2 Ng4 18 h3 Ne5 19 Nxe5 Bxe5 +20 f4 Bxc3+ 21 bxc3 Rbxc3 22 Bd2 Rc2 23 Qb1 Rxd2 24 Qxb8 Re2+ 0-1 + +BattleChess 4000 SVGA -- Alexander Ivanov +4th Harvard Cup (6) 1993 +1 d4 g6 2 Nf3 Bg7 3 c3 d6 4 e4 Nf6 5 Bd3 Nbd7 6 0-0 e5 7 Bg5 h6 8 +Bd2 0-0 9 Na3 b6 10 Re1 Bb7 11 Nb5 a6 12 Na3 Re8 13 Qc2 exd4 14 +cxd4 d5 15 e5 Ne4 16 b4 c5 17 bxc5 bxc5 18 Rab1 Qc8 19 Bf4 g5 20 +Be3 cxd4 21 Bxd4 g4 22 e6 Rxe6 23 Bxg7 gxf3 24 Qxc8+ Bxc8 25 Bd4 +Ndc5 26 Bxe4 Nxe4 27 g3 Nd2 28 Rbd1 Re2 29 Nc2 Ne4 30 Nb4 Be6 31 +a3 Rc8 32 Rc1 Rc4 33 Red1 Rxd4 34 Rxd4 Rxf2 35 Kh1 Rg2 36 Rf1 Nf2+ +37 Rxf2 Rxf2 38 h4 Re2 39 Rf4 d4 40 Nd3 Bd5 41 Kg1 Rg2+ 42 Kf1 Rd2 +43 Ne5 d3 44 Rg4+ Kf8 45 Rd4 Be6 46 Nxf3 Ra2 47 Ke1 Rxa3 48 Kd2 +Ke7 49 Rxd3 Rxd3+ 50 Kxd3 Kd6 51 Ke4 Bd5+ 52 Kf4 Bxf3 53 Kxf3 Ke5 +54 Ke3 a5 55 Kd3 Kf5 56 Kc4 Kg4 57 Kd4 Kxg3 58 h5 Kg4 59 Kd3 f5 60 +Kc4 f4 61 Kd3 a4 62 Kc3 f3 63 Kb4 f2 64 Kxa4 f1/Q 65 Kb4 Kxh5 66 +Kc5 Kg4 67 Kd5 Kf5 68 Kd4 Qd1+ 69 Kc5 Ke5 70 Kb5 Kd5 71 Kb6 Kd6 72 +Kb7 Qb3+ 73 Ka8 Kc7 0-1 + +Socrates Exp -- Boris Gulko +4th Harvard Cup (6) 1993 +1 e4 g6 2 d4 Bg7 3 Nf3 d6 4 Be2 Nf6 5 Nc3 0-0 6 0-0 Nc6 7 d5 Nb8 8 +Bf4 Nh5 9 Be3 e5 10 dxe6 fxe6 11 Qd2 Nc6 12 Rad1 Qe7 13 Ng5 Bd7 14 +Nb5 Rac8 15 Bxh5 gxh5 16 f4 h6 17 Nf3 Rf7 18 Kh1 a6 19 Nc3 Rcf8 20 +g3 Qf6 21 Nh4 b5 22 a3 Na5 23 Qe1 Nc4 24 Bc1 Bc6 25 Rf3 Rd7 26 b3 +Nb6 27 Rfd3 Qf7 28 Nf3 Re7 29 Be3 Nd7 30 Bf2 Nf6 31 Bd4 Ng4 32 +Bxg7 Qxg7 33 h3 Nf6 34 Kh2 Nd7 35 Nd4 Bb7 36 Re3 h4 37 f5 Ne5 38 +gxh4 Kh8 39 Rg3 Qf6 40 Nxe6 Rxe6 41 fxe6 Nf3+ 42 Rxf3 Qxf3 43 Nd5 +Rg8 44 Qc3+ Qxc3 45 Nxc3 Re8 46 Nd5 Rxe6 47 Nxc7 Rxe4 48 Rxd6 Re2+ +49 Kg3 Rxc2 50 Nxa6 Rc3+ 51 Kg4 Bxa6 52 Rxh6+ Kg7 53 Rxa6 Rxb3 54 +h5 b4 55 h6+ Kh7 56 a4 Rc3 57 Rb6 Rc4+ 58 Kf3 b3 59 a5 Ra4 60 a6 +b2 61 Rxb2 Rxa6 62 Rb4 Kxh6 63 Kg4 Rc6 64 h4 Ra6 65 h5 Rc6 66 Re4 +Ra6 67 Rc4 Rb6 68 Ra4 Rc6 69 Rd4 Rb6 70 Rc4 Ra6 71 Re4 Rb6 72 Rf4 +Rc6 73 Rb4 Rd6 74 Rh4 Rc6 75 Rd4 Rb6 76 Rc4 Ra6 77 Re4 Rb6 78 Ra4 +Rc6 79 Kg4 Rb6 80 Rd4 Rc6 81 Rf4 1/2-1/2 + +Michael Rohde -- M-Chess Professional 3.42 +4th Harvard Cup (6) 1993 +1 Nf3 d5 2 c4 e6 3 d4 Nf6 4 Nc3 c5 5 cxd5 exd5 6 g3 Nc6 7 Bg2 Be7 +8 0-0 0-0 9 Bg5 cxd4 10 Nxd4 Re8 11 Rc1 Bg4 12 h3 Bd7 13 Nb3 Be6 +14 e3 Rc8 15 Qd2 Ne4 16 Nxe4 Bxg5 17 Nxg5 Qxg5 18 Rfd1 Qh5 19 Kh2 +Bg4 20 Re1 Bf3 21 Nd4 Bxg2 22 Kxg2 f6 23 Rc5 Nxd4 24 Qxd4 Rxc5 25 +Qxc5 b6 26 Qd4 Re4 27 Qd3 Ra4 28 Rc1 Rxa2 29 Rc8+ Kf7 30 Rc7+ Kf8 +31 Qb3 Ra5 32 Qb4+ Rc5 33 Rxc5 bxc5 34 Qxc5+ Kg8 35 Qxa7 Qe8 36 +Qd4 Qb5 37 b4 Kf7 38 Qa7+ Kf8 39 Qa5 Qb7 40 Qc5+ Ke8 41 Kf1 Qd7 42 +h4 Qh3+ 43 Ke1 Qh1+ 44 Ke2 Qe4 45 b5 Qg4+ 46 Ke1 Qd7 47 b6 h6 48 +Kd2 g6 49 Kc3 h5 50 Kb4 Qb7 51 Qd6 Qc8 52 Qxd5 Ke7 53 Qc5+ Kd7 54 +Qxc8+ Kxc8 55 e4 1-0 + +Joel Benjamin -- Renaissance SPARC +4th Harvard Cup (6) 1993 +1 d4 d5 2 c4 c6 3 Nc3 Nf6 4 e3 e6 5 Nf3 Nbd7 6 Bd3 Bd6 7 e4 dxe4 8 +Nxe4 Nxe4 9 Bxe4 0-0 10 0-0 c5 11 Bc2 Qb6 12 Qd3 g6 13 Be3 Be7 14 +Rad1 Qxb2 15 Rb1 Qxa2 16 Ra1 Qxa1 17 Rxa1 Rd8 18 dxc5 Nxc5 19 Qc3 +Bd7 20 Ne5 f5 21 Bxc5 Bxc5 22 Nxd7 Rxd7 23 Qe5 Bd4 24 Qxe6+ Rf7 25 +Rd1 Rd8 26 c5 Rdd7 27 Rxd4 Rde7 28 Bb3 Rxe6 29 Bxe6 1-0 + +Ilya Gurevich -- ChessSystem R30 +4th Harvard Cup (6) 1993 +1 e4 e5 2 Nf3 Nc6 3 Bb5 a6 4 Ba4 Nf6 5 0-0 Be7 6 Re1 b5 7 Bb3 0-0 +8 d4 Nxd4 9 Nxd4 exd4 10 e5 Ne8 11 c3 dxc3 12 Nxc3 Bb7 13 Nd5 d6 +14 e6 f5 15 Bf4 Nf6 16 Nxe7+ Qxe7 17 Rc1 Rae8 18 Qd4 Ne4 19 Qa7 c5 +20 Rxe4 fxe4 21 Bxd6 Qxd6 22 e7+ c4 23 exf8/Q+ Rxf8 24 Rd1 Qf6 25 +Bc2 Qxb2 26 Bb1 c3 27 Qc5 Qe2 28 Rf1 Qd2 29 Qe5 c2 30 Qe6+ Kh8 31 +Bxc2 Qxc2 32 Qe7 Qc8 33 h3 Bd5 34 a3 Qf5 35 Qa7 Bc4 36 Rd1 Bd3 37 +Rc1 Qf6 38 Qe3 a5 39 Rc7 b4 40 axb4 axb4 41 Rb7 Qc3 42 Qb6 Qa1+ 43 +Kh2 Qe5+ 44 Kg1 Qc3 45 Kh2 h6 46 h4 Qe5+ 47 Kg1 Rc8 48 g3 Qa1+ 49 +Kh2 Rc1 50 Kh3 Rh1+ 51 Kg4 Qe5 0-1 + diff --git a/programs/minimax.bib b/programs/minimax.bib new file mode 100644 index 0000000..6723d69 --- /dev/null +++ b/programs/minimax.bib @@ -0,0 +1,1338 @@ +@STRING{header = " +----------------------------------------------------------------------------- +File: minimax.bib +Version: V01-005 of April 2nd, 1993 +Author: Claude G. Diderich + 30, Avenue S.Reymondin, CH-1009 Pully, Switzerland, Europe + E-mail: [email protected] +Copyright: (c) 1992..93 by Claude G. Diderich, Switzerland + Non commercial usage permitted as long as the above copyright no- + tice is included. +Note: Please send all modifications and additions to this file to + [email protected] indicates if a copy of the article + is available to me (If you have a copy of an article marked NO, + I would be gratefull if you could send me a copy of it).Any other + indication in the AVAILABLE field are for personal use of the + author. +Thanks: I would like to thank the following persons (in alphabetical or- +MONTH der) for their contributions: + David Barnard <[email protected]>, + Bruno Charlier <[email protected]> + Van-Dat Cung <[email protected]>, + Rainer Feldmann <[email protected]>, + Marc Gengler <[email protected]>, + Rattikorn Hewett <[email protected]>, + Toshihide Ibaraki <[email protected]>, + L. V. Kale <[email protected]>, + Richard E. Korf <[email protected]>, + Bradley C. Kuszmauk <[email protected]>, + T. A. Marsland <[email protected]>, + Judea Pearl <[email protected]>, + Wim Pijls <[email protected]>, + Udo Sprute <[email protected]> +----------------------------------------------------------------------------- +"} + +@STRING{artint = "Artificial Intelligence"} +@STRING{ieeetoc = "{IEEE} Transactions on Computers"} +@STRING{ieeetopami = "{IEEE} Transactions on Pattern Analysis and + Machine Intelligence"} +@STRING{ijprai = "International Journal of Pattern + Recognition and Artificial Intelligence"} +@STRING{iccaj = "ICCA Journal"} +@STRING{jalgo = "Journal of Algorithms"} +@STRING{jpdc = "Journal of Parallel and Distributed Computing"} +@STRING{parcomp = "Parallel Computing"} +@STRING{infocon = "Information and Control"} +@STRING{spex = "Software: Practice and Experience"} + +@INPROCEEDINGS{Abra88, + AUTHOR = "Bruce Abramson and Richard E. Korf", + TITLE = "A Model of Two-player Evaluation Functions", + BOOKTITLE = "Proceedings of the Sixth National Conference on Artificial + Intelligence (AAAI-87)", + ADDRESS = "Seattle, WA", + YEAR = 1987, + MONTH = Jul, + PAGES = "90--94", + AVAILABLE = "ETHICS" +} + +@ARTICLE{Abra89, + AUTHOR = "Bruce Abramson", + TITLE = "Control Strategies for Two-Player Games", + JOURNAL = acmcs, + VOLUME = 21, + NUMBER = 2, + PAGES = "137--161", + MONTH = Jun, + YEAR = 1989 +} + + +@TECHREPORT{Akl79, + AUTHOR = "Selim G. Akl and David T. Barnard and Ralph J. Doran", + TITLE = "Searching Game Trees in Parallel", + INSTITUTION = "Queen's University, Department of Computing and + Information Science", + YEAR = 1979, + MONTH = Nov, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@INPROCEEDINGS{Akl80, + AUTHOR = "Selim G. Akl and David T. Barnard and Ralph J. Doran", + TITLE = "Simulation and Analysis in Deriving Time and Storage + Requirements for a Parallel Alpha-beta Algorithm", + BOOKTITLE = "International Conference on Parallel Processing", + PAGES = "231--234", + YEAR = 1980, + AVAILABLE = "ETHICS" +} + +@ARTICLE{Akl82, + AUTHOR = "Akl, Selim G. and Barnard, David T. and Doran, Ralph J.", + TITLE = "Design, Analysis, and Implementation of a Parallel Tree + Search Algorithm", + JOURNAL = ieeetopami, + YEAR = 1982, + VOLUME = "PAMI-4", + NUMBER = 2, + MONTH = Mar, + PAGES = "192--203" +} + +@INBOOK{Akl89, + AUTHOR = "Selim G. Akl", + TITLE = "The Design and Analysis of Parallel Algorithms", + CHAPTER = "12 -- Traversing Combinatorial Spaces", + PAGES = "310--340", + PUBLISHER = "Prentice Hall", + ADDRESS = "Englewood Cliffs, NJ", + YEAR = 1989, + AVAILABLE = "EPFL-BC" +} + +@TECHREPORT{Almq88, + AUTHOR = "Kenneth Almquist and Neil McKenzie and Kenneth Sloan", + TITLE = "An Inquiry into Parallel Algorithms for Searching + Game Trees", + INSTITUTION = "University of Washington, Department of Computer Science", + ADDRESS = "Seattle, WA", + YEAR = 1988, + MONTH = Dec, + NUMBER = "88-12-03" +} + +@TECHREPORT{Alth88, + AUTHOR = {Ingo Alth\"ofer}, + TITLE = "A Parallel Game Tree Search Algorithm with a Linear + Speedup", + YEAR = 1988, + MONTH = Dec, + NOTE = "submitted to Journal of Algorithms, accepted 1992", + INSTITUTION = {University of Bielefeld, Faculty for Mathematics}, + ADDRESS = "Bielefeld, Germany" +} + +@ARTICLE{Alth90, + AUTHOR = {Ingo Alth\"ofer}, + TITLE = "An Incremental Negamax Algorithm", + JOURNAL = artint, + YEAR = 1990, + VOLUME = 43, + PAGES = "57--65" +} + +@ARTICLE{Alth91, + AUTHOR = {Ingo Alth\"ofer and Bernhard Balkenhol}, + TITLE = "A Game Tree with Distinct Leaf Values which is easy + for the Alpha-beta Algorithm", + JOURNAL = artint, + PAGES = "183--190", + VOLUME = 52, + YEAR = 1991, + AVAILABLE = "EPFL-DMA" +} + +@PHDTHESIS{Amig91, + AUTHOR = "Claude Amiguet", + TITLE = "Contr\^oleurs Distribu\'es pour la Programmation + Heuristique", + SCHOOL = "Swiss Federal Institute of Technology, Department of + Computer Science", + NUMBER = 910, + ADDRESS = "Lausanne, Switzerland", + YEAR = 1991, + NOTE = "In french" +} + +@INPROCEEDINGS{Bal86a, + AUTHOR = "Henri E. Bal and Robbert {van Renesse}", + TITLE = "Parallel Alpha-Beta Search", + BOOKTITLE = "Proceedings NGI-SION Symposium Stimulerende Informatica", + ADDRESS = "Utrecht, Netherlands", + PAGES = "379--385", + MONTH = Apr, + YEAR = 1986, + AVAILABLE = "EPFL-LITH" +} + +@ARTICLE{Ball86b, + AUTHOR = "Henri E. Bal and Robbert {van Renesse}", + TITLE = "A Summary of Parallel Alpha-Beta Search Results", + JOURNAL = iccaj, + YEAR = 1986, + VOLUME = 9, + NUMBER = 3, + PAGES = "146--149", + MONTH = Sep, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Ball83, + AUTHOR = "Bruce W. Ballard", + TITLE = "The *-Minimax Search Procedure for Trees Containing Chance + Nodes", + JOURNAL = artint, + VOLUME = 21, + PAGES = "327--350", + YEAR = 1983 +} + +@ARTICLE{Baud78a, + AUTHOR = "G\'erard M. Baudet", + TITLE = "On the Branching Factor of the Alpha-Beta Pruning + Algorithm", + JOURNAL = artint, + VOLUME = 10, + PAGES = "173--199", + YEAR = 1978 +} + +@PHDTHESIS{Baud78b, + AUTHOR = "G\'erard M. Baudet", + TITLE = "The Design and Analysis of Algorithms for Asynchronous + Multiprocessors", + SCHOOL = "Carnegie Mellon University", + YEAR = 1978, + NUMBER = "CMU-CS-78-116", + ADDRESS = "Pittsburgh, PA", + AVAILABLE = "ETHICS MICROFICHES" +} + +@INBOOK{Beal80, + AUTHOR = "D. F. Beal", + CHAPTER = "An Analysis of Minimax", + TITLE = "Advances in Computer Chess 2", + YEAR = 1980, + NOTE = "Editor: M. R. B. Clarke", + PAGES = "103--109", + PUBLISHER = "Edinburgh University Press.", + AVAILABLE = "ETHICS" +} + +@PHDTHESIS{Berl75, + AUTHOR = "Hans Jack Berliner", + TITLE = "Chess as Problem Solving", + SCHOOL = "Carnegie Mellon University", + YEAR = 1975, + ADDRESS = "Pittsburgh, PA", + AVAILABLE = "ETHICS MICROFICHES" +} + +@ARTICLE{Berl89, + AUTHOR = "Hans Jack Berliner and Carl Eberling", + TITLE = "Pattern Knowledge and Search: {T}he {SUPREME} + Architecture", + JOURNAL = artint, + YEAR = 1989, + VOLUME = 38, + NUMBER = 2, + PAGES = "161--198" +} + +@ARTICLE{Berl90, + AUTHOR = "Hans Jack Berliner and Gordon Goetsch and + Murray S. Campbell and Carl Ebeling", + TITLE = "Measuring the Performance Potential of Chess Programs", + JOURNAL = artint, + YEAR = 1990, + VOLUME = 43, + NUMBER = 1, + MONTH = Apr, + PAGES = "7--21", + AVAILABLE = "EPFL-DMA" +} + +@TECHREPORT{Bohm89, + AUTHOR = {Max B\"ohm and Ewald Speckenmeyer}, + TITLE = "A Dynamic Processor Tree for Solving Game Trees in + Parallel", + INSTITUTION = "University of Dortmund, Fachbereich Informatik", + ADDRESS = "Dortmund, Germany", + YEAR = 1989, + AVAILABLE = "Also in: Proceedings SOR '89" +} + +@TECHREPORT{Bord90, + AUTHOR = "Andrei Z. Broder and Anna R. Karlin and Prabhakar + Raghavan and Eli Upfal", + TITLE = "On the Parallel Complexity of Evaluating Game-Trees", + INSTITUTION = "IBM Research Division", + NUMBER = "RR RJ 7729", + MONTH = Oct, + YEAR = 1990, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@INBOOK{Brat82, + AUTHOR = "I. Bratko and M. Gams", + CHAPTER = "Error Analysis of the Minimax Principle", + TITLE = "Advances in Computer Chess 3", + YEAR = 1982, + NOTE = "Editor: M. R. B. Clarke", + PAGES = "1--15", + PUBLISHER = "Pergamon Press", + AVAILABLE = "ETHICS" +} + +@ARTICLE{Camp83, + AUTHOR = "Murray S. Campbell and T. A. Marsland", + TITLE = "A Comparison of Minimax Tree Search Algorithms", + JOURNAL = artint, + VOLUME = 20, + PAGES = "347--367", + YEAR = 1983 +} + +@ARTICLE{Chak92, + AUTHOR = "P. P. Chakrabarti and S. Ghose", + TITLE = "A General Best First Search Algorithm in And/Or Graphs", + JOURNAL = jalgo, + VOLUME = 13, + NUMBER = 2, + PAGES = "177-187", + MONTH = Jun, + YEAR = 1992, + AVAILABLE = "EPFL-DMA" +} + +@TECHREPORT{Cung91, + AUTHOR = "Van-Dat Cung and Catherine Roucairol", + TITLE = "Parallel Minimax Tree Searching", + INSTITUTION = "INRIA", + TYPE = "RR", + NUMBER = 1549, + YEAR = 1991, + MONTH = Nov, + NOTE = "In French, will appear in English" +} + +@ARTICLE{Darw83, + AUTHOR = "Nevin M. Darwish", + TITLE = "A Quantitative Analysis of the Alpha-Beta Pruning + Algorithm", + JOURNAL = artint, + VOLUME = 21, + PAGES = "405--433", + YEAR = 1983 +} + +@TECHREPORT{Dide92, + AUTHOR = "Claude G. Diderich", + TITLE = "Evaluation des Performances de l'Algorithme {SSS*} avec + Phases de Synchronisation sur une Machine Parall\`ele \`a + M\'emoires Distribu\'ees", + ADDRESS = "Lausanne, Switzerland", + INSTITUTION = "Swiss Federal Institute of Technology, Department of + Computer Science, Laboratory for Theoretical Computer + Science", + MONTH = Jun, + YEAR = 1992, + NOTE = "In french", + AVAILABLE = "Contact <[email protected]> for a copy" +} + +@MASTERSTHESIS{Feld87, + AUTHOR = "Rainer Feldmann and Peter Mysliwietz", + TITLE = "{Parallele Spielbaumsuche}", + NOTE = "Diplomarbeit, In german", + SCHOOL = "University of Paderborn", + ADDRESS = "Paderborn, Germany", + YEAR = 1987, + MONTH = Dec +} + +@ARTICLE{Feld89, + AUTHOR = "Rainer Feldmann and Burkhard Monien and Peter Mysliwietz and + Oliver Vornberger", + TITLE = "Distributed Game Tree Search", + JOURNAL = iccaj, + VOLUME = 12, + NUMBER = 2, + YEAR = 1989, + PAGES = "65--73", + NOTE = "\Star", + AVAILABLE = "NO" +} + +@INPROCEEDINGS{Feld90a, + AUTHOR = "Rainer Feldmann and Burkhard Monien and Peter Mysliwietz and + Oliver Vornberger", + TITLE = "Distributed Game Tree Search", + BOOKTITLE = "Parallel Algorithms for Machine Intelligence and Vision", + EDITOR = "Vipin Kumar, P. S. Gopalakrishnan, Laveen N. Kanal", + PUBLISHER = "Springer-Verlag", + PAGES = "66--101", + YEAR = 1990, + AVAILABLE = "EPFL-BC" +} + +@INBOOK{Feld90b, + AUTHOR = "Rainer Feldmann and Peter Mysliwietz and Burkhard Monien", + TITLE = "Advances in Computer Chess 6", + CHAPTER = "1 --- A Fully Distributed Chess Program", + PAGES = "1--27", + PUBLISHER = "Ellis Horwood", + YEAR = 1990, + AVAILABLE = "ETHICS", + NOTE = "Editor: D. Beal", +} + +@INPROCEEDINGS{Feld90c, + AUTHOR = "Rainer Feldmann, Peter Mysliwietz, Burkhard Monien", + TITLE = "{Spielbaumsuche auf einem Transputernetzwerk}", + BOOKTITLE = "Parallel - Algorithmen und -Rechnerstrukturen (PARS), + Workshop Sprachen und Systeme zur Parallelverarbeitung", + PUBLISHER = {Gesellschaft f\"ur Informatik}, + YEAR = 1990, + MONTH = Jan, + NOTE = "In german" +} + +@INPROCEEDINGS{Feld91a, + AUTHOR = "Rainer Feldmann and Peter Mysliwietz and Burkhard Monien", + TITLE = "Distributed Game Tree Search on a Massively + Parallel System", + BOOKTITLE = "Data structures and efficient algorithms: Final + report on the {DFG} special joint initiative", + PUBLISHER = "Springer-Verlag", + EDITOR = "B. Monien, Th. Ottmann", + PAGES = "270--288", + VOLUME = "LNCS 594", + MONTH = Sep, + YEAR = 1991, + AVAILABLE = "EPFL-BC" +} + +@INPROCEEDINGS{Feld91b, + AUTHOR = "Rainer Feldmann and Peter Mysliwietz and Burkhard Monien", + TITLE = "Experiments with a Fully Distributed Chess Program", + BOOKTITLE = "Heuristic Programming in Artificial Intelligence 3", + EDITOR = "J. van den Herik, V. Allis", + YEAR = 1991, + PAGES = "72--87", + NOTE = "Also in: Tech.Report, University Paderborn, + Paderborn, Germany" + +} + +@INPROCEEDINGS{Felt88, + AUTHOR = "E. W. Felten and S. W. Otto", + TITLE = "Chess on a Hypercube", + BOOKTITLE = "The Third Conference on Hypercube Concurrent + Computers and Applications", + EDITOR = "Geoffrey Fox", + PAGES = "1329--1341", + VOLUME = "II-Applications", + YEAR = 1988, + ADDRESS = "Passadena, CA", + AVAILABLE = "ETHICS" +} + +@INPROCEEDINGS{Ferg88, + AUTHOR = "C. Ferguson and Richard E. Korf", + TITLE = "Distributed Tree Search and its application to + alpha-beta pruning", + BOOKTITLE = "Proceedings of the Seventh National Conference Artificial + Intelligence (AAAI-88)", + ADDRESS = "Minneapolis, MN", + YEAR = 1988, + MONTH = Aug, + PAGES = "128--132", + AVAILABLE = "ETHICS" +} + +@INPROCEEDINGS{Fink80, + AUTHOR = "Raphael A. Finkel and John P. Fishburn", + TITLE = "Parallel Alpha-Beta Search on Arachne", + BOOKTITLE = "IEEE International Conference on Parallel Processing", + PAGES = "235--243", + YEAR = 1980, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Fink82, + AUTHOR = "Raphael A. Finkel and John P. Fishburn", + TITLE = "Parallelism in Alpha-Beta Search", + JOURNAL = artint, + YEAR = 1982, + VOLUME = 19, + PAGES = "89--106" +} + +@ARTICLE{Fink83, + AUTHOR = "Raphael A. Finkel and John P. Fishburn", + TITLE = "Improved Speedup Bounds for Parallel Alpha-Beta Search", + JOURNAL = ieeetopami, + YEAR = 1983, + VOLUME = "PAMI-5", + NUMBER = 1, + PAGES = "89--92" +} + +@INBOOK{Fish84, + AUTHOR = "John P. Fishburn", + TITLE = "Analysis of Speedup in Distributed Algorithms", + CHAPTER = "4 -- {P}arallel Alpha-Beta Search", + PAGES = "11-54", + PUBLISHER = "UMI Research Press", + YEAR = 1984, + VOLUME = 14, + SERIES = "Computer Science: Distributed Database Systems", + NOTE = "Revision of thesis (PhD) -- University of Wisconsin, + Madison, 1981" +} + +@TECHREPORT{Full73, + AUTHOR = "S. H. Fuller and J. G. Gaschnig and J. J. Gillogly", + TITLE = "An Analysis of the Alpha-beta Pruning Algorithm", + ADDRESS = "Pittsburgh", + INSTITUTION = "Carnegie-Mellon University, Department of Computer Science", + MONTH = Jul, + YEAR = 1973, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@INPROCEEDINGS{Hewe92, + AUTHOR = "R. Hewett and K. Ganesan", + TITLE = "Consistent Linear Speedup in Parallel Alpha-Beta Search", + BOOKTITLE = "ICCI'92, Computing and Information", + PUBLISHER = "IEEE Computer Society Press", + PAGES = "237--240", + YEAR = 1992, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Hiro87, + AUTHOR = "Usui Hiromoto and Yamashita Masafumi and Imai Masaharu and + Ibaraki, Toshihide", + TITLE = "Parallel Searches of Game Trees", + JOURNAL = "Systems and Computers in Japan", + NUMBER = "8", + PAGES = "97--109", + VOLUME = 18, + YEAR = 1987, + AVAILABLE = "ETHICS" +} + +@ARTICLE{Hora90, + AUTHOR = "Helmut Horacek", + TITLE = "Reasonning with Uncertainty in Computer Chess", + JOURNAL = artint, + YEAR = 1990, + VOLUME = 43, + PAGES = "37--56" +} + +@INBOOK{Hsu89, + AUTHOR = "Feng-Hsiung Hsu and T. S. Anantharaman and + Murray S. Campbell and A. Nowatzyk", + TITLE = "Computers, Chess, and Cognition", + CHAPTER = "5 Deep Thought", + PAGES = "55--78", + YEAR = 1990, + PUBLISHER = "Springer Verlag", + AVAILABLE = "ETHICS" +} + +@PHDTHESIS{Hsu90, + AUTHOR = "Feng-Hsiung Hsu", + TITLE = "Large Scale Parallelization of Alpha-Beta Search: An + Algorithmic and Architectural Study with Computer Chess", + SCHOOL = "Carnegie Mellon University", + MONTH = Feb, + YEAR = 1990, + NUMBER = "CMU-CS-90-108", + ADDRESS = "Pittsburgh, PA" +} + +@ARTICLE{Hunt88, + AUTHOR = "Matthew M. Huntbach and F. Warren Burton", + TITLE = "Alpha-Beta Search on Virtual Tree Machines", + JOURNAL = "Information Sciences", + PAGES = "3--17", + VOLUME = 44, + YEAR = 1988, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Hyat89, + AUTHOR = "R. M. Hyatt and B. W. Suter", + TITLE = "A Parallel Alpha/Beta Tree Searching Algorithm", + JOURNAL = "Parallel Computing", + PAGES = "299--308", + VOLUME = 10, + YEAR = 1989, + AVAILABLE = "EPFL-BC" +} + +@ARTICLE{Ibar86, + AUTHOR = "Toshihide Ibaraki", + TITLE = "Generalization of Alpha-Beta and {SSS*} Search Procedures", + JOURNAL = artint, + YEAR = 1986, + VOLUME = 29, + PAGES = "73--117" +} + +@INPROCEEDINGS{Ibar87, + AUTHOR = "Toshihide Ibaraki", + TITLE = "Game Solving Procedure {H*} is Unsurpassed", + BOOKTITLE = "Discrete Algorithms and Complexity", + EDITOR = "D. S. Johnson and al.", + PAGES = "185--200", + YEAR = 1987, + PUBLISHER = "Academic Press, Inc.", + AVAILABLE = "ETHICS" +} + +@INPROCEEDINGS{Ibar91a, + AUTHOR = "Toshihide Ibaraki", + TITLE = "Search Algorithms for Minimax Game Trees", + BOOKTITLE = "Comference: Twenty Years NP-Completeness", + ADDRESS = "Sicily, Italy", + MONTH = Jun, + YEAR = 1991, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Ibar91b, + AUTHOR = "Toshihide Ibaraki and Yoshiroh Katoh", + TITLE = "Searching Minimax Game Trees Under Memory Space Constraint", + JOURNAL = "Annals of Mathematics and Artificial Intelligence", + PAGES = "141--153", + VOLUME = 1, + YEAR = 1990, + AVAILABLE = "ETHICS" +} + +@ARTICLE{Kain91, + AUTHOR = "Kaindl, Hermann and Shams, Reza and Horacek, Helmut", + TITLE = "Minimax Search Algorithms with and without Aspiration + Windows", + JOURNAL = ieeetopami, + YEAR = 1991, + VOLUME = "PAMI-13", + NUMBER = 12, + MONTH = Dec, + PAGES = "1225--1235" +} + +@INPROCEEDINGS{Karp89, + AUTHOR = "Richard M. Karp and Yanjun Zhang", + TITLE = "On parallel evaluation of game trees", + BOOKTITLE = "First ACM Annual symposium on parallel algorithms and + architectures (SPAA'89)", + PUBLISHER = "ACM", + ADDRESS = "New York, NY", + PAGES = "409--420", + YEAR = 1989, + AVAILABLE = "ETHICS" +} + +@ARTICLE{Kato88, + AUTHOR = "Y. Katoh and Toshihide Ibaraki", + TITLE = "Game Solving Procedure {SSS*} is Unsurpassed", + JOURNAL = "Systems and computers in Japan", + YEAR = 1988, + VOLUME = 19, + NUMBER = 7, + PAGES = "93-103", + AVAILABLE = "ETHICS" +} + +@MASTERSTHESIS{Klei90, + AUTHOR = "Theo Klein Paste and Patrick {van der Laag}", + TITLE = "An Analysis of the {SSS*} Algorithm", + SCHOOL = "Erasmus University Rotterdam", + ADDRESS = "Rotterdam, NL", + YEAR = 1990, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Knut75, + AUTHOR = "Donald E. Knuth and Ronald W. Moore", + TITLE = "An Analysis of Alpha-Beta Pruning", + JOURNAL = artint, + VOLUME = 6, + NUMBER = 4, + PAGES = "293--326", + YEAR = 1975 +} + +@ARTICLE{Korf85, + AUTHOR = "Richard E. Korf", + TITLE = "Iterative Deepening: {An} Optimal Admissible Tree Search", + JOURNAL = artint, + VOLUME = 27, + YEAR = 1985, + PAGES = "97--109", + AVAILABLE = "EPFL-DMA" +} + +@INPROCEEDINGS{Korf89, + AUTHOR = "Richard E. Korf", + TITLE = "Generalized Game Trees", + BOOKTITLE = "Proceedings of the International Joint Conference on + Artificial Intelligence (IJCAI-89)", + ADDRESS = "Detroit, MI", + YEAR = 1989, + MONTH = Aug, + PAGES = "328--333", + AVAILABLE = "ETHICS" +} + +@ARTICLE{Korf90, + AUTHOR = "Richard E. Korf", + TITLE = "Depth-Limited Search for Real-Time Problem Solving", + JOURNAL = "The Journal of Real-Time Systems", + PAGES = "7--24", + YEAR = 1990, + AVAILABLE = "EPFL-LITH" +} + +@ARTICLE{Korf91, + AUTHOR = "Richard E. Korf", + TITLE = "Multi-Player alpha-beta pruning", + JOURNAL = artint, + MONTH = Feb, + NUMBER = 1, + YEAR = 1991, + VOLUME = 48, + PAGES = "99--111", + AVAILABLE = "EPFL-DMA" +} + +@PHDTHESIS{Kraa90, + AUTHOR = "H.-J. Kraas", + TITLE = "Zur {Parallelisierung} des {SSS*-Algorithmus}", + SCHOOL = "University of Braunschweig", + ADDRESS = "Braunschweig, Germany", + YEAR = 1990, + NOTE = "In german, \Star", + AVAILABLE = "NO" +} + +@ARTICLE{Kuma83, + AUTHOR = "Vipin Kumar and Laveen N. Kanal", + TITLE = "A General Branch and Bound Formulation for Understanding + and Synthesizing And/Or Tree Search Procedures", + JOURNAL = artint, + PAGES = "179--198", + VOLUME = 21, + YEAR = 1983, + AVAILABLE = "EPFL-DMA" +} + +@ARTICLE{Kuma84, + AUTHOR = "Vipin Kumar and Laveen N. Kanal", + TITLE = "Parallel Branch-and-Bound Formulations for + {AND/OR} Tree Search", + JOURNAL = ieeetopami, + MONTH = Nov, + NUMBER = 6, + PAGES = "768--778", + VOLUME = "PAMI-6", + YEAR = 1984, + AVAILABLE = "EPFL-BC" +} + +@INPROCEEDINGS{Kuma88, + AUTHOR = "Vipin Kumar and Laveen N. Kanal", + TITLE = "A General Branch and Bound Formulation for And/Or Graph + and Game Tree Search", + BOOKTITLE = "Search in Artificial Intelligence", + PUBLISHER = "Springer Verlag", + YEAR = 1988, + AVAILABLE = "ETHICS" +} + +@INPROCEEDINGS{Leif85, + AUTHOR = "Daniel B. Leifker and Laveen N. Kanal", + TITLE = "A Hybrid {SSS*}/Alpha-Beta Algorithm for Parallel + Search of Game Trees", + BOOKTITLE = "Proceedings of the International Joint Conference on + Artificial Intelligence (IJCAI-85)", + PAGES = "1044--1046", + YEAR = 1985, + AVAILABLE = "ETHICS" +} + +@ARTICLE{Leve92, + AUTHOR = "Willem G. Levelt and M. Frans Kaashoek and Henri E. + Bal and Andrew S. Tanenbaum", + TITLE = "A Comparison of Two Paradigms for Distributed + Shared Memory", + JOURNAL = spex, + VOLUME = 22, + NUMBER = 11, + MONTH = Nov, + YEAR = 1992, + PAGES = "985--1010" +} + +@ARTICLE{Li90, + AUTHOR = "Liwu Li and T. A. Marsland", + TITLE = "Probability-Based Game Tree Pruning", + JOURNAL = jalgo, + YEAR = 1990, + MONTH = Mar, + NUMBER = 1, + VOLUME = 11, + PAGES = "27--43", + AVAILABLE = "EPFL-DMA" +} + +@TECHREPORT{Lind83, + AUTHOR = "Gary Lindstrom", + TITLE = "The Key Node Method: A Highly-Parallel Alpha-Beta + Algorithm", + ADDRESS = "Salt Lake City", + INSTITUTION = "University of Utah, Department of Computer Science", + MONTH = Mar, + NUMBER = "UUCS 83-101", + YEAR = 1983, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@MASTERSTHESIS{Low91, + AUTHOR = "Chin-Chau Low", + TITLE = "Parallel Game Tree Searching with Lower and Upper Bounds", + SCHOOL = "University of Illinois at Urbana Campaign", + ADDRESS = "IL", + YEAR = 1991, + ADVISOR = "L.V.Kale" +} + +@ARTICLE{Mars82, + AUTHOR = "T. A. Marsland and Murray S. Campbell", + TITLE = "Parallel Search of Strongly Ordered Game Trees", + JOURNAL = acmcs, + VOLUME = 14, + NUMBER = 4, + PAGES = "533--551", + MONTH = Dec, + YEAR = 1982 +} + +@INPROCEEDINGS{Mars83a, + AUTHOR = "T. A. Marsland", + TITLE = "Relative Efficiency of Alpha-Beta Implementations", + BOOKTITLE = "Proceedings of the International Joint Conference on + Artificial Intelligence (IJCAI-83)", + YEAR = 1983, + PAGES = "763--766", + ADDRESS = "Karlsruhe, Germany", + MONTH = Aug, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@TECHREPORT{Mars83b, + AUTHOR = "T. A. Marsland and Fred Popowich", + TITLE = "Multiprocessor Tree Searching System Design", + INSTITUTION = "University of Alberta, Department of Computer Science", + YEAR = 1983, + NUMBER = "TR 83-06", + ADDRESS = "Edmonton, Canada", + MONTH = Jul +} + +@ARTICLE{Mars85, + AUTHOR = "T. A. Marsland and Fred Popowich", + TITLE = "Parallel Game-Tree Search", + JOURNAL = ieeetopami, + YEAR = 1985, + VOLUME = "PAMI-7", + NUMBER = 4, + MONTH = Jul, + PAGES = "442--452" +} + +@ARTICLE{Mars87, + AUTHOR = "Marsland, T. A. and Reinefeld, Alexander and Schaeffer, + Jonathan", + TITLE = "Low Overhead Alternatives to {SSS*}", + JOURNAL = artint, + VOLUME = 31, + PAGES = "185--199", + YEAR = 1987 +} + +@INBOOK{Mars88, + AUTHOR = "T.A. Marsland and M. Olafsson and Jonathan Schaeffer", + TITLE = "Multiprocessor Tree-Search Experiments", + BOOKTITLE = "Advances in Computer Chess IV", + NOTE = "D.F. Beal (Editor)", + PUBLISHER = "Pergamon Press", + PAGES = "37--51", + YEAR = 1986, + AVAILABLE = "NO" +} + +@ARTICLE{McAl88, + AUTHOR = "David Allen McAllester", + TITLE = "Conspiracy Numbers for Min-Max Searching", + JOURNAL = artint, + VOLUME = 35, + PAGES = "287--310", + YEAR = 1988 +} + +@ARTICLE{Meul90, + AUTHOR = "M. van der Meulen", + TITLE = "Conspiracy Number Search", + JOURNAL = iccaj, + VOLUME = 13, + NUMBER = 1, + YEAR = 1990, + MONTH = Mar, + PAGES = "3--14", + NOTE = "\Star", + AVAILABLE = "NO" +} + +@PHDTHESIS{Mich83, + AUTHOR = "Gerard P. Michon", + TITLE = "Recursive Random Games: {A} Probabilistic Model for + Perfect Information Games", + SCHOOL = "University of California at Los Angeles, Computer + Science Department", + ADDRESS = "Los Angeles, CA", + NUMBER = "840029 (R-32)", + YEAR = 1983 +} + +@INPROCEEDINGS{Moni87, + AUTHOR = "Burkhard Monien and Oliver Vornberger", + TITLE = "Parallel Processing of Combinatorial Search Trees", + BOOKTITLE = " Proceedings International Workshop on Parallel + Algorithms and Architectures, Math. Research Nr. 38, + Akademie - Verlag Berlin", + PAGES = "60--69", + YEAR = 1987, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Nau82, + AUTHOR = "Danna S. Nau", + TITLE = "The Last Player Theorem", + JOURNAL = artint, + VOLUME = 18, + PAGES = "53--65", + YEAR = 1982 +} + +@ARTICLE{Nau83, + AUTHOR = "Danna S. Nau", + TITLE = "Pathology on Game Trees Revisited, and an Alternative to + Minimaxing", + JOURNAL = artint, + VOLUME = 21, + PAGES = "221--244", + YEAR = 1983 +} + +@ARTICLE{Newb77, + AUTHOR = "Monroe M. Newborn", + TITLE = "The Efficiency of the Alpha-Beta Search on Trees with + Branch-dependent Terminal Node Scores", + JOURNAL = artint, + VOLUME = 8, + PAGES = "137--153", + YEAR = 1977 +} + +@ARTICLE{Newb88, + AUTHOR = "Monroe M. Newborn", + TITLE = "Unsynchronized Iteratively Deepening Parallel Alpha-Beta + Search", + JOURNAL = ieeetopami, + YEAR = 1988, + VOLUME = "PAMI-10", + NUMBER = 5, + PAGES = "687--694" +} + +@BOOK{Nils80, + AUTHOR = "Nils J. Nilsson", + TITLE = "Principles of Artificial Intelligence", + PUBLISHER = "Tioga Publishing Company", + ADDRESS = "Palo Alto, CA", + YEAR = 1980, + AVAILABLE = "ETHICS" +} + +@ARTICLE{Pear80, + AUTHOR = "Judea Pearl", + TITLE = "Asymptotical Properties of Minimax Trees and Game + Searching Procedures", + JOURNAL = artint, + VOLUME = 14, + NUMBER = 2, + PAGES = "113--138", + YEAR = 1980 +} + +@ARTICLE{Pear82, + AUTHOR = "Judea Pearl", + TITLE = "The Solution for the Branching Factor of the Alpha-Beta + Pruning Algorithm and its Optimality", + JOURNAL = cacm, + MONTH = Aug, + YEAR = 1982, + VOLUME = 25, + NUMBER = 8, + PAGES = "559--564" +} + +@ARTICLE{Pear83, + AUTHOR = "Judea Pearl", + TITLE = "On the Nature of Pathology in Game Searching", + JOURNAL = artint, + VOLUME = 20, + YEAR = 1983, + PAGES = "427--453", + AVAILABLE = "EPFL-DMA" +} + +@BOOK{Pear84, + AUTHOR = "Judea Pearl", + TITLE = "Heuristics -- Intelligent Search Strategies for Computer + Problem Solving", + PUBLISHER = "Addison-Wesley Publishing Co.", + ADDRESS = "Reading, MA", + YEAR = 1984 +} + +@PHDTHESIS{Pijl91, + AUTHOR = "Wim Pijls", + TITLE = "Shortest Paths and Game Trees", + SCHOOL = "Erasmus University Rotterdam", + YEAR = 1991, + MONTH = Nov, + ADDRESS = "Rotterdam, NL" +} + +@TECHREPORT{Pijl92a, + AUTHOR = "Wim Pijls and Arie Bruin", + TITLE = "Another View of the {SSS*} Algorithm", + INSTITUTION = "Erasmus University Rotterdam", + YEAR = 1992, + MONTH = Jan, + ADDRESS = "Rotterdam, NL", + NOTE = "Also in: Algorithms, Proceedings of the International + Symposium, SIGAL'90, Tokyo, Japan, Aug. 1990" +} + +@TECHREPORT{Pijl92b, + AUTHOR = "Wim Pijls and Arie Bruin", + TITLE = "Searching Informed Game Trees", + INSTITUTION = "Erasmus University Rotterdam", + YEAR = 1992, + ADDRESS = "Rotterdam, NL", + NOTE = "Extended abstract. Also in: Proceedings CSN '92 + (Computer Science in the Netherlands), Mathematical + Center, Amsterdam, 1992" +} + +@TECHREPORT{Pijl92c, + AUTHOR = "Wim Pijls and Arie Bruin", + TITLE = "Searching Informed Game Trees", + INSTITUTION = "Erasmus University Rotterdam", + YEAR = 1992, + MONTH = Oct, + ADDRESS = "Rotterdam, NL", + NUMBER = "EUR-CS-92-02" +} + +@INBOOK{Powl90, + AUTHOR = "Powley, C. and C. Ferguson and Richard E. Korf", + TITLE = "Parallel heuristic search: Two approaches", + BOOKTITLE = "Parallel Algorithms for Machine Intelligence and Vision", + YEAR = 1990, + PAGES = "42--65", + PUBLISHER = "Springer-Verlag", + AVAILABLE = "EPFL", + NOTE = "Edited by V. Kumar, P. S. Gopalakrishnan and L.N." +} + +@TECHREPORT{Popo83, + AUTHOR = "Fred Popowich and T. A. Marsland", + TITLE = "Parabelle: Experiences With a Parallel Chess Program", + YEAR = 1983, + MONTH = Aug, + INSTITUTION = "University of Alberta, Department of Computer Science", + ADDRESS = "Edmonton, Canada", + NUMBER = "TR 83-07", + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Powl91, + AUTHOR = "C. Powley and Richard E. Korf", + TITLE = "Single Agent Parallel Window Search", + JOURNAL = ieeetopami, + YEAR = 1991, + VOLUME = "PAMI-13", + NUMBER = 5, + MONTH = May, + PAGES = "466--477" +} + +@ARTICLE{Prak88, + AUTHOR = "Bettadapu Prakash and T. A. Marsland", + TITLE = "Accuracy and Savings in Depth-Limited Capture Search", + JOURNAL = "International Journal of Man-Machine Studies", + YEAR = 1988, + VOLUME = 29, + NUMBER = 6, + PAGES = "497--502", + AVAILABLE = "ETHICS" +} + +@INPROCEEDINGS{Rein85, + AUTHOR = "Alexander Reinefeld and Jonathan Schaeffer and + T. A. Marsland", + TITLE = "Information Acquisition in Minimal Window Search", + BOOKTITLE = "Proceedings of the International Joint Conference on + Artificial Intelligence (IJCAI-85)", + PAGES = "1040--1043", + VOLUME = 2, + YEAR = 1985, + AVAILABLE = "ETHICS" +} + +@BOOK{Rein89, + AUTHOR = "Alexander Reinefeld", + TITLE = "Spielbaum Suchverfahren", + PUBLISHER = "Springer Verlag", + VOLUME = "Informatik-Fachberichte 200", + YEAR = 1989, + AVAILABLE = "NO" +} + +@TECHREPORT{Reza92, + AUTHOR = "Jaleh Rezaie and Raphael Finkel", + TITLE = "A Comparison of some Parallel Game-Tree Search Algorithms", + INSTITUTION = "University of Kentucky, Department of Computer Science", + ADDRESS = "Lexington, USA", + YEAR = 1992 +} + +@ARTICLE{Rive87, + AUTHOR = "Ronald L. Rivest", + TITLE = "Game Tree Searching by Min/Max Approximation", + JOURNAL = artint, + YEAR = 1987, + VOLUME = 34, + NUMBER = 1, + PAGES = "77--96" +} + +@TECHREPORT{Roiz81, + AUTHOR = "Igor Roizen", + TITLE = "On the Average Number of Terminal Nodes Examined by + Alpha-Beta", + INSTITUTION = "University of California at Los Angeles, Cognitive + Systems Laboratory", + YEAR = 1981, + NUMBER = "UCLA-ENG-CSL-8108", + ADDRESS = "Los Angeles, CA", + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Roiz83, + AUTHOR = "Igor Roizen and Judea Pearl", + TITLE = "A Minimax Algorithm Better than Alpha-Beta? Yes and No", + JOURNAL = artint, + VOLUME = 21, + PAGES = "199--230", + YEAR = 1983 +} + +@ARTICLE{Scha83, + AUTHOR = "Jonathan Schaeffer", + TITLE = "The History Heuristic", + JOURNAL = iccaj, + VOLUME = 6, + NUMBER = 3, + PAGES = "16--19", + YEAR = 1983, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Scha89a, + AUTHOR = "Jonathan Schaeffer", + TITLE = "Distributed Game-Tree Searching", + JOURNAL = jpdc, + VOLUME = 6, + PAGES = "90--114", + YEAR = 1989 +} + +@ARTICLE{Scha89b, + AUTHOR = "Jonathan Schaeffer", + TITLE = "The History Heuristic and Alpha-Beta Search Enhancements + in Practice", + JOURNAL = ieeetopami, + YEAR = 1989, + VOLUME = "PAMI-11", + NUMBER = 1, + MONTH = Nov, + PAGES = "1203--1212" +} + +@ARTICLE{Scha90, + AUTHOR = "Jonathan Schaeffer", + TITLE = "Conspiracy Numbers", + JOURNAL = artint, + YEAR = 1990, + VOLUME = 43, + PAGES = "67--84" +} + +@INBOOK{Schr86, + AUTHOR = {G. Schr\"ufer}, + CHAPTER = "Presence and Absence of Pathology on Game Trees", + TITLE = "Advances in Computer Chess 4", + YEAR = 1986, + NOTE = "Editor: D. F. Beal", + PAGES = "101--112", + PUBLISHER = "Pergamon Press", + AVAILABLE = "ETHICS" +} + +@PHDTHESIS{Schr88, + AUTHOR = {G. Schr\"ufer}, + TITLE = {{Minimax-Suchen Kosten, Qualit\"at und Algorithmen}}, + SCHOOL = "University of Braunschweig", + ADDRESS = "Braunschweig, West Germany", + YEAR = 1988, + NOTE = "In german, \Star", + AVAILABLE = "NO" +} + +@ARTICLE{Shan50, + AUTHOR = "Claude E. Shannon", + TITLE = "Programming a Computer for Playing Chess", + JOURNAL = "Philosophical Magazine", + VOLUME = 41, + PAGES = "256--275", + YEAR = 1950, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Shen85, + AUTHOR = "Chien-Chung Shen and Wen-Hsiang Tsai", + TITLE = "A Graph Matching Approach to Optimal Task Assignment + in Distributed Computing Systems Using a Minimax Criterion", + JOURNAL = ieeetoc, + VOLUME = "C-34", + MONTH = Mar, + YEAR = 1985, + PAGES = "197--203", + AVAILABLE = "EPFL-LITH" +} + +@ARTICLE{Shin91, + AUTHOR = "Rajjan Shinghal and Sofia Shved", + TITLE = "Proposed Modifications to Parallel State Space + Search of Game Trees", + JOURNAL = ijprai, + NUMBER = 5, + VOLUME = "5", + PAGES = "809--833", + YEAR = 1991, + AVAILABLE = "ETHICS" +} + +@ARTICLE{Slag69, + AUTHOR = "James H. Slagle and John K. Dixon", + TITLE = "Experiments With SOme Programs That Search Game Trees", + JOURNAL = jacm, + VOLUME = 16, + NUMBER = 2, + YEAR = 1969, + MONTH = Apr, + PAGES = "189--207" +} + +@INPROCEEDINGS{Stei90, + AUTHOR = "Igor Steinberg and Marvin Solomon", + TITLE = "Searching Game Trees in Parallel", + BOOKTITLE = "International Conference on Parallel Processing", + PAGES = "III-9 -- III-17", + YEAR = 1990, + NOTE = "\Star", + AVAILABLE = "NO" +} + +@ARTICLE{Stoc79, + AUTHOR = "G. C. Stockman", + TITLE = "A Minimax Algorithm Better than alpha-beta?", + JOURNAL = artint, + VOLUME = 12, + NUMBER = 2, + PAGES = "179--196", + YEAR = 1979 +} + +@ARTICLE{Tars83, + AUTHOR = "M. Tarsi", + TITLE = "Optimal Search on Some Game Trees", + JOURNAL = jacm, + YEAR = 1983, + VOLUME = 30, + PAGES = "389--396", + MONTH = Jul, + NOTE = "Also as Tech. Report UCLA-ENG-CSL-8108" +} + +@INPROCEEDINGS{Vorn87, + AUTHOR = "Oliver Vornberger and Burkhard Monien", + TITLE = "Parallel Alpha-Beta versus Parallel {SSS*}", + BOOKTITLE = "IFIP Conference on Distributed Processing", + ADDRESS = "Amsterdam, NL", + PUBLISHER = "North-Holland", + PAGES = "613--625", + MONTH = Oct, + YEAR = 1987, + AVAILABLE = "ETHICS" +} diff --git a/programs/minimax.dvi b/programs/minimax.dvi Binary files differnew file mode 100644 index 0000000..9b00755 --- /dev/null +++ b/programs/minimax.dvi diff --git a/programs/pentopt.htm b/programs/pentopt.htm new file mode 100644 index 0000000..9cc5788 --- /dev/null +++ b/programs/pentopt.htm @@ -0,0 +1,6723 @@ +<html>
+<head>
+<title>How to optimize for the Pentium family of microprocessors</title>
+<style><!--
+ body{font-family:arial,sans-serif;color:black,background-color:"#F0FFE0"}
+ p{font-family:arial,sans-serif;}
+ ol{font-family:arial,sans-serif;}
+ ul{font-family:arial,sans-serif;}
+ pre{font-family:courier,monospace}
+ kbd{font-family:courier,monospace;font-weight:540}
+ h1{font-size:"300%";font-weight:700;text-align:center}
+ h2{font-size:"150%";font-weight:600;text-align:left;padding-top:1em}
+ h3{font-size:"110%";font-weight:600;text-align:left}
+ h4{font-size:"100%";font-weight:500;text-align:left;text-decoration:underline}
+ td.a2{font-size:"150%";font-weight:600}
+ td.a3{font-size:"110%";font-weight:600}
+ td.a4{font-size:"100%";font-weight:600}
+--></style>
+</head>
+
+<body text="#000000" bgcolor="#F0FFE0" link="#0000E0" vlink="#E000E0" alink="#FF0000">
+<center><h1>How to optimize for the Pentium<br>
+family of microprocessors</h1>
+<p>
+<small>Copyright © 1996, 2000 by Agner Fog. Last modified 2000-07-03.</small>
+</center>
+<p> </p>
+
+<h2>Contents</h2>
+<ol>
+<li><a href="#1">Introduction</a>
+<li><a href="#2">Literature</a>
+<li><a href="#3">Calling assembly functions from high level language</a>
+<li><a href="#4">Debugging and verifying</a>
+<li><a href="#5">Memory model</a>
+<li><a href="#6">Alignment</a>
+<li><a href="#7">Cache</a>
+<li><a href="#8">First time versus repeated execution</a>
+<li><a href="#9">Address generation interlock (PPlain and PMMX)</a>
+<li><a href="#10">Pairing integer instructions (PPlain and PMMX)</a>
+ <ol><li><a href="#10_1">Perfect pairing</a>
+ <li><a href="#10_2">Imperfect pairing</a>
+ </ol>
+<li><a href="#11">Splitting complex instructions into simpler ones (PPlain and PMMX)</a>
+<li><a href="#12">Prefixes (PPlain and PMMX)</a>
+<li><a href="#13">Overview of PPro, PII and PIII pipeline</a>
+<li><a href="#14">Instruction decoding (PPro, PII and PIII)</a>
+<li><a href="#15">Instruction fetch (PPro, PII and PIII)</a>
+<li><a href="#16">Register renaming (PPro, PII and PIII)</a>
+ <ol><li><a href="#16_1">Eliminating dependencies</a>
+ <li><a href="#16_2">Register read stalls</a></ol>
+<li><a href="#17">Out of order execution (PPro, PII and PIII)</a>
+<li><a href="#18">Retirement (PPro, PII and PIII)</a>
+<li><a href="#19">Partial stalls (PPro, PII and PIII)</a>
+ <ol><li><a href="#19_1">Partial register stalls</a>
+ <li><a href="#19_2">Partial flags stalls</a>
+ <li><a href="#19_3">Flags stalls after shifts and rotates</a>
+ <li><a href="#19_4">Partial memory stalls</a></ol>
+<li><a href="#20">Dependency chains (PPro, PII and PIII)</a>
+<li><a href="#21">Searching for bottlenecks (PPro, PII and PIII)</a>
+<li><a href="#22">Jumps and branches (all processors)</a>
+ <ol><li><a href="#22_1">Branch prediction in PPlain</a>
+ <li><a href="#22_2">Branch prediction in PMMX, PPro, PII and PIII</a>
+ <li><a href="#22_3">Avoiding jumps (all processors)</a>
+ <li><a href="#22_4">Avoiding conditional jumps by using flags (all processors)</a>
+ <li><a href="#22_5">Replacing conditional jumps by conditional moves (PPro, PII and PIII)</a></ol>
+<li><a href="#23">Reducing code size (all processors)</a>
+<li><a href="#24">Scheduling floating point code (PPlain and PMMX)</a>
+<li><a href="#25">Loop optimization (all processors)</a>
+ <ol><li><a href="#25_1">Loops in PPlain and PMMX</a>
+ <li><a href="#25_2">Loops in PPro, PII and PIII</a></ol>
+<li><a href="#26">Problematic Instructions</a>
+ <ol><li><a href="#26_1">XCHG (all processors)</a>
+ <li><a href="#26_2">Rotates through carry (all processors)</a>
+ <li><a href="#26_3">String instructions (all processors)</a>
+ <li><a href="#26_4">Bit test (all processors)</a>
+ <li><a href="#26_5">Integer multiplication (all processors)</a>
+ <li><a href="#26_6">WAIT instruction (all processors)</a>
+ <li><a href="#26_7">FCOM + FSTSW AX (all processors)</a>
+ <li><a href="#26_8">FPREM (all processors)</a>
+ <li><a href="#26_9">FRNDINT (all processors)</a>
+ <li><a href="#26_10">FSCALE and exponential function (all processors)</a>
+ <li><a href="#26_11">FPTAN (all processors)</a>
+ <li><a href="#26_12">FSQRT (PIII)</a>
+ <li><a href="#26_13">MOV [MEM], ACCUM (PPlain and PMMX)</a>
+ <li><a href="#26_14">TEST instruction (PPlain and PMMX)</a>
+ <li><a href="#26_15">Bit scan (PPlain and PMMX)</a>
+ <li><a href="#26_16">FLDCW (PPro, PII and PIII)</a>
+ </ol>
+<li><a href="#27">Special topics</a>
+ <ol><li><a href="#27_1">LEA instruction (all processors)</a>
+ <li><a href="#27_2">Division (all processors)</a>
+ <li><a href="#27_3">Freeing floating point registers (all processors)</a>
+ <li><a href="#27_4">Transitions between floating point and MMX instructions PMMX, PII and PIII)</a>
+ <li><a href="#27_5">Converting from floating point to integer (All processors)</a>
+ <li><a href="#27_6">Using integer instructions to do floating point operations (All processors)</a>
+ <li><a href="#27_7">Using floating point instructions to do integer operations (PPlain and PMMX)</a>
+ <li><a href="#27_8">Moving blocks of data (All processors)</a>
+ <li><a href="#27_9">Self-modifying code (All processors)</a>
+ <li><a href="#27_10">Detecting processor type (All processors)</a>
+ </ol>
+<li><a href="#28">List of instruction timings for PPlain and PMMX</a>
+ <ol><li><a href="#28_1">Integer instructions</a>
+ <li><a href="#28_2">Floating point instructions</a>
+ <li><a href="#28_3">MMX instructions (PMMX)</a></ol>
+<li><a href="#29">List of instruction timings and micro-op breakdown for PPro, PII and PIII</a>
+ <ol><li><a href="#29_1">Integer instructions</a>
+ <li><a href="#29_2">Floating point instructions</a>
+ <li><a href="#29_3">MMX instructions (PII and PIII)</a>
+ <li><a href="#29_4">XMM instructions (PIII)</a>
+ </ol>
+<li><a href="#30">Testing speed</a>
+<li><a href="#31">Comparison of the different microprocessors</a>
+</ol>
+
+<p> </p>
+<h2><a name="1">1</a>. Introduction</h2>
+<p>This manual describes in detail how to write optimized assembly language
+code, with particular focus on the Pentium® family of microprocessors.
+<p>
+Most of the information herein is based on my own research. Many people have
+sent me useful information and corrections for this manual, and I keep
+updating it whenever I have new important information. This manual is
+therefore more accurate, detailed, comprehensive and exact than any other
+source of information, and it contains many details not found anywhere else.
+This information will enable you in many cases to calculate exactly how many
+clock cycles a piece of code will take. I do not claim, though, that all
+information in this manual is exact: Some timings etc. can be difficult or
+impossible to measure exactly, and I do not have access to the inside information
+on technical implementations that the writers of Intel manuals have.
+<p>
+The following versions of Pentium processors are discussed in this manual:<p>
+<table border=1>
+<tr><td class="a3">abbreviation</td><td class="a3">name</td></tr>
+<tr><td>PPlain</td><td>plain old Pentium (without MMX)</td></tr>
+<tr><td>PMMX</td><td>Pentium with MMX</td></tr>
+<tr><td>PPro</td><td>Pentium Pro</td></tr>
+<tr><td>PII</td><td>Pentium II (including Celeron and Xeon)</td></tr>
+<tr><td>PIII</td><td>Pentium III (including variants)</td></tr>
+</table>
+<p>
+The assembly language syntax used in this manual is MASM 5.10 syntax.
+There is no official standard for X86 assembly language, but this is the
+closest you can get to a de facto standard since most assemblers have a
+MASM 5.10 compatible mode. (I do not recommend using MASM version 5.10 though,
+because it has a serious bug in 32 bit mode. Use TASM or a later version of MASM).
+<p>
+Some of the remarks in this manual may seem like a criticism of Intel. This should not be
+taken to mean that other brands are better. The Pentium family of microprocessors
+compare well with competing brands, they are better documented, and have better
+testability features. For these reasons, no competing brand has been subjected to the same
+level of independent research by me or by anybody else.
+<p>
+Programming in assembly language is much more difficult than high level language. Making
+bugs is very easy, and finding them is very difficult. Now you have been warned! It is
+assumed that the reader is already experienced in assembly programming. If not, then
+please read some books on the subject and get some programming experience before you
+begin to do complicated optimizations.
+<p>
+The hardware design of the PPlain and PMMX chips has many features which are
+optimized specifically for some commonly used instructions or instruction combinations,
+rather than using general optimization methods. Consequently, the rules for optimizing
+software for this design are complicated and have many exceptions, but the possible gain
+in performance may be substantial. The PPro, PII and PIII processors have a very
+different design where the processor takes care of much of the optimization work by
+executing instructions out of order, but the more complicated design of these processors
+generate many potential bottlenecks, so there may be a lot to gain
+by optimizing manually for these processors. The Pentium 4 processor has yet
+another design, and the optimization guidelines for Pentium 4 are quite different
+from previous versions. This manual does not cover the Pentium 4 - the reader is
+referred to manuals from Intel.
+<p>
+Before you start to convert your code to assembly, make sure that your algorithm is optimal.
+Often you can improve a piece of code much more by improving the algorithm than by
+converting it to assembly code.
+<p>
+Next, you have to identify the critical parts of your program. Often more than 99% of the
+CPU time is spent in the innermost loop of a program. In this case you should optimize only
+this loop and leave everything else in high level language. Some assembly programmers
+waste a lot of energy optimizing the wrong parts of their programs, the only significant effect
+of their effort being that the programs become more difficult to debug and maintain!
+<p>
+If it is not obvious where the critical parts of your program are then you may use a profiler to
+find them. If it turns out that the bottleneck is disk access, then you may modify your
+program to make disk access sequential in order to improve disk caching, rather than
+turning to assembly programming. If the bottleneck is graphics output then you may look for
+a way of reducing the number of calls to graphic procedures.
+<p>
+Some high level language compilers offer relatively good optimization for specific
+processors, but further optimization by hand can usually make it much better.
+<p>
+Please don't send your programming questions to me. I am not gonna do your homework
+for you!
+<p>
+Good luck with your hunt for nanoseconds!
+<p>
+<h2><a name="2">2</a>. Literature</h2><p>
+A lot of useful literature and tutorials can be downloaded for free from Intel's www site or
+acquired in print or on CD-ROM. It is recommended that you study this literature in order to
+get acquainted with the microprocessor architecture. However, the documents from Intel are
+not always accurate - especially the tutorials have many errors (evidently, they haven't
+tested their own examples).
+<p>
+I will not give the URL's here because the file locations change very often. You can find the
+documents you need by using the search facilities at:
+<a href="http://developer.intel.com" target="external">developer.intel.com</a> or follow the
+links from <a href="http://www.agner.org/assem">www.agner.org/assem</a>
+<p>
+Some documents are in .PDF format. If you don't have software for viewing or printing .PDF
+files, then you may download the Acrobat file reader from <a href="http://www.adobe.com" target="external">www.adobe.com</a>
+<p>
+The use of MMX and XMM (SIMD) instructions for optimizing specific applications are described in several
+application notes. The instruction set is described in various manuals and tutorials.
+<p>
+VTUNE is a software tool from Intel for optimizing code. I have not tested it and can
+therefore not give any evalutation of it here.
+<p>
+A lot of other sources than Intel also have useful information. These sources are listed in
+the FAQ for the newsgroup comp.lang.asm.x86. For other internet ressources follow the
+links from <a href="http://www.agner.org/assem">www.agner.org/assem</a>
+<p>
+<h2><a name="3">3</a>. Calling assembly functions from high level language</h2><p>
+You can either use inline assembly or code a subroutine entirely in assembly language and
+link it into your project. If you choose the latter option, then it is recommended that you use
+a compiler which is capable of translating high level code directly to assembly. This assures
+that you get the function calling method right. Most C++ compilers can do this.
+<p>
+The methods for function calling and name mangling can be quite complicated. There are
+many different calling conventions, and the different brands of compilers are not compatible
+in this respect. If you are calling assembly language subroutines from C++, then the best
+method in terms of consistency and compatibility is to declare your functions <kbd>extern "C"</kbd>
+and <kbd>_cdecl</kbd>. The assembly code must then have the function name prefixed by an
+underscore (<kbd>_</kbd>) and be assembled with case sensitivity on externals (option -mx).
+<p>
+If you need to make overloaded functions, overloaded operators, member
+functions, and other C++ specialties then you have to code it in C++ first and
+make your compiler translate it to assembly in order to get the right linking
+information and calling method. These details are different for different brands
+of compilers. If you want an assembly function with any other calling method
+than <kbd>extern "C"</kbd> and <kbd>_cdecl</kbd> to be callable from code
+compiled with different compilers then you need to give it one public name
+for each compiler. For example an overloaded square function:
+<pre> ; int square (int x);
+ SQUARE_I PROC NEAR ; integer square function
+ @square$qi LABEL NEAR ; link name for Borland compiler
+ ?square@@YAHH@Z LABEL NEAR ; link name for Microsoft compiler
+ _square__Fi LABEL NEAR ; link name for Gnu compiler
+ PUBLIC @square$qi, ?square@@YAHH@Z, _square__Fi
+ MOV EAX, [ESP+4]
+ IMUL EAX
+ RET
+ SQUARE_I ENDP
+
+ ; double square (double x);
+ SQUARE_D PROC NEAR ; double precision float square function
+ @square$qd LABEL NEAR ; link name for Borland compiler
+ ?square@@YANN@Z LABEL NEAR ; link name for Microsoft compiler
+ _square__Fd LABEL NEAR ; link name for Gnu compiler
+ PUBLIC @square$qd, ?square@@YANN@Z, _square__Fd
+ FLD QWORD PTR [ESP+4]
+ FMUL ST(0), ST(0)
+ RET
+ SQUARE_D ENDP</pre>
+<p>
+The way of transferring parameters depends on the calling convention:</pre><p>
+<table border=1 cellpadding=1 cellspacing=1><tr>
+<td class="a3"> calling convention </td>
+<td class="a3"> parameter order on stack </td>
+<td class="a3"> parameters removed by </td></tr>
+<tr><td> _cdecl </td><td> first par. at low address
+</td><td> caller </td></tr><tr><td> _stdcall </td><td>
+ first par. at low address </td><td> subroutine </td></tr>
+<tr><td> _fastcall </td><td> compiler specific
+</td><td> subroutine </td></tr>
+<tr><td> _pascal </td><td> first par. at high address
+</td><td> subroutine </td>
+</tr></table>
+<p>
+<u>Register usage in 16 bit mode DOS or Windows, C or C++:</u><br>
+16-bit return value in <kbd>AX</kbd>, 32-bit return value in <kbd>DX:AX</kbd>,
+floating point return value in <kbd>ST(0)</kbd>. Registers <kbd>AX, BX, CX,
+DX, ES</kbd> and arithmetic flags may be changed by the procedure; all other
+registers must be saved and restored. A procedure can rely on <kbd>SI, DI, BP, DS</kbd>
+and <kbd>SS</kbd> being unchanged across a call to another procedure.
+<p>
+<u>Register usage in 32 bit Windows, C++ and other programming languages:</u><br>
+Integer return value in <kbd>EAX</kbd>, floating point return value in <kbd>ST(0)</kbd>.
+Registers <kbd>EAX, ECX, EDX</kbd> (not <kbd>EBX</kbd>) may be changed by the procedure; all other
+registers must be saved and restored. Segment registers cannot be changed, not even
+temporarily. <kbd>CS, DS, ES,</kbd> and <kbd>SS</kbd> all point to the flat segment group. <kbd>FS</kbd> is used by the
+operating system. <kbd>GS</kbd> is unused, but reserved. Flags may be changed by the procedure
+with the following restrictions: The direction flag is 0 by default. The direction flag may be
+set temporarily, but must be cleared before any call or return. The interrupt flag cannot be
+cleared. The floating point register stack is empty at the entry of a procedure and must be
+empty at return, except for <kbd>ST(0)</kbd> if it is used for return value. MMX registers may be
+changed by the procedure and if so cleared by <kbd>EMMS</kbd> before returning and before calling any
+other procedure that may use floating point registers. All XMM registers may be modified
+by procedures. Rules for passing parameters and return values in XMM registers
+are described in Intel's application note AP 589. A procedure can rely on
+<kbd>EBX, ESI, EDI, EBP</kbd> and all segment registers being unchanged across
+a call to another procedure.
+<p>
+
+<h2><a name="4">4</a>. Debugging and verifying</h2><p>
+Debugging assembly code can be quite hard and frustrating, as you probably already have
+discovered. I would recommend that you start with writing the piece of code you want to
+optimize as a subroutine in a high level language. Next, write a test program that will test
+your subroutine thoroughly. Make sure the test program goes into all branches and
+boundary cases.
+<p>
+When your high level language subroutine works with your test program then you are ready
+to translate the code to assembly language.
+<p>
+Now you can start to optimize. Each time you have made a modification you should run it
+on the test program to see if it works correctly.
+Number all your versions and save them so that you can go back and test them again in
+case you discover an error that the test program didn't catch (such as writing to a wrong
+address).
+<p>
+Test the speed of the most critical part of your program with the method described in
+chapter <a href="#30">30</a> or with a test program. If the code is significantly slower than expected, then the
+most probable causes are: cache misses (chapter <a href="#7">7</a>), misaligned
+operands (chapter <a href="#6">6</a>), first
+time penalty (chapter <a href="#8">8</a>), branch mispredictions
+(chapter <a href="#22">22</a>), instruction fetch problems
+(chapter <a href="#15">15</a>), register read stalls (<a href="#16">16</a>),
+ or long dependency chains (chapter <a href="#20">20</a>).
+<p>
+Highly optimized code tends to be very difficult to read and understand for others, and even
+for yourself when you get back to it after some time. In order to make it possible to maintain
+the code it is important that you organize it into small logical units (procedures or macros)
+with a well-defined interface and appropriate comments. The more complicated the code is
+to read, the more important is a good documentation.
+<p>
+<h2><a name="5">5</a>. Memory model</h2><p>
+The Pentiums are designed primarily for 32 bit code, and the performance is
+inferior on 16 bit code. Segmenting your code and data also degrades performance
+significantly, so you should generally prefer 32 bit flat mode, and an operating
+system which supports this mode. The code examples shown in this
+manual assume a 32 bit flat memory model, unless otherwise specified.
+<p>
+<h2><a name="6">6</a>. Alignment</h2><p>
+All data in RAM should be aligned to addresses divisible by 2, 4, 8, or 16 according to this
+scheme:
+<table border=1 cellpadding=1 cellspacing=1><tr><td>
+
+</td><td colspan=2 align=center class="a3">alignment</td></tr>
+<tr><td align=center class="a3"> operand size </td>
+<td align=center class="a3"> PPlain and PMMX </td>
+<td align=center class="a3"> PPro, PII and PIII </td></tr>
+<tr><td> 1 (byte) </td>
+<td align=center>1</td><td align=center>1</td></tr>
+<tr><td> 2 (word) </td><td align=center>2</td>
+<td align=center>2</td></tr>
+<tr><td> 4 (dword) </td>
+<td align=center align=center>4</td><td align=center>4</td></tr>
+<tr><td> 6 (fword) </td>
+<td align=center>4</td><td align=center>8</td></tr>
+<tr><td> 8 (qword) </td>
+<td align=center>8</td><td align=center>8</td></tr>
+<tr><td> 10 (tbyte) </td>
+<td align=center>8</td><td align=center>16</td></tr>
+<tr><td> 16 (oword) </td>
+<td align=center>n.a.</td><td align=center>16</td></tr>
+</table>
+<p>
+On PPlain and PMMX, misaligned data will take at least 3 clock cycles extra to access if a 4
+byte boundary is crossed. The penalty is higher when a cache line boundary is crossed.
+<p>
+On PPro, PII and PIII, misaligned data will cost you 6-12 clocks extra when a
+cache line boundary is crossed. Misaligned operands smaller than 16 bytes that
+do not cross a 32 byte boundary give no penalty.
+<p>
+Aligning data by 8 or 16 on a dword size stack may be a problem. A common method is to set up
+an aligned frame pointer. A function with aligned local data may look like this:
+<pre>_FuncWithAlign PROC NEAR
+ PUSH EBP ; prolog code
+ MOV EBP, ESP
+ AND EBP, -8 ; align frame pointer by 8
+ FLD DWORD PTR [ESP+8] ; function parameter
+ SUB ESP, LocalSpace + 4 ; allocate local space
+ FSTP QWORD PTR [EBP-LocalSpace] ; store something in aligned space
+ ...
+ ADD ESP, LocalSpace + 4 ; epilog code. restore ESP
+ POP EBP ; (AGI stall on PPlain/PMMX)
+ RET
+_FuncWithAlign ENDP</pre>
+<p>
+While aligning data is always important, aligning code is not necessary on the PPlain and
+PMMX. Principles for aligning code on PPro, PII and PIII are explained in chapter <a href="#15">15</a>.
+<p>
+<h2><a name="7">7</a>. Cache</h2><p>
+The PPlain and PPro have 8 kb of on-chip cache (level one cache) for code, and 8 kb for
+data. The PMMX, PII and PIII have 16 kb for code and 16 kb for data. Data in the level 1 cache
+can be read or written to in just one clock cycle, whereas a cache miss may cost many
+clock cycles. It is therefore important that you understand how the cache works in order to
+use it most efficiently.
+<p>
+The data cache consists of 256 or 512 lines of 32 bytes each. Each time you read a data
+item which is not cached, the processor will read an entire cache line from memory. The
+cache lines are always aligned to a physical address divisible by 32. When you have read a
+byte at an address divisible by 32, then the next 31 bytes can be read or written to at almost
+no extra cost. You can take advantage of this by arranging data items which are used near
+each other together into aligned blocks of 32 bytes of memory. If, for example, you have a
+loop which accesses two arrays, then you may interleave the two arrays into one array of
+structures, so that data which are used together are also stored together.
+<p>
+If the size of an array or other data structure is a multiple of 32 bytes, then you should
+preferably align it by 32.
+<p>
+The cache is set-associative. This means that a cache line can not be assigned to an
+arbitrary memory address. Each cache line has a 7-bit set-value which must match bits 5
+through 11 of the physical RAM address (bit 0-4 define the 32 bytes within a cache line).
+The PPlain and PPro have two cache lines for each of the 128 set-values, so there are two
+possible cache lines to assign to any RAM address. The PMMX, PII and PIII have four.
+<p>
+The consequence of this is that the cache can hold no more than two or four different data
+blocks which have the same value in bits 5-11 of the address. You can determine if two
+addresses have the same set-value by the following method: Strip off the lower 5 bits of
+each address to get a value divisible by 32. If the difference between the two truncated
+addresses is a multiple of 4096 (=1000H), then the addresses have the same set-value.
+<p>
+Let me illustrate this by the following piece of code, where ESI holds an address divisible by
+32:
+
+<pre>AGAIN: MOV EAX, [ESI]
+ MOV EBX, [ESI + 13*4096 + 4]
+ MOV ECX, [ESI + 20*4096 + 28]
+ DEC EDX
+ JNZ AGAIN</pre>
+<p>
+The three addresses used here all have the same set-value because the differences
+between the truncated addresses are multipla of 4096. This loop will perform very poorly on
+the PPlain and PPro. At the time you read <kbd>ECX</kbd> there is no free cache
+line with the proper set-value so the processor takes the least recently used
+of the two possible cache lines, that is the one which was used for <kbd>EAX</kbd>, and
+fills it with the data from <kbd>[ESI+20*4096]</kbd> to
+<kbd>[ESI+20*4096+31]</kbd> and reads <kbd>ECX</kbd>.
+Next, when reading <kbd>EAX</kbd>, you find that the cache
+line that held the value for <kbd>EAX</kbd> has now been discarded, so you
+take the least recently used
+line, which is the one holding the <kbd>EBX</kbd> value, and so on..
+You have nothing but cache misses and the loop takes something like 60 clock
+cycles. If the third line is changed to:
+<pre> MOV ECX, [ESI + 20*4096 + 32]</pre>
+<p>
+then we have crossed a 32 byte boundary, so that we do not have the same set-value as in
+the first two lines, and there will be no problem assigning a cache line to each of the three
+addresses. The loop now takes only 3 clock cycles (except for the first time) - a very
+considerable improvement! As already mentioned, the PMMX, PII and PIII have 4-way caches
+so that you have four cache lines with the same set-value. (Some Intel documents
+erroneously say that the PII cache is 2-way).
+<p>
+It may be very difficult to determine if your data addresses have the same set-values,
+especially if they are scattered around in different segments. The best thing you can do to
+avoid problems of this kind is to keep all data used in the critical part or your program within
+one contiguous block not bigger than the cache, or two contiguous blocks no bigger than
+half that size (for example one block for static data and another block for data on the stack).
+This will make sure that your cache lines are used optimally.
+<p>
+If the critical part of your code accesses big data structures or random data addresses, then
+you may want to keep all frequently used variables (counters, pointers, control variables,
+etc.) within a single contiguous block of max 4 kbytes so that you have a complete set of
+cache lines free for accessing random data. Since you probably need stack space anyway
+for subroutine parameters and return addresses, the best thing is to copy all frequently
+used static data to dynamic variables on the stack, and copy them back again outside the
+critical loop if they have been changed.
+<p>
+Reading a data item which is not in the level one cache causes an entire cache line to be
+filled from the level two cache, which takes approximately 200 ns (that is 20 clocks on a
+100 MHz system or 40 clocks on a 200 MHz system), but the bytes you ask for first are
+available already after 50-100 ns. If the data item is not in the level two cache either, then
+you will get a delay of something like 200-300 ns. This delay will be somewhat longer if you
+cross a DRAM page boundary. (The size of a DRAM page is 1 kb for 4 and 8 MB 72 pin
+RAM modules, and 2 kb for 16 and 32 MB modules).
+<p>
+When reading big blocks of data from memory, the speed is limited by the time it takes to fill
+cache lines. You can sometimes improve speed by reading data in a non-sequential order:
+before you finish reading data from one cache line start reading the first item from the next
+cache line. This method can increase reading speed by 20 - 40% when reading from main
+memory or level 2 cache on PPlain and PMMX, and from level 2 cache on PPro, PII and PIII. A
+disadvantage of this method is of course that the program code becomes extremely clumsy
+and complicated. For further information on this trick see <a href="http://www.intelligentfirm.com" target="external">www.intelligentfirm.com</a>.
+<p>
+When you write to an address which is not in the level 1 cache, then the value will go right
+through to the level 2 cache or to the RAM (depending on how the level 2 cache is set up)
+on the PPlain and PMMX. This takes approximately 100 ns. If you write eight or more times
+to the same 32 byte block of memory without also reading from it, and the block is not in the
+level one cache, then it may be advantageous to make a dummy read from the block first to
+load it into a cache line. All subsequent writes to the same block will then go to the cache
+instead, which takes only one clock cycle. On PPlain and PMMX, there is sometimes a
+small penalty for writing repeatedly to the same address without reading in between.
+<p>
+On PPro, PII and PIII, a write miss will normally load a cache line, but it is possible to setup an
+area of memory to perform differently, for example video RAM (See Pentium Pro Family
+Developer's Manual, vol. 3: Operating System Writer's Guide").
+<p>
+Other ways of speeding up memory reads and writes are discussed in chapter
+<a href="#27_8">27.8</a> below.
+<p>
+The PPlain and PPro have two write buffers, PMMX, PII and PIII have four. On the PMMX, PII and
+PIII you may have up to four unfinished writes to uncached memory without delaying the
+subsequent instructions. Each write buffer can handle operands up to 64 bits wide.
+<p>
+Temporary data may conveniently be stored on the stack because the stack area is very
+likely to be in the cache. However, you should be aware of the alignment problems
+if your data elements are bigger than the stack word size.
+<p>
+If the life ranges of two data structures do not overlap, then they may share
+the same RAM area to increase cache efficiency. This is consistent with the
+common practice of allocating space for temporary variables on the stack.
+<p>
+Storing temporary data in registers is of course even more efficient. Since registers is a
+scarce ressource you may want to use <kbd>[ESP]</kbd> rather than <kbd>[EBP]</kbd> for addressing data on the
+stack, in order to free <kbd>EBP</kbd> for other purposes. Just don't forget that the value of <kbd>ESP</kbd>
+changes every time you do a <kbd>PUSH</kbd> or <kbd>POP</kbd>.
+(You cannot use <kbd>ESP</kbd> under 16-bit Windows
+because the timer interrupt will modify the high word of <kbd>ESP</kbd> at unpredictable places in your
+code.)
+<p>
+There is a separate cache for code, which is similar to the data cache. The size of the code
+cache is 8 kb on PPlain and PPro and 16 kb on the PMMX, PII and PIII. It is important that the
+critical part of your code (the innermost loops) fit in the code cache. Frequently used pieces
+of code or routines which are used together should preferable be stored near each other.
+Seldom used branches or procedures should be put away in the bottom of your code or
+somewhere else.
+<p>
+<h2><a name="8">8</a>. First time versus repeated execution</h2><p>
+A piece of code usually takes much more time the first time it is executed than when it is
+repeated. The reasons are the following:
+<ol>
+<li>Loading the code from RAM into the cache takes longer time than executing it.
+<li>Any data accessed by the code has to be loaded into the cache, which may take much
+more time than executing the instructions. When the code is repeated then the data are
+more likely to be in the cache.
+<li>Jump instructions will not be in the branch target buffer the first time they execute, and
+therefore are less likely to be predicted correctly. See chapter <a href="#22">22</a>.
+<li>In the PPlain, decoding the code is a bottleneck. If it takes one clock cycle to determine
+the length of an instruction, then it is not possible to decode two instructions per clock
+cycle, because the processor doesn't know where the second instruction begins. The
+PPlain solves this problem by remembering the length of any instruction which has
+remained in the cache since last time it was executed. As a consequence of this, a set
+of instructions will not pair in the PPlain the first time they are executed, unless the first
+of the two instructions is only one byte long. The PMMX, PPro, PII and PIII have no penalty
+on first time decoding.
+</ol><p>
+For these four reasons, a piece of code inside a loop will generally take much more time the
+first time it executes than the subsequent times.
+<p>
+If you have a big loop which doesn't fit into the code cache then you will get penalties all the
+time because it doesn't run from the cache. You should therefore try to reorganize the loop
+to make it fit into the cache.
+<p>
+If you have very many jumps, calls, and branches inside a loop, then you may get the
+penalty of branch target buffer misses repeatedly.
+<p>
+Likewise, if a loop repeatedly accesses a data structure too big for the data cache, then you
+will get the penalty of data cache misses all the time.
+<p>
+<h2><a name="9">9</a>. Address generation interlock (PPlain and PMMX)</h2><p>
+It takes one clock cycle to calculate the address needed by an instruction which accesses
+memory. Normally, this calculation is done at a separate stage in the pipeline while the
+preceding instruction or instruction pair is executing. But if the address depends on the
+result of an instruction executing in the preceding clock cycle, then you have to wait an
+extra clock cycle for the address to be calculated. This is called an AGI stall.
+Example:<br>
+<kbd>ADD EBX,4 / MOV EAX,[EBX] ; AGI stall</kbd><br>
+The stall in this example can be removed by putting some other instructions in between
+<kbd>ADD EBX,4</kbd> and <kbd>MOV EAX,[EBX]</kbd> or by rewriting the code to:
+<kbd>MOV EAX,[EBX+4] / ADD EBX,4</kbd>
+<p>
+You can also get an AGI stall with instructions which use <kbd>ESP</kbd> implicitly
+for addressing, such
+as <kbd>PUSH, POP, CALL,</kbd> and <kbd>RET</kbd>, if <kbd>ESP</kbd> has been
+changed in the preceding clock cycle by
+instructions such as <kbd>MOV, ADD,</kbd> or <kbd>SUB</kbd>.
+The PPlain and PMMX have special circuitry to
+predict the value of <kbd>ESP</kbd> after a stack operation so that you do not
+get an AGI delay after
+changing <kbd>ESP</kbd> with <kbd>PUSH, POP,</kbd> or <kbd>CALL</kbd>.
+You can get an AGI stall after <kbd>RET</kbd> only if it has an
+immediate operand to add to <kbd>ESP</kbd>.
+<p>
+Examples:
+<pre>ADD ESP,4 / POP ESI ; AGI stall
+POP EAX / POP ESI ; no stall, pair
+MOV ESP,EBP / RET ; AGI stall
+CALL L1 / L1: MOV EAX,[ESP+8] ; no stall
+RET / POP EAX ; no stall
+RET 8 / POP EAX ; AGI stall</pre>
+<p>
+The <kbd>LEA</kbd> instruction is also subject to an AGI stall if it uses a
+base or index register which
+has been changed in the preceding clock cycle. Example:
+<pre>INC ESI / LEA EAX,[EBX+4*ESI] ; AGI stall</pre>
+<p>
+PPro, PII and PIII have no AGI stalls for memory reads and <kbd>LEA</kbd>, but they do have
+AGI stalls for memory writes. This is not very significant unless the subsequent
+code has to wait for the write to finish.<p>
+<h2><a name="10">10</a>. Pairing integer instructions (PPlain and PMMX)</h2>
+<h3><a name="10_1">10.1 Perfect pairing</a></h3><p>
+The PPlain and PMMX have two pipelines for executing instructions, called the U-pipe and
+the V-pipe. Under certain conditions it is possible to execute two instructions
+simultaneously, one in the U-pipe and one in the V-pipe. This can almost double the speed.
+It is therefore advantageous to reorder your instructions to make them pair.
+<p>
+The following instructions are pairable in either pipe:
+<ul><li><kbd>MOV</kbd> register, memory, or immediate into register or memory
+<li><kbd>PUSH</kbd> register or immediate, <kbd>POP</kbd> register
+<li><kbd>LEA, NOP</kbd>
+<li><kbd>INC, DEC, ADD, SUB, CMP, AND, OR, XOR,</kbd>
+<li>and some forms of <kbd>TEST</kbd> (see chapter <a href="#26_14">26.14</a>)
+</ul><p>
+The following instructions are pairable in the U-pipe only:
+<ul><li><kbd>ADC, SBB</kbd>
+<li><kbd>SHR, SAR, SHL, SAL</kbd> with immediate count
+<li><kbd>ROR, ROL, RCR, RCL</kbd> with an immediate count of 1
+</ul><p>
+The following instructions can execute in either pipe but are only pairable
+when in the V-pipe:
+<ul><li>near call
+<li>short and near jump
+<li>short and near conditional jump.
+</ul><p>
+All other integer instructions can execute in the U-pipe only, and are not pairable.
+<p>
+Two consecutive instructions will pair when the following conditions are met:
+<p>
+<u>1.</u> The first instruction is pairable in the U-pipe and the second
+instruction is pairable in the V-pipe.
+<p>
+<u>2.</u> The second instruction does not read or write a register which the first
+instruction writes to.<br>
+Examples:
+<pre> MOV EAX, EBX / MOV ECX, EAX ; read after write, do not pair
+ MOV EAX, 1 / MOV EAX, 2 ; write after write, do not pair
+ MOV EBX, EAX / MOV EAX, 2 ; write after read, pair OK
+ MOV EBX, EAX / MOV ECX, EAX ; read after read, pair OK
+ MOV EBX, EAX / INC EAX ; read and write after read, pair OK</pre>
+<p>
+<u>3.</u> In rule 2 partial registers are treated as full registers. Example:
+<pre> MOV AL, BL / MOV AH, 0</pre><p>
+writes to different parts of the same register, do not pair
+<p>
+<u>4.</u> Two instructions which both write to parts of the flags register can pair despite rule 2 and
+3. Example:
+<pre> SHR EAX, 4 / INC EBX ; pair OK</pre>
+<p>
+<u>5.</u> An instruction which writes to the flags can pair with a conditional jump despite rule 2.
+Example:
+<pre> CMP EAX, 2 / JA LabelBigger ; pair OK</pre>
+<p>
+<u>6.</u> The following instruction combinations can pair despite the fact that they both modify the
+stack pointer:
+<pre> PUSH + PUSH, PUSH + CALL, POP + POP</pre>
+<p>
+<u><a name="10-7">7.</a></u> There are restrictions on the pairing of instructions with prefix.
+There are several types of prefixes:
+<ul>
+<li>instructions addressing a non-default segment have a segment prefix.
+<li>instructions using 16 bit data in 32 bit mode, or 32 bit data in 16 bit mode have an
+operand size prefix.
+<li>instructions using 32 bit base or index registers in 16 bit mode have an address size
+prefix.
+<li>repeated string instructions have a repeat prefix.
+<li>locked instructions have a <kbd>LOCK</kbd> prefix.
+<li>many instructions which were not implemented on the 8086 processor have a two byte
+opcode where the first byte is <kbd>0FH</kbd>. The <kbd>0FH</kbd> byte behaves
+as a prefix on the PPlain, but
+not on the other versions. The most common instructions with <kbd>0FH</kbd>
+prefix are: <kbd>MOVZX,
+MOVSX, PUSH FS, POP FS, PUSH GS, POP GS, LFS, LGS, LSS, SETcc, BT,
+BTC, BTR, BTS, BSF, BSR, SHLD, SHRD,</kbd> and <kbd>IMUL</kbd> with two operands and no
+immediate operand.
+</ul>
+<p>
+On the PPlain, a prefixed instruction can only execute in the U-pipe, except for conditional
+near jumps.
+<p>
+On the PMMX, instructions with operand size, address size, or <kbd>0FH</kbd>
+prefix can execute in
+either pipe, whereas instructions with segment, repeat, or lock prefix can
+only execute in the U-pipe.
+<p>
+<u>8.</u> An instruction which has both a displacement and immediate data is not pairable on the
+PPlain and only pairable in the U-pipe on the PMMX:
+<pre> MOV DWORD PTR DS:[1000], 0 ; not pairable or only in U-pipe
+ CMP BYTE PTR [EBX+8], 1 ; not pairable or only in U-pipe
+ CMP BYTE PTR [EBX], 1 ; pairable
+ CMP BYTE PTR [EBX+8], AL ; pairable</pre><p>
+ (Another problem with instructions which have both a displacement and
+ immediate data on the PMMX is that such instructions may be longer
+ than 7 bytes, which means that only one instruction can be decoded
+ per clock cycle, as explained in chapter <a href="#12">12</a>.)
+<p>
+<u>9.</u> Both instructions must be preloaded and decoded. This is explained in
+chapter <a href="#8">8</a>.
+<p>
+<u>10.</u> There are special pairing rules for MMX instructions on the PMMX:
+<ul>
+<li>MMX shift, pack or unpack instructions can execute in either pipe but cannot pair with
+other MMX shift, pack or unpack instructions.
+<li>MMX multiply instructions can execute in either pipe but cannot pair with other MMX
+multiply instructions. They take 3 clock cycles and the last 2 clock cycles can overlap
+with subsequent instructions in the same way as floating point instructions can (see
+chapter <a href="#24">24</a>).
+<li>an MMX instruction which accesses memory or integer registers can execute only in the
+U-pipe and cannot pair with a non-MMX instruction.
+</ul>
+<p>
+
+<h3><a name="10_2">10.2 Imperfect pairing</a></h3><p>
+There are situations where the two instructions in a pair will not execute simultaneously, or
+only partially overlap in time. They should still be considered a pair, though, because the
+first instruction executes in the U-pipe, and the second in the V-pipe. No subsequent
+instruction can start to execute before both instructions in the imperfect pair have finished.
+<p>
+Imperfect pairing will happen in the following cases:
+<p>
+<u>1.</u> If the second instructions suffers an AGI stall (see chapter <a href="#9">9</a>).
+<p>
+<u>2.</u> Two instructions cannot access the same DWORD of memory simultaneously.
+The following examples assume that <kbd>ESI</kbd> is divisible by 4:<br>
+<kbd> MOV AL, [ESI] / MOV BL, [ESI+1]</kbd><br>
+The two operands are within the same DWORD, so they cannot execute
+simultaneously. The pair takes 2 clock cycles.<br>
+<kbd> MOV AL, [ESI+3] / MOV BL, [ESI+4]</kbd><br>
+Here the two operands are on each side of a DWORD boundary, so they
+pair perfectly, and take only one clock cycle.
+<p>
+<u>3.</u> Rule 2 is extended to the case where bit 2-4 is the same in the two addresses (cache
+bank conflict). For DWORD addresses this means that the difference between the two
+addresses should not be divisible by 32. Examples:
+<pre> MOV [ESI], EAX / MOV [ESI+32000], EBX ; imperfect pairing
+ MOV [ESI], EAX / MOV [ESI+32004], EBX ; perfect pairing</pre>
+<p>
+Pairable integer instructions which do not access memory take one clock cycle to
+execute, except for mispredicted jumps. <kbd>MOV</kbd> instructions to or from
+memory also take
+only one clock cycle if the data area is in the cache and properly aligned. There is no
+speed penalty for using complex addressing modes such as scaled index registers.
+<p>
+A pairable integer instruction which reads from memory, does some calculation, and
+stores the result in a register or flags, takes 2 clock cycles. (read/modify instructions).
+<p>
+A pairable integer instruction which reads from memory, does some calculation, and
+writes the result back to the memory, takes 3 clock cycles. (read/modify/write
+instructions).
+<p>
+<u>4.</u> If a read/modify/write instruction is paired with a read/modify or read/modify/write
+instruction, then they will pair imperfectly.
+
+<p>
+The number of clock cycles used is given in the following table:
+<table border=1 cellpadding=1 cellspacing=1><tr>
+<td align="center" class="a3">
+First instruction</td>
+<td colspan=3 align="center" class="a3">Second instruction</td></tr>
+<tr><td> </td><td align=center> MOV or register only
+</td><td align=center> read/modify </td>
+<td align=center> read/modify/write </td></tr>
+<tr><td align=center> MOV or register only </td>
+<td align=center> 1 </td>
+<td align=center> 2 </td>
+<td align=center> 3 </td></tr>
+<tr><td align=center> read/modify </td>
+<td align=center> 2 </td>
+<td align=center> 2 </td>
+<td align=center> 3 </td></tr>
+<tr><td align=center> read/modify/write </td>
+<td align=center> 3 </td>
+<td align=center> 4 </td>
+<td align=center> 5 </td></tr>
+</table>
+
+<p>Example:<br><kbd> ADD [mem1], EAX / ADD EBX, [mem2] ; 4 clock cycles<br> ADD EBX, [mem2] / ADD [mem1], EAX ; 3 clock cycles</kbd>
+<p>
+<u>5.</u> When two paired instructions both take extra time due to cache misses, misalignment,
+or jump misprediction, then the pair will take more time than each instruction, but less
+than the sum of the two.
+<p>
+<u>6.</u> A pairable floating point instruction followed by <kbd>FXCH</kbd>
+ will make imperfect pairing if the
+next instruction is not a floating point instruction.
+<p>
+<p>In order to avoid imperfect pairing you have to know which instructions go into the U-pipe,
+and which to the V-pipe. You can find out this by looking backwards in your code and
+search for instructions which are unpairable, pairable only in one of the pipes, or cannot pair
+due to one of the rules above.
+<p>
+Imperfect pairing can often be avoided by reordering your instructions.
+Example:
+ <br>
+<pre>L1: MOV EAX,[ESI]
+ MOV EBX,[ESI]
+ INC ECX</pre><p>
+
+Here the two <kbd>MOV</kbd> instructions form an imperfect pair because they both access the same
+memory location, and the sequence takes 3 clock cycles. You can improve the code by
+reordering the instructions so that <kbd>INC ECX</kbd> pairs with one of the
+<kbd>MOV</kbd> instructions.
+
+<pre>L2: MOV EAX,OFFSET A
+ XOR EBX,EBX
+ INC EBX
+ MOV ECX,[EAX]
+ JMP L1</pre><p>
+
+The pair <kbd>INC EBX / MOV ECX,[EAX]</kbd> is imperfect because the latter
+instruction has an
+AGI stall. The sequence takes 4 clocks. If you insert a <kbd>NOP</kbd> or any other instruction so that
+<kbd>MOV ECX,[EAX]</kbd> pairs with <kbd>JMP L1</kbd> instead, then the sequence takes only 3 clocks.
+<p>
+<a name="imperfectpush">
+The next example is in 16 bit mode, assuming that <kbd>SP</kbd> is divisible by 4:</a>
+
+<pre>L3: PUSH AX
+ PUSH BX
+ PUSH CX
+ PUSH DX
+ CALL FUNC</pre><p>
+
+Here the <kbd>PUSH</kbd> instructions form two imperfect pairs, because both operands in each pair go
+into the same dword of memory. <kbd>PUSH BX</kbd> could possibly pair perfectly
+with <kbd>PUSH CX</kbd>
+(because they go on each side of a DWORD boundary) but it doesn't because it has already
+been paired with <kbd>PUSH AX</kbd>. The sequence therefore takes 5 clocks. If you insert a <kbd>NOP</kbd> or
+any other instruction so that <kbd>PUSH BX</kbd> pairs with <kbd>PUSH CX</kbd>,
+and <kbd>PUSH DX</kbd> with <kbd>CALL FUNC</kbd>,
+then the sequence will take only 3 clocks. Another way to solve the problem is to make sure
+that <kbd>SP</kbd> is not divisible by 4. Knowing whether <kbd>SP</kbd> is
+divisible by 4 or not in 16 bit mode can
+be difficult, so the best way to avoid this problem is to use 32 bit mode.
+
+<p>
+
+<h2><a name="11">11</a>. Splitting complex instructions into simpler ones (PPlain and PMMX)</h2><p>
+You may split up read/modify and read/modify/write instructions to improve pairing.
+Example:<br>
+<kbd> ADD [mem1],EAX / ADD [mem2],EBX ; 5 clock cycles</kbd><br>
+This code may be split up into a sequence which takes only 3 clock cycles:
+<pre> MOV ECX,[mem1] / MOV EDX,[mem2] / ADD ECX,EAX / ADD EDX,EBX
+ MOV [mem1],ECX / MOV [mem2],EDX</pre><p>
+
+Likewise you may split up non-pairable instructions into pairable instructions:
+<pre> PUSH [mem1]
+ PUSH [mem2] ; non-pairable</pre><p>
+Split up into:
+<pre> MOV EAX,[mem1]
+ MOV EBX,[mem2]
+ PUSH EAX
+ PUSH EBX ; everything pairs</pre><p>
+
+Other examples of non-pairable instructions which may be split up into simpler pairable
+instructions:<br>
+<kbd>CDQ</kbd> split into: <kbd>MOV EDX,EAX / SAR EDX,31</kbd><br>
+<kbd>NOT EAX</kbd> change to <kbd>XOR EAX,-1</kbd><br>
+<kbd>NEG EAX</kbd> split into <kbd>XOR EAX,-1 / INC EAX</kbd><br>
+<kbd>MOVZX EAX,BYTE PTR [mem]</kbd> split into <kbd> XOR EAX,EAX / MOV AL,BYTE PTR [mem]</kbd><br>
+<kbd>JECXZ</kbd> split into <kbd>TEST ECX,ECX / JZ</kbd><br>
+<kbd>LOOP</kbd> split into <kbd>DEC ECX / JNZ</kbd><br>
+<kbd>XLAT</kbd> change to <kbd>MOV AL,[EBX+EAX]</kbd>
+<p>
+If splitting instructions doesn't improve speed, then you may keep the complex or
+nonpairable instructions in order to reduce code size.
+<p>
+Splitting instructions is not needed on the PPro, PII and PIII, except when the split instructions
+generate fewer uops.
+<p>
+<h2><a name="12">12</a>. Prefixes (PPlain and PMMX)</h2><p>
+An instruction with one or more prefixes may not be able to execute in the V-pipe (se
+<a href="#10-7">chapter 10, sect. 7</a>), and it may take more than one clock cycle to decode.
+<p>
+On the PPlain, the decoding delay is one clock cycle for each prefix except for the <kbd>0FH</kbd>
+prefix of conditional near jumps.
+<p>
+The PMMX has no decoding delay for <kbd>0FH</kbd> prefix.
+Segment and repeat prefixes take one
+clock extra to decode. Address and operand size prefixes take two clocks extra to decode.
+The PMMX can decode two instructions per clock cycle if the first instruction has a
+segment or repeat prefix or no prefix, and the second instruction has no prefix. Instructions
+with address or operand size prefixes can only decode alone on the PMMX. Instructions with
+more than one prefix take one clock extra for each prefix.
+<p>
+Address size prefixes can be avoided by using 32 bit mode. Segment prefixes can be
+avoided in 32 bit mode by using a flat memory model. Operand size prefixes can be avoided
+in 32 bit mode by using only 8 bit and 32 bit integers.
+<p>
+Where prefixes are unavoidable, the decoding delay may be masked if a preceding
+instruction takes more than one clock cycle to execute. The rule for the PPlain is that any
+instruction which takes N clock cycles to execute (not to decode) can 'overshadow' the
+decoding delay of N-1 prefixes in the next two (sometimes three) instructions or instruction
+pairs. In other words, each extra clock cycle that an instruction takes to execute can be
+used to decode one prefix in a later instruction. This shadowing effect even extends across
+a predicted branch. Any instruction which takes more than one clock cycle to execute, and
+any instruction which is delayed because of an AGI stall, cache miss, misalignment, or any
+other reason except decoding delay and branch misprediction, has a shadowing effect.
+<p>
+The PMMX has a similar shadowing effect, but the mechanism is different. Decoded
+instructions are stored in a transparent first-in-first-out (FIFO) buffer, which can hold up to
+four instructions. As long as there are instructions in the FIFO buffer you get no delay.
+When the buffer is empty then instructions are executed as soon as they are decoded. The
+buffer is filled when instructions are decoded faster than they are executed, i.e. when you
+have unpaired or multi-cycle instructions. The FIFO buffer is emptied when instructions
+execute faster than they are decoded, i.e. when you have decoding delays due to prefixes.
+The FIFO buffer is empty after a mispredicted branch. The FIFO buffer can receive two
+instructions per clock cycle provided that the second instruction is without prefixes and
+none of the instructions are longer than 7 bytes. The two execution pipelines (U and V) can
+each receive one instruction per clock cycle from the FIFO buffer.
+<p>
+Examples: <br>
+<kbd> CLD / REP MOVSD</kbd><br>
+The <kbd>CLD</kbd> instruction takes two clock cycles and can therefore overshadow the decoding
+delay of the <kbd>REP</kbd> prefix. The code would take one clock cycle more if the <kbd>CLD</kbd> instruction was
+placed far from the <kbd>REP MOVSD.</kbd>
+<br>
+<kbd> CMP DWORD PTR [EBX],0 / MOV EAX,0 / SETNZ AL</kbd><br>
+The <kbd>CMP</kbd> instruction takes two clock cycles here because it is a read/modify instruction. The
+<kbd>0FH</kbd> prefix of the <kbd>SETNZ</kbd> instruction is decoded during the second clock cycle of the <kbd>CMP </kbd>
+instruction, so that the decoding delay is hidden on the PPlain (The PMMX has no
+decoding delay for the <kbd>0FH</kbd>).
+<p>
+Prefix penalties in PPro, PII and PIII are described in chapter <a href="#14">14</a>.
+<p>
+<h2><a name="13">13</a>. Overview of PPro, PII and PIII pipeline</h2><p>
+The architecture of the PPro, PII and PIII microprocessors is well explained and illustrated in
+various manuals and tutorials from Intel. It is recommended that you study this material in
+order to get an understanding of how these microprocessors work. I will describe the
+structure briefly here with particular focus on those elements that are important for
+optimizing code.
+<p>
+Instruction codes are fetched from the code cache in aligned 16-byte chunks into a double
+buffer that can hold two 16-byte chunks. The code is passed on from the double buffer to
+the decoders in blocks which I will call ifetch blocks (instruction fetch blocks). The ifetch
+blocks are usually 16 bytes long, but not aligned. The purpose of the double-buffer is to
+make it possible to decode an instruction that crosses a 16-byte boundary (i.e. an address
+divisible by 16).
+<p>
+The ifetch block goes to the instruction length decoder, which determines where each
+instruction begins and ends, and next to the instruction decoders. There are three decoders
+so that you can decode up to three instructions in each clock cycle. A group of up to three
+instructions that are decoded in the same clock cycle is called a decode group.
+<p>
+The decoders translate instructions into micro-operations, abbreviated uops. Simple
+instructions generate only one uop, while more complex instructions may generate several
+uops. For example, the instruction <kbd>ADD EAX,[MEM]</kbd> is decoded into two uops: one for
+reading the source operand from memory, and one for doing the addition. The purpose of
+splitting instructions into uops is to make the handling later in the system more effective.
+<p>
+The three decoders are called D0, D1, and D2. D0 can handle all instructions, while D1
+and D2 can handle only simple instructions that generate one uop.
+<p>
+The uops from the decoders go via a short queue to the register allocation table (RAT). The
+execution of uops work on temporary registers which are later written to the permanent
+registers <kbd>EAX, EBX</kbd>, etc. The purpose of the RAT is to tell the uops which temporary
+registers to use, and to allow register renaming (see later).
+<p>
+After the RAT, the uops to go the reorder buffer (ROB). The purpose of the ROB is to
+enable out-of-order execution. A uop stays in the reservation station until the operands it
+needs are available. If an operand for one uop is delayed because a previous uop that
+generates the operand is not finished yet, then the ROB may find another uop later in the
+queue that can be executed in the meantime in order to save time.
+<p>
+The uops that are ready for execution are sent to the execution units, which are clustered
+around five ports: Port 0 and 1 can handle arithmetic operations, jumps, etc. Port 2 takes
+care of all reads from memory, port 3 calculates addresses for memory writes, and port 4
+does memory writes.
+<p>
+When an instruction has been executed then it is marked in the ROB as ready to retire. It then goes to
+the retirement station. Here the contents of the temporary registers used by the uops are
+written to the permanent registers. While uops can be executed out of order, they must be
+retired in order.
+<p>
+In the following chapters, I will describe in detail how to optimize the throughput of each step
+in the pipeline.
+<p>
+<h2><a name="14">14</a>. Instruction decoding (PPro, PII and PIII)</h2><p>
+I am describing instruction decoding before instruction fetching here because you need to
+know how the decoders work in order to understand the possible delays in instruction
+fetching.
+<p>
+The decoders can handle three instructions per clock cycle, but only when certain
+conditions are met. Decoder D0 can handle any instruction that generates up to 4 uops in a
+single clock cycle. Decoders D1 and D2 can handle only instructions that generate 1 uop
+and these instructions can be no more than 8 bytes long.
+<p>
+To summarize the rules for decoding two or three instructions in the same clock cycle:
+<ul>
+<li>The first instruction (D0) generates no more than 4 uops,
+<li>The second and third instructions generate no more than 1 uop each,
+<li>The second and third instructions are no more than 8 bytes long each,
+<li>The instructions must be contained within the same 16 bytes ifetch block (see next
+chapter).
+</ul><p>
+There is no limit to the length of the instruction in D0 (despite Intel manuals saying
+something else), as long as the three instructions fit into one 16 bytes ifetch block.
+<p>
+An instruction that generates more than 4 uops takes two or more clock cycles to decode,
+and no other instructions can decode in parallel.
+<p>
+It follows from the rules above that the decoders can produce a maximum of 6 uops per
+clock cycle if the first instruction in each decode group generates 4 uops and the next two
+generate 1 uop each. The minimum production is 2 uops per clock cycle, which you get
+when all instructions generate 2 uops each, so that D1 and D2 are never used.
+<p>
+For maximum throughput, it is recommended that you order your instructions according to
+the 4-1-1 pattern: instructions that generate 2 to 4 uops can be interspearsed with two
+simple 1-uop instructions for free, in the sense that they do not add to the decoding time.
+Example:
+<pre>MOV EBX, [MEM1] ; 1 uop (D0)
+INC EBX ; 1 uop (D1)
+ADD EAX, [MEM2] ; 2 uops (D0)
+ADD [MEM3], EAX ; 4 uops (D0)</pre><p>
+This takes 3 clock cycles to decode. You can save one clock cycle by reordering the
+instructions into two decode groups:
+<pre>ADD EAX, [MEM2] ; 2 uops (D0)
+MOV EBX, [MEM1] ; 1 uop (D1)
+INC EBX ; 1 uop (D2)
+ADD [MEM3], EAX ; 4 uops (D0)</pre><p>
+
+The decoders now generate 8 uops in two clock cycles, which is probably satisfactory.
+Later stages in the pipeline can handle only 3 uops per clock cycle so with a decoding rate
+higher than this you can assume that decoding is not a bottleneck. However, complications
+in the fetch mechanism can delay decoding as described in the next chapter, so to be safe
+you may want to aim at a decoding rate higher than 3 uops per clock cycle.
+<p>
+You can see how many uops each instruction generates in the tables in chapter <a href="#29">29</a>.
+<p>
+Instruction prefixes can also incur penalties in the decoders. Instructions can have several
+kinds of prefixes:
+ <ul>
+<li>An operand size prefix is needed when you have a 16-bit operand in a 32-bit
+environment or vice versa. (Except for instructions that can only have one operand size,
+such as <kbd>FNSTSW AX</kbd>). An operand size prefix gives a penalty of a few clocks if the
+instruction has an immediate operand of 16 or 32 bits because the length of the operand
+is changed by the prefix. Examples:
+<pre> ADD BX, 9 ; no penalty because immediate operand is 8 bits
+ MOV WORD PTR [MEM16], 9 ; penalty because operand is 16 bits </pre>
+The last instruction should be changed to:
+<pre> MOV EAX, 9
+ MOV WORD PTR [MEM16], AX ; no penalty because no immediate</pre>
+<li>An address size prefix is used when you use 32-bit addressing in 16 bit mode or vice
+versa. This is seldom needed and should generally be avoided. The address size prefix
+gives a penalty whenever you have an explicit memory operand (even when there is no
+displacement) because the interpretation of the r/m bits in the instruction code is
+changed by the prefix. Instructions with only implicit memory operands, such as string
+instructions, have no penalty with address size prefix.
+<li>Segment prefixes are used when you address data in a non-default data segment.
+Segment prefixes give no penalty on the PPro, PII and PIII.
+<li>Repeat prefixes and lock prefixes give no penalty in the decoders.
+<li>There is always a penalty if you have more than one prefix. This penalty is usually one
+clock per prefix.
+</ul>
+<p>
+<h2><a name="15">15</a>. Instruction fetch (PPro, PII and PIII)</h2><p>
+The code is fetched in aligned 16-bytes chunks from the code cache and placed in the
+double buffer, which is called so because it can contain two such chunks. The code is then
+taken from the double buffer and fed to the decoders in blocks which are usually 16 bytes
+long, but not necessarily aligned by 16. I will call these blocks ifetch blocks (instruction fetch
+blocks). If an ifetch block crosses a 16 byte boundary in the code then it needs to take from
+both chunks in the double buffer. So the purpose of the double buffer is to allow instruction
+fetching across 16 byte boundaries.
+<p>
+The double buffer can fetch one 16-bytes chunk per clock cycle and can generate one
+ifetch block per clock cycle. The ifetch blocks are usually 16 bytes long, but can be shorter
+if there is a predicted jump in the block. (See chapter <a href="#22">22</a> about jump prediction).
+<p>
+Unfortunately, the double buffer is not big enough for handling fetches around jumps
+without delay. If the ifetch block that contains the jump instruction crosses a 16-byte
+boundary then the double buffer needs to keep two consecutive aligned 16-bytes chunks of
+code in order to generate it. If the first instruction after the jump crosses a 16-byte
+boundary, then the double buffer needs to load two new 16-bytes chunks of code before a
+valid ifetch block can be generated. This means that, in the worst case, the decoding of the
+first instruction after a jump can be delayed for two clock cycles. You get one penalty for a
+16-byte boundary in the ifetch block containing the jump instruction, and one penalty for a
+16-byte boundary in the first instruction after the jump. You can get bonus if you have more
+than one decode group in the ifetch block that contains the jump because this gives the
+double buffer extra time to fetch one or two 16-byte chunks of code in advance for the
+instructions after the jump. The bonuses can compensate for the penalties according to the
+table below. If the double buffer has fetched only one 16-byte chunk of code after the jump,
+then the first ifetch block after the jump will be identical to this chunk, that is, aligned to a
+16-byte boundary. In other words, the first ifetch block after the jump will not begin at the
+first instruction, but at the nearest preceding address divisible by 16. If the double buffer
+has had time to load two 16-byte chunks, then the new ifetch block can cross a 16-byte
+boundary and begin at the first instruction after the jump. These rules are summarized in
+the following <a name="ifetchtable">table:</a><p>
+
+<table border=1 cellpadding=1 cellspacing=1><tr><td class="a3">
+Number of<br>decode groups<br>in ifetch-block<br>containing jump</td>
+<td class="a3">16-byte<br>boundary in this<br>ifetch-block</td>
+<td class="a3">16-byte<br>boundary in first<br>instruction after<br>jump</td>
+<td class="a3"><br><br>decoder delay</td>
+<td class="a3">alignment of first<br>ifetch after jump</td></tr>
+<tr><td align="center">1</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">by 16</td></tr>
+<tr><td align="center">1</td>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">1</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">by 16</td></tr>
+<tr><td align="center">1</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">2</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">2</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">2</td>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">2</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">by 16</td></tr>
+<tr><td align="center">2</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">3 or more</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">3 or more</td>
+<td align="center">0</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">3 or more</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+<tr><td align="center">3 or more</td>
+<td align="center">1</td>
+<td align="center">1</td>
+<td align="center">0</td>
+<td align="center">to instruction</td></tr>
+</table>
+<p>Jumps delay the fetching so that a loop always takes at least two clock cycles more per
+iteration than the number of 16 byte boundaries in the loop.
+<p>
+A further problem with the instruction fetch mechanism is that a new ifetch block is not
+generated until the previous one is exhausted. Each ifetch block can contain several
+decode groups. If a 16 bytes long ifetch block ends with an unfinished instruction, then the
+next ifetch block will begin at the beginning of that instruction. The first instruction in an
+ifetch block always goes to decoder D0, and the next two instructions go to D1 and D2, if
+possible. The consequence of this is that D1 and D2 are used less than optimally. If the
+code is structured according to the recommended 4-1-1 pattern, and an instruction intended
+to go into D1 or D2 happens to be the first instruction in an ifetch block, then that instruction
+has to go into D0 with the result that one clock cycle is wasted.
+This is probably a hardware design flaw. At least it is suboptimal design.
+The consequence of this problem is that the time it takes to decode a piece of
+code can vary considerably depending on where the first ifetch block begins.
+<p>
+If decoding speed is critical and you want to avoid these problems then you have to know
+where each ifetch block begins. This is quite a tedious job. First you need to make your
+code segment paragraph-aligned in order to know where the 16-byte boundaries are. Then
+you have to look at the output listing from your assembler to see how long each instruction
+is. (It is recommended that you study how instructions are coded so that you can predict the
+lengths of the instructions.) If you know where one ifetch block begins then you can find
+where the next ifetch block begins in the following way: Make the block 16 bytes long. If it
+ends at an instruction boundary then the next block will begin there. If it ends with an
+unfinished instruction then the next block will begin at the beginning of this instruction.
+(Only the lengths of the instructions counts here, it doesn't matter how many uops they
+generate or what they do). This way you can work your way all through the code and mark
+where each ifetch block begins. The only problem is knowing where to start. If you know
+where one ifetch block is then you can find all the subsequent ones, but you have to know
+where the first one begins. Here are some guidelines:
+ <ul>
+<li>The first ifetch block after a jump, call, or return can begin either at the first instruction or
+at the nearest preceding 16-bytes boundary, according to the table above. If you align
+the first instruction to begin at a 16-byte boundary then you can be sure that the first
+ifetch block begins here. You may want to align important subroutine entries and loop
+entries by 16 for this purpose.
+
+<li>If the combined length of two consecutive instructions is more than 16 bytes then you
+can be certain that the second one doesn't fit into the same ifetch block as the first one,
+and consequently you will always have an ifetch block beginning at the second
+instruction. You can use this as a starting point for finding where subsequent ifetch
+blocks begin.
+
+<li>The first ifetch block after a branch misprediction begins at a 16-byte boundary. As
+explained in chapter <a href="#22_2">22.2</a>, a loop that repeats more than 5 times will always have a
+misprediction when it exits. The first ifetch block after such a loop will therefore begin at
+the nearest preceding 16-byte boundary.
+
+<li>Other serializing events also cause the next ifetch block to start at a 16-byte boundary.
+Such events include interrupts, exceptions, self-modifying code, and serializing
+instructions such as <kbd>CPUID, IN,</kbd> and <kbd>OUT</kbd>.
+</ul>
+<p>
+
+I am sure you want an example now:
+
+<pre>
+ address instruction length uops expected decoder
+ ----------------------------------------------------------------------
+ 1000h MOV ECX, 1000 5 1 D0
+ 1005h LL: MOV [ESI], EAX 2 2 D0
+ 1007h MOV [MEM], 0 10 2 D0
+ 1011h LEA EBX, [EAX+200] 6 1 D1
+ 1017h MOV BYTE PTR [ESI], 0 3 2 D0
+ 101Ah BSR EDX, EAX 3 2 D0
+ 101Dh MOV BYTE PTR [ESI+1],0 4 2 D0
+ 1021h DEC ECX 1 1 D1
+ 1022h JNZ LL 2 1 D2</pre>
+<p>
+Let's assume that the first ifetch block begins at address 1000h and ends at 1010h. This is
+before the end of the <kbd>MOV [MEM],0</kbd> instruction so the next ifetch block will begin at 1007h
+and end at 1017h. This is at an instruction boundary so the third ifetch block will begin at
+1017h and cover the rest of the loop. The number of clock cycles it takes to decode this is
+the number of D0 instructions, which is 5 per iteration of the LL loop. The last ifetch block
+contained three decode blocks covering the last five instructions, and it has one 16-byte
+boundary (1020h). Looking at the table above we find that the first ifetch block after the
+jump will begin at the first instruction after the jump, that is the <kbd>LL</kbd>
+label at 1005h, and end at
+1015h. This is before the end of the <kbd>LEA</kbd> instruction, so the next ifetch block will go from
+1011h to 1021h, and the last one from 1021h covering the rest. Now the <kbd>LEA</kbd> instruction
+and the <kbd>DEC</kbd> instruction both fall at the beginning of an ifetch block which forces them to go
+into D0. We now have 7 instructions in D0 and the loop takes 7 clocks to decode in the
+second iteration. The last ifetch block contains only one decode group
+ (<kbd>DEC ECX / JNZ LL</kbd>) and has no 16-byte boundary. According to the table, the next ifetch block after the
+jump will begin at a 16-byte boundary, which is 1000h. This will give us the same situation
+as in the first iteration, and you will see that the loop takes alternatingly 5 and 7 clock cycles
+to decode. Since there are no other bottlenecks, the complete loop will take 6000 clocks to
+run 1000 iterations. If the starting address had been different so that you had a 16-byte
+boundary in the first or the last instruction of the loop then it would take 8000 clocks. If you
+reorder the loop so that no D1 or D2 instructions fall at the beginning of an ifetch block then
+you can make it take only 5000 clocks.
+<p>
+The example above was deliberately constructed so that fetch and decoding is the only
+bottleneck. The easiest way to avoid this problem is to structure your code to generate
+much more than 3 uops per clock cycle so that decoding will not be a bottleneck despite the
+penalties described here. In small loops this may not be possible and then you have to find
+out how to optimize the instruction fetch and decoding.
+<p>
+One thing you can do is to change the starting address of your procedure in order to avoid
+16-byte boundaries where you don't want them. Remember to make your code segment
+paragraph aligned so that you know where the boundaries are.
+<p>
+If you insert an <kbd>ALIGN 16</kbd> directive before the loop entry then the assembler will put in
+<kbd>NOP</kbd>'s and other filler instructions up to the nearest 16 byte boundary. Most assemblers use
+the instruction <kbd>XCHG EBX,EBX</kbd> as a 2-byte filler (the so called 2-byte <kbd>NOP</kbd>). Whoever got
+this idea, it's a bad one because this instruction takes more time than two <kbd>NOP</kbd>'s on most
+processors! If the loop executes many times then whatever is outside the loop is
+unimportant in terms of speed and you don't have to care about the suboptimal filler
+instructions. But if the time taken by the fillers is important then you may
+select the filler instructions manually.
+You may as well use filler instructions that do something useful, such as refreshing
+a register in order to avoid register read stalls (see chapter <a href="#16_2">16.2</a>)
+For example, if you are using register <kbd>EBP</kbd> for addressing but seldom
+write to it, then you may use <kbd>MOV EBP,EBP</kbd> or <kbd>ADD EBP, 0</kbd> as
+filler in order to reduce the possibilities of register read stalls.
+If you have nothing useful to do, you may use <kbd>FXCH ST(0)</kbd> as a good filler
+because it doesn't put any load on the execution ports, provided that <kbd>ST(0)</kbd>
+contains a valid floating point value.
+<p>
+Another possible remedy is to reorder your instructions in order to get the ifetch boundaries
+where they don't hurt. This can be quite a difficult puzzle and it is not always possible to find
+a satisfactory solution.
+<p>
+Yet another possibility is to manipulate instruction lengths. Sometimes you can substitute
+one instruction with another one with a different length. Many instructions can be coded in
+different versions with different lengths. The assembler always chooses the shortest
+possible version of an instruction, but it is often possible to hard-code a longer version. For
+example, <kbd>DEC ECX</kbd> is one byte long, <kbd>SUB ECX,1</kbd> is 3 bytes, and you can code a 6 bytes
+version with a long immediate operand using this trick:
+<pre> SUB ECX, 9999
+ ORG $-4
+ DD 1</pre><p>
+Instructions with a memory operand can be made one byte longer with a SIB byte, but the
+easiest way of making an instruction one byte longer is to add a <kbd>DS:</kbd>
+segment prefix (<kbd>DB 3Eh</kbd>).
+The microprocessors generally accept redundant and meaningless prefixes (except
+<kbd>LOCK</kbd>) as long as the instruction length does not exceed 15 bytes. Even instructions without
+a memory operand can have a segment prefix. So if you want the <kbd>DEC ECX</kbd> instruction to be
+2 bytes long, write:
+<pre> DB 3Eh
+ DEC ECX</pre><p>
+Remember that you get a penalty in the decoder if an instruction has more than one prefix.
+It is possible that instructions with meaningless prefixes - especially repeat and
+lock prefixes - will be used in future processors for new instructions when there are no
+more vacant instruction codes, but I would consider it safe to use a segment prefix
+with any instruction.
+<p>
+With these methods it will usually be possible to put the ifetch boundaries where you want
+them, although it can be a tedious puzzle.
+<p>
+<h2><a name="16">16</a>. Register renaming (PPro, PII and PIII)</h2>
+<h3><a name="16_1">16.1 Eliminating dependencies</a></h3><p>
+Register renaming is an advanced technique used by these microprocessors to remove
+dependencies between different parts of the code. Example:
+<pre> MOV EAX, [MEM1]
+ IMUL EAX, 6
+ MOV [MEM2], EAX
+ MOV EAX, [MEM3]
+ INC EAX
+ MOV [MEM4], EAX</pre><p>
+Here the last three instructions are independent of the first three in the sense that they don't
+need any result from the first three instructions. To optimize this on earlier processors you
+would have to use a different register instead of <kbd>EAX</kbd> in the last three instructions and
+reorder the instructions so that the last three instructions could execute in parallel with the
+first three instructions. The PPro, PII and PIII processors do this for you automatically. They
+assign a new temporary register for <kbd>EAX</kbd> every time you write to it. Thereby the
+<kbd>MOV EAX,[MEM3]</kbd> instruction becomes independent of the preceding instructions.
+With out-of-order execution it is likely to finish the move to <kbd>[MEM4]</kbd> before the slow
+<kbd>IMUL</kbd> instruction is finished.
+<p>
+Register renaming goes fully automatically. A new temporary register is assigned as an
+alias for the permanent register every time an instruction writes to this register. An
+instruction that both reads and writes a register also causes renaming. For example the
+<kbd>INC EAX</kbd> instruction above uses one temporary register for input and another temporary
+register for output. This does not remove any dependency, of course, but it has some
+significance for subsequent register reads as I will explain later.
+<p>
+All general purpose registers, stack pointer, flags, floating point registers,
+MMX registers, XMM registers and segment registers can be renamed.
+Control words, and the floating point status word cannot be renamed and this is the
+reason why the use of these registers is slow. There are 40 universal temporary
+registers so it is unlikely that you will run out of temporary registers.
+<p>
+A common way of setting a register to zero is <kbd>XOR EAX,EAX</kbd> or
+<kbd>SUB EAX,EAX</kbd>. These
+instructions are not recognized as independent of the previous value of the register. If you
+want to remove the dependency on slow preceding instructions then use
+<kbd> MOV EAX,0.</kbd>
+<p>
+Register renaming is controlled by the register alias table (RAT) and the reorder buffer
+(ROB). The uops from the decoders go to the RAT via a queue, and then to the ROB and
+the reservation station. The RAT can handle only 3 uops per clock cycle. This means that
+the overall throughput of the microprocessor can never exceed 3 uops per clock cycle on
+average.
+<p>
+There is no practical limit to the number of renamings. The RAT can rename three registers
+per clock cycle, and it can even rename the same register three times in one clock cycle.
+<p>
+<h3><a name="16_2">16.2</a> Register read stalls</h3><p>
+But there is another limitation which may be quite serious, and that is that you
+can only read two different permanent register names per clock cycle. This
+limitation applies to all registers used by an instruction except those registers
+that the instruction writes to only.
+Example:
+<pre> MOV [EDI + ESI], EAX
+ MOV EBX, [ESP + EBP]</pre><p>
+The first instruction generates two uops: one that reads <kbd>EAX</kbd>
+and one that reads <kbd>EDI</kbd> and
+<kbd>ESI</kbd>. The second instruction generates one uop that reads
+<kbd>ESP</kbd> and <kbd>EBP</kbd>. <kbd>EBX</kbd> does not
+count as a read because it is only written to by the instruction. Let's assume that these
+three uops go through the RAT together. I will use the word triplet for a group of three
+consecutive uops that go through the RAT together. Since the ROB can handle only two
+permanent register reads per clock cycle and we need five register reads, our triplet will be
+delayed for two extra clock cycles before it comes to the reservation station. With 3 or 4
+register reads in the triplet it would be delayed by one clock cycle.
+<p>
+The same register can be read more than once in the same triplet without adding to the
+count. If the instructions above are changed to:
+<pre> MOV [EDI + ESI], EDI
+ MOV EBX, [EDI + EDI]</pre><p>
+then you will need only two register reads (<kbd>EDI</kbd> and <kbd>ESI</kbd>) and the triplet will not be delayed.
+<p>
+A register that is going to be written to by a pending uop is stored in the ROB so that it can
+be read for free until it is written back, which takes at least 3 clock cycles,
+and usually more. Write-back is the end of the execution stage where the value
+becomes available. In other words, you can read any number of registers in the
+RAT without stall if their values are not yet available from the execution units.
+The reason for this is that when a value becomes available it is immediately
+written directly to any subsequent ROB entries that need it. But if the value
+has already been written back to a temporary or permanent register when a
+subsequent uop that needs it goes into the RAT, then the value has to be read
+from the register file, which has only two read ports. There are three pipeline
+stages from the RAT to the execution unit so you can be certain that a register
+written to in one uop-triplet can be read for free in at least the next three
+triplets. If the writeback is delayed by reordering, slow instructions,
+dependency chains, cache misses, or by any other kind of stall, then the
+register can be read for free further down the instruction stream.
+<p>
+Example:
+<pre> MOV EAX, EBX
+ SUB ECX, EAX
+ INC EBX
+ MOV EDX, [EAX]
+ ADD ESI, EBX
+ ADD EDI, ECX</pre><p>
+These 6 instructions generate 1 uop each. Let's assume that the first 3 uops go through the
+RAT together. These 3 uops read register <kbd>EBX</kbd>, <kbd>ECX</kbd>, and <kbd>EAX</kbd>. But since we are writing to
+<kbd>EAX</kbd> before reading it, the read is free and we get no stall. The next three uops read <kbd>EAX</kbd>,
+<kbd>ESI</kbd>, <kbd>EBX</kbd>, <kbd>EDI</kbd>, and <kbd>ECX</kbd>. Since both <kbd>EAX</kbd>, <kbd>EBX</kbd> and <kbd>ECX</kbd> have been modified in the
+preceding triplet and not yet written back then they can be read for free, so that only <kbd>ESI</kbd>
+and <kbd>EDI</kbd> count, and we get no stall in the second triplet either. If the
+<kbd>SUB ECX,EAX</kbd>
+instruction in the first triplet is changed to <kbd>CMP ECX,EAX</kbd> then <kbd>ECX</kbd> is not written to and we
+will get a stall in the second triplet for reading <kbd>ESI</kbd>, <kbd>EDI</kbd> and <kbd>ECX</kbd>. Similarly, if the <kbd>INC</kbd>
+<kbd>EBX</kbd> instruction in the first triplet is changed to <kbd>NOP</kbd> or something else then we will get a stall
+in the second triplet for reading <kbd>ESI</kbd>, <kbd>EBX</kbd> and <kbd>EDI</kbd>.
+<p>
+No uop can read more than two registers. Therefore, all instructions that need
+to read more than two registers are split up into two or more uops.
+<p>
+To count the number of register reads, you have to include all registers which are read by
+the instruction. This includes integer registers, the flags register, the stack pointer,
+floating point registers and MMX registers.
+An XMM register counts as two registers,
+except when only part of it is used, as e.g. in <kbd>ADDSS</kbd> and <kbd>MOVHLPS</kbd>.
+Segment registers and the instruction pointer do not count.
+For example, in <kbd>SETZ AL</kbd> you count the flags
+register but not <kbd>AL</kbd>. <kbd>ADD EBX,ECX</kbd> counts both <kbd>EBX</kbd> and <kbd>ECX</kbd>, but not the flags because
+they are written to only. <kbd>PUSH EAX</kbd> reads <kbd>EAX</kbd> and the
+stack pointer and then writes to the stack pointer.
+<p>
+The <kbd>FXCH</kbd> instruction is a special case. It works by renaming, but doesn't read any values
+so that it doesn't count in the rules for register read stalls. An <kbd>FXCH</kbd> instruction behaves
+like 1 uop that neither reads nor writes any registers with regard to the rules for register read
+stalls.
+<p>
+Don't confuse uop triplets with decode groups. A decode group can generate from 1 to 6
+uops, and even if the decode group has three instructions and generates three uops there
+is no guarantee that the three uops will go into the RAT together.
+<p>
+The queue between the decoders and the RAT is so short (10 uops) that you cannot
+assume that register read stalls do not stall the decoders or that fluctuations
+in decoder throughput do not stall the RAT.
+<p>
+It is very difficult to predict which uops go through the RAT together unless the queue is
+empty, and for optimized code the queue should be empty only after mispredicted branches.
+Several uops generated by the same instruction do not necessarily go through the RAT
+together; the uops are simply taken consecutively from the queue, three at at time. The
+sequence is not broken by a predicted jump: uops before and after the jump can go through
+the RAT together. Only a mispredicted jump will discard the queue and start over again so
+that the next three uops are sure to go into the RAT together.
+<p>
+If three consecutive uops read more than two different registers then you would of course
+prefer that they do not go through the RAT together. The probability that they do is one
+third. The penalty of reading three or four written-back registers in one triplet of uops is one
+clock cycle. You can think of the one clock delay as equivalent to the load of three more
+uops through the RAT. With the probability of 1/3 of the three uops going into the RAT
+together, the average penalty will be the equivalent of 3/3 = 1 uop. To calculate the average
+time it will take for a piece of code to go through the RAT, add the number of potential
+register read stalls to the number of uops and divide by three. You can see that It doesn't
+pay to remove the stall by putting in an extra instruction unless you know for sure which
+uops go into the RAT together or you can prevent more than one potential register read stall
+by one extra instruction.
+<p>
+In situations where you aim at a throughput of 3 uops per clock, the limit of two permanent
+register reads per clock cycle may be a problematic bottleneck to handle. Possible ways to
+remove register read stalls are:
+<ul><li>keep uops that read the same register close together so that they are likely to go into the
+same triplet.
+<li>keep uops that read different registers spaced so that they cannot go into the same
+triplet.
+<li>place uops that read a register no more than 3 - 4 triplets after an instruction that writes
+to or modifies this register to make sure it hasn't been written back before it is read (it
+doesn't matter if you have a jump between as long as it is predicted). If you have reason
+to expect the register write to be delayed for whatever reason then you can safely read
+the register somewhat further down the instruction stream.
+<li>use absolute addresses instead of pointers in order to reduce the number of register
+reads.
+<li>you may rename a register in a triplet where it doesn't cause a stall in order to prevent a
+read stall for this register in one or more later triplets. Example:
+<kbd>MOV ESP,ESP / ... / MOV EAX,[ESP+8]</kbd>.
+This method costs an extra uop and therefore doesn't pay unless the expected average
+number of read stalls prevented is more than 1/3.
+</ul>
+<p>
+For instructions that generate more than one uop you may want to know the order of the
+uops generated by the instruction in order to make a precise analysis of the possibility of
+register read stalls. I have therefore listed the most common cases below.
+<p>
+<u>Writes to memory</u><br>
+A memory write generates two uops. The first one (to port 4) is a store operation, reading
+the register to store. The second uop (port 3) calculates the memory address, reading any
+pointer registers. Examples:<br>
+<kbd>MOV [EDI], EAX</kbd><br>
+First uop reads <kbd>EAX</kbd>, second uop reads <kbd>EDI</kbd>.<br>
+<kbd>FSTP QWORD PTR [EBX+8*ECX]</kbd><br>
+First uop reads <kbd>ST(0)</kbd>, second uop reads <kbd>EBX</kbd> and <kbd>ECX.</kbd>
+<p>
+<u>Read and modify</u><br>
+An instruction that reads a memory operand and modifies a register by some arithmetic or
+logical operation generates two uops. The first one (port 2) is a memory load instruction
+reading any pointer registers, the second uop is an arithmetic instruction (port 0 or 1)
+reading and writing to the destination register and possibly writing to the flags.
+Example:<br>
+<kbd>ADD EAX, [ESI+20]</kbd><br>
+First uop reads <kbd>ESI,</kbd> second uop reads <kbd>EAX</kbd> and writes <kbd>EAX</kbd> and flags.
+<p>
+<u>Read/modify/write</u><br>
+A read/modify/write instruction generates four uops. The first uop (port 2) reads any pointer
+registers, the second uop (port 0 or 1) reads and writes to any source register and possibly
+writes to the flags, the third uop (port 4) reads only the temporary result which doesn't count
+here, the fourth uop (port 3) reads any pointer registers again. Since the first and the fourth
+uop cannot go into the RAT together you cannot take advantage of the fact that they read
+the same pointer registers. Example:<br>
+<kbd>OR [ESI+EDI], EAX</kbd><br>
+The first uop reads <kbd>ESI</kbd> and <kbd>EDI</kbd>, the second uop reads <kbd>EAX</kbd> and writes <kbd>EAX</kbd> and the
+flags, the third uop reads only the temporary result, the fourth uop reads <kbd>ESI</kbd> and <kbd>EDI</kbd> again. No
+matter how these uops go into the RAT you can be sure that the uop that reads <kbd>EAX</kbd> goes
+together with one of the uops that read <kbd>ESI</kbd> and <kbd>EDI</kbd>. A register read stall is therefore
+inevitable for this instruction unless one of the registers has been modified recently.
+<p>
+<u>Push register</u><br>
+A push register instruction generates 3 uops. The first one (port 4) is a store instruction,
+reading the register. The second uop (port 3) generates the address, reading the stack
+pointer. The third uop (port 0 or 1) subtracts the word size from the stack pointer, reading
+and modifying the stack pointer.
+<p>
+<u>Pop register</u><br>
+A pop register instruction generates 2 uops. The first uop (port 2) loads the value, reading
+the stack pointer and writing to the register. The second uop (port 0 or 1) adjusts the stack
+pointer, reading and modifying the stack pointer.
+<p>
+<u>Call</u><br>
+A near call generates 4 uops (port 1, 4, 3, 01). The first two uops read only the instruction
+pointer which doesn't count because it cannot be renamed. The third uop reads the stack
+pointer. The last uop reads and modifies the stack pointer.
+<p>
+<u>Return</u><br>
+A near return generates 4 uops (port 2, 01, 01, 1). The first uop reads the stack pointer.
+The third uop reads and modifies the stack pointer.
+<p>
+An example of how to avoid a register read stall is given in example 2.6.
+<p>
+<h2><a name="17">17</a>. Out of order execution (PPro, PII and PIII)</h2><p>
+The reorder buffer (ROB) can hold 40 uops. Each uop waits in the ROB until all its
+operands are ready and there is a vacant execution unit for it. This makes out-of-order
+execution possible. If one part of the code is delayed because of a cache miss then it won't
+delay later parts of the code if they are independent of the delayed operations.
+<p>
+Writes to memory cannot execute out of order relative to other writes. There are four write
+buffers, so if you expect many cache misses on writes or you are writing to uncached
+memory then it is recommended that you schedule four writes at at time and make sure the
+processor has something else to do before you give it the next four writes. Memory reads
+and other instructions can execute out of order, except <kbd>IN, OUT</kbd> and serializing
+instructions.
+<p>
+If your code writes to a memory address and soon after reads from the same address, then
+the read may by mistake be executed before the write because the ROB doesn't know the
+memory addresses at the time of reordering. This error is detected when the write address
+is calculated, and then the read operation (which was executed speculatively)
+has to be re-done. The penalty for this is approximately 3 clocks. The only way to avoid this penalty is to
+make sure the execution unit has other things to do between a write and a subsequent read
+from the same memory address.
+<p>
+There are several execution units clustered around five ports. Port 0 and 1 are for
+arithmetic operations etc. Simple move, arithmetic and logic operations can go to either port 0 or 1,
+whichever is vacant first. Port 0 also handles multiplication, division, integer shifts and
+rotates, and floating point operations. Port 1 also handles jumps and some MMX
+and XMM operations. Port 2 handles all reads from memory and a few string and XMM operations, port 3 calculates addresses for memory
+write, and port 4 executes all memory write operations. In chapter <a href="#29">29</a> you'll find a complete
+list of the uops generated by code instructions with an indication of which ports they go to.
+Note that all memory write operations require two uops, one for port 3 and one for port 4,
+while memory read operations use only one uop (port 2).
+<p>
+In most cases each port can receive one new uop per clock cycle. This means that you can
+execute up to 5 uops in the same clock cycle if they go to five different ports, but since
+there is a limit of 3 uops per clock earlier in the pipeline you will never execute more than 3
+uops per clock on average.
+<p>
+You must make sure that no execution port receives more than one third of the uops if you
+want to maintain a throughput of 3 uops per clock. Use the table of uops in chapter
+<a href="#29">29</a> and
+count how many uops go to each port. If port 0 and 1 are saturated while port 2 is free then
+you can improve your code by replacing some <kbd>MOV register,register</kbd>
+or <kbd>MOV register,immediate</kbd> instructions with
+ <kbd>MOV register,memory</kbd> in order to move some
+of the load from port 0 and 1 to port 2.
+<p>
+Most uops take only one clock cycle to execute, but multiplications, divisions, and many
+floating point operations take more:
+<p>
+Floating point addition and subtraction takes 3 clocks, but the execution unit is fully
+pipelined so that it can receive a new <kbd>FADD</kbd> or <kbd>FSUB</kbd>
+in every clock cycle before the
+preceding ones are finished (provided, of course, that they are independent).
+<p>
+Integer multiplication takes 4 clocks, floating point multiplication 5, and
+MMX multiplication 3 clocks. Integer and MMX multiplication is pipelined so
+that it can receive a new instruction every clock cycle. Floating point
+multiplication is partially pipelined: The execution unit can receive a new
+<kbd>FMUL</kbd> instruction two clocks after the preceding one, so that the
+maximum throughput is one <kbd>FMUL</kbd> per two clock cycles. The holes
+between the <kbd>FMUL</kbd>'s cannot be filled by integer multiplications
+because they use the same circuitry. XMM additions and multiplications take
+3 and 4 clocks respectively, and are fully pipelined. But since each logical XMM
+register is implemented as two physical 64-bit registers, you need two uops for a
+packed XMM operation, and the throughput will then be one arithmetic XMM
+instruction every two clock cycles. XMM add and multiply instructions can execute
+in parallel because they don't use the same execution port.
+<p>
+Integer and floating point division takes up to 39 clocks and is not pipelined. This means
+that the execution unit cannot begin a new division until the previous division is finished.
+The same applies to squareroot and transcendental functions.
+<p>
+Also jump instructions, calls, and returns are not fully pipelined. You cannot execute a new
+jump in the first clock cycle after a preceding jump. So the maximum throughput for jumps,
+calls, and returns is one for every two clocks.
+<p>
+You should, of course, avoid instructions that generate many uops.
+The <kbd>LOOP XX</kbd>
+instruction, for example, should be replaced by <kbd>DEC ECX / JNZ XX</kbd>.
+<p>
+If you have consecutive <kbd>POP</kbd> instructions then you may break them up to reduce the
+number of uops:
+<pre>POP ECX / POP EBX / POP EAX ; can be changed to:
+MOV ECX,[ESP] / MOV EBX,[ESP+4] / MOV EAX,[ESP] / ADD ESP,12</pre>
+The former code generates 6 uops, the latter generates only 4 and decodes faster.
+Doing the same with <kbd>PUSH</kbd> instructions is less advantageous because the split-up code is likely to
+generate register read stalls unless you have other instructions to put in between or the
+registers have been renamed recently. Doing it with <kbd>CALL</kbd> and <kbd>RET</kbd>
+instructions will
+interfere with prediction in the return stack buffer. Note also that the
+<kbd>ADD ESP</kbd> instruction can cause an AGI stall in earlier processors.
+<p>
+<h2><a name="18">18</a>. Retirement (PPro, PII and PIII)</h2><p>
+Retirement is a process where the temporary registers used by the uops are copied into the
+permanent registers <kbd>EAX, EBX</kbd>, etc.
+When a uop has been executed it is marked in the ROB as ready to retire.
+<p>
+The retirement station can handle three uops per clock cycle. This may not seem like a
+problem because the throughput is already limited to 3 uops per clock in the RAT. But
+retirement may still be a bottleneck for two reasons. Firstly, instructions must retire in order.
+If a uop is executed out of order then it cannot retire before all preceding uops in the order
+have retired. And the second limitation is that taken jumps must retire in the first of the three
+slots in the retirement station. Just like decoder D1 and D2 can be idle if the next instruction
+only fits into D0, the last two slots in the retirement station can be idle if the next uop to
+retire is a taken jump. This is significant if you have a small loop where the number of uops
+in the loop is not divisible by three.
+<p>
+All uops stay in the reorder buffer (ROB) until they retire. The ROB can hold 40 uops. This
+sets a limit to the number of instructions that can execute during the long delay of a division
+or other slow operation. Before the division is finished the ROB will be filled up with
+executed uops waiting to retire. Only when the division is finished and retired can the
+subsequent uops begin to retire, because retirement takes place in order.
+<p>
+In case of speculative execution of predicted branches (see chapter <a href="#22">22</a>) the speculatively
+executed uops cannot retire until it is certain that the prediction was correct. If the prediction
+turns out to be wrong then the speculatively executed uops are discarded without
+retirement.
+<p>
+The following instructions cannot execute speculatively: memory writes,
+<kbd>IN, OUT</kbd>, and serializing instructions.
+<p>
+<h2><a name="19">19</a>. Partial stalls (PPro, PII and PIII)</h2>
+<h3><a name="19_1">19.1 Partial register stalls</a></h3><p>
+Partial register stall is a problem that occurs when you write to part of a 32
+bit register and later read from the whole register or a bigger part of it.
+Example:
+<pre> MOV AL, BYTE PTR [M8]
+ MOV EBX, EAX ; partial register stall</pre><p>
+This gives a delay of 5-6 clocks. The reason is that a temporary register has been assigned
+to <kbd>AL</kbd> (to make it independent of <kbd>AH</kbd>).
+The execution unit has to wait until the write to <kbd>AL</kbd> has
+retired before it is possible to combine the value from <kbd>AL</kbd> with the
+value of the rest of <kbd>EAX</kbd>.
+The stall can be avoided by changing to code to:
+<pre> MOVZX EBX, BYTE PTR [MEM8]
+ AND EAX, 0FFFFFF00h
+ OR EBX, EAX</pre>
+<p>
+Of course you can also avoid the partial stalls by putting in other instructions after the write
+to the partial register so that it has time to retire before you read from the full register.
+<p>
+You should be aware of partial stalls whenever you mix different data sizes (8, 16, and 32
+bits):
+<pre> MOV BH, 0
+ ADD BX, AX ; stall
+ INC EBX ; stall</pre><p>
+
+You don't get a stall when reading a partial register after writing to the full register, or a
+bigger part of it:
+<pre> MOV EAX, [MEM32]
+ ADD BL, AL ; no stall
+ ADD BH, AH ; no stall
+ MOV CX, AX ; no stall
+ MOV DX, BX ; stall</pre><p>
+
+The easiest way to avoid partial register stalls is to always use full registers
+and use <kbd>MOVZX</kbd> or <kbd>MOVSX</kbd> when reading from smaller memory
+operands. These instructions are fast on the
+PPro, PII and PIII, but slow on earlier processors. Therefore, a compromise is
+offered when you
+want your code to perform reasonably well on all processors. The replacement
+for <kbd>MOVZX EAX,BYTE PTR [M8]</kbd> looks like this:
+<pre> XOR EAX, EAX
+ MOV AL, BYTE PTR [M8]</pre><p>
+
+The PPro, PII and PIII processors make a special case out of this combination
+to avoid a partial
+register stall when later reading from <kbd>EAX</kbd>.
+The trick is that a register is tagged as empty
+when it is <kbd>XOR</kbd>'ed with itself. The processor remembers that the upper 24 bits of
+<kbd>EAX</kbd> are zero, so that a partial stall can be avoided. This mechanism
+works only on certain combinations:
+<pre> XOR EAX, EAX
+ MOV AL, 3
+ MOV EBX, EAX ; no stall
+
+ XOR AH, AH
+ MOV AL, 3
+ MOV BX, AX ; no stall
+
+ XOR EAX, EAX
+ MOV AH, 3
+ MOV EBX, EAX ; stall
+
+ SUB EBX, EBX
+ MOV BL, DL
+ MOV ECX, EBX ; no stall
+
+ MOV EBX, 0
+ MOV BL, DL
+ MOV ECX, EBX ; stall
+
+ MOV BL, DL
+ XOR EBX, EBX ; no stall</pre><p>
+
+Setting a register to zero by subtracting it from itself works the same as the
+<kbd>XOR</kbd>, but setting it to zero with the <kbd>MOV</kbd> instruction
+doesn't prevent the stall.
+<p>
+You can set the <kbd>XOR</kbd> outside a loop:
+<pre> XOR EAX, EAX
+ MOV ECX, 100
+LL: MOV AL, [ESI]
+ MOV [EDI], EAX ; no stall
+ INC ESI
+ ADD EDI, 4
+ DEC ECX
+ JNZ LL</pre><p>
+The processor remembers that the upper 24 bits of <kbd>EAX</kbd> are zero as
+long as you don't get
+an interrupt, misprediction, or other serializing event.
+<p>
+You should remember to neutralize any partial register you have used before calling a
+subroutine that might push the full register:
+<pre> ADD BL, AL
+ MOV [MEM8], BL
+ XOR EBX, EBX ; neutralize BL
+ CALL _HighLevelFunction</pre><p>
+Most high level language procedures push <kbd>EBX</kbd> at the start of the
+procedure which would generate a partial register stall in the example above
+if you hadn't neutralized <kbd>BL</kbd>.
+<p>
+Setting a register to zero with the <kbd>XOR</kbd> method doesn't break its dependency on earlier
+instructions:
+<pre> DIV EBX
+ MOV [MEM], EAX
+ MOV EAX, 0 ; break dependency
+ XOR EAX, EAX ; prevent partial register stall
+ MOV AL, CL
+ ADD EBX, EAX</pre><p>
+Setting <kbd>EAX</kbd> to zero twice here seems redundant, but without
+the <kbd>MOV EAX,0</kbd> the last
+instructions would have to wait for the slow <kbd>DIV</kbd> to finish, and
+without <kbd>XOR EAX,EAX</kbd> you
+would have a partial register stall.
+<p>
+The <kbd>FNSTSW AX</kbd> instruction is special: in 32 bit mode it behaves as
+if writing to the entire <kbd>EAX</kbd>. In fact, it does something like this
+in 32 bit mode:<br>
+<kbd> AND EAX,0FFFF0000h / FNSTSW TEMP / OR EAX,TEMP</kbd><br>
+hence, you don't get a partial register stall when reading <kbd>EAX</kbd>
+after this instruction in 32 bit mode:
+<pre> FNSTSW AX / MOV EBX,EAX ; stall only if 16 bit mode
+ MOV AX,0 / FNSTSW AX ; stall only if 32 bit mode</pre>
+
+<p>
+<h3><a name="19_2">19.2 Partial flags stalls</a></h3><p>
+The flags register can also cause partial register stalls:
+<pre> CMP EAX, EBX
+ INC ECX
+ JBE XX ; partial flags stall</pre><p>
+The <kbd>JBE</kbd> instruction reads both the carry flag and the zero flag.
+Since the <kbd>INC</kbd> instruction
+changes the zero flag, but not the carry flag, the <kbd>JBE</kbd> instruction has to wait for the two
+preceding instructions to retire before it can combine the carry flag from the <kbd>CMP</kbd> instruction
+and the zero flag from the <kbd>INC</kbd> instruction. This situation is likely to be a bug rather than an
+intended combination of flags. To correct it change <kbd>INC ECX</kbd> to <kbd>ADD ECX,1</kbd>.
+ A similar
+bug that causes a partial flags stall is <kbd>SAHF / JL XX</kbd>. The <kbd>JL</kbd>
+instruction tests the sign
+flag and the overflow flag, but <kbd>SAHF</kbd> doesn't change the overflow flag.
+To correct it, change
+<kbd>JL XX</kbd> to <kbd>JS XX</kbd>.
+<p>
+Unexpectedly (and contrary to what Intel manuals say) you also get a partial flags stall after
+an instruction that modifies some of the flag bits when reading only unmodified flag bits:
+<pre> CMP EAX, EBX
+ INC ECX
+ JC XX ; partial flags stall</pre><p>
+but not when reading only modified bits:
+<pre> CMP EAX, EBX
+ INC ECX
+ JE XX ; no stall</pre><p>
+
+Partial flags stalls are likely to occur on instructions that read many or
+all flags bits, i.e. <kbd>LAHF, PUSHF, PUSHFD</kbd>. The following instructions cause
+partial flags stalls when followed by <kbd>LAHF</kbd> or <kbd>PUSHF(D)</kbd>:
+<kbd>INC, DEC, TEST</kbd>, bit tests, bit scan, <kbd>CLC, STC, CMC, CLD, STD, CLI, STI, MUL,
+IMUL</kbd>, and all shifts and rotates.
+The following instructions do not cause partial flags stalls:
+<kbd>AND, OR, XOR, ADD, ADC, SUB, SBB, CMP, NEG</kbd>.
+It is strange that <kbd>TEST</kbd> and <kbd>AND</kbd> behave differently while, by definition, they
+do exactly the same thing to the flags. You may use a <kbd>SETcc</kbd>
+ instruction instead of <kbd>LAHF</kbd>
+or <kbd>PUSHF(D)</kbd> for storing the value of a flag in order to avoid a stall.
+<p>
+Examples:
+<pre> INC EAX / PUSHFD ; stall
+ ADD EAX,1 / PUSHFD ; no stall
+
+ SHR EAX,1 / PUSHFD ; stall
+ SHR EAX,1 / OR EAX,EAX / PUSHFD ; no stall
+
+ TEST EBX,EBX / LAHF ; stall
+ AND EBX,EBX / LAHF ; no stall
+ TEST EBX,EBX / SETZ AL ; no stall
+
+ CLC / SETZ AL ; stall
+ CLD / SETZ AL ; no stall</pre><p>
+The penalty for partial flags stalls is approximately 4 clocks.
+<p>
+
+<h3><a name="19_3">19.3 Flags stalls after shifts and rotates</a></h3><p>
+You can get a stall resembling the partial flags stall when reading any flag
+bit after a shift or rotate, except for shifts and rotates by one (short form):
+<pre> SHR EAX,1 / JZ XX ; no stall
+ SHR EAX,2 / JZ XX ; stall
+ SHR EAX,2 / OR EAX,EAX / JZ XX ; no stall
+
+ SHR EAX,5 / JC XX ; stall
+ SHR EAX,4 / SHR EAX,1 / JC XX ; no stall
+
+ SHR EAX,CL / JZ XX ; stall, even if CL = 1
+ SHRD EAX,EBX,1 / JZ XX ; stall
+ ROL EBX,8 / JC XX ; stall</pre><p>
+
+The penalty for these stalls is approximately 4 clocks.
+<p>
+
+<h3><a name="19_4">19.4 Partial memory stalls</a></h3><p>
+A partial memory stall is somewhat analogous to a partial register stall. It occurs when you
+mix data sizes for the same memory address:
+<pre> MOV BYTE PTR [ESI], AL
+ MOV EBX, DWORD PTR [ESI] ; partial memory stall</pre><p>
+Here you get a stall because the processor has to combine the byte written from AL with the
+next three bytes, which were in memory before, to get the four bytes needed for
+reading into <kbd>EBX</kbd>. The penalty is approximately 7-8 clocks.
+<p>
+Unlike the partial register stalls, you also get a partial memory stall when you write a bigger
+operand to memory and then read part of it, if the smaller part doesn't start at the same
+address:
+<pre> MOV DWORD PTR [ESI], EAX
+ MOV BL, BYTE PTR [ESI] ; no stall
+ MOV BH, BYTE PTR [ESI+1] ; stall</pre><p>
+You can avoid this stall by changing the last line to <kbd>MOV BH,AH</kbd>,
+but such a solution is not
+possible in a situation like this:
+<pre> FISTP QWORD PTR [EDI]
+ MOV EAX, DWORD PTR [EDI]
+ MOV EDX, DWORD PTR [EDI+4] ; stall</pre><p>
+
+Interestingly, you can also get a partial memory stall when writing and reading completely
+different addresses if they happen to have the same set-value in different cache banks:
+<pre> MOV BYTE PTR [ESI], AL
+ MOV EBX, DWORD PTR [ESI+4092] ; no stall
+ MOV ECX, DWORD PTR [ESI+4096] ; stall</pre>
+<p>
+<h2><a name="20">20</a>. Dependency chains (PPro, PII and PIII)</h2><p>
+A series of instructions where each instruction depends on the result of the preceding one
+is called a dependency chain. Long dependency chains should be avoided, if possible,
+because they prevent out-of-order and parallel execution.
+<p>
+Example:
+<pre> MOV EAX, [MEM1]
+ ADD EAX, [MEM2]
+ ADD EAX, [MEM3]
+ ADD EAX, [MEM4]
+ MOV [MEM5], EAX</pre><p>
+In this eaxmple, the <kbd>ADD</kbd> instructions generate 2 uops each, one for reading from memory
+(port 2), and one for adding (port 0 or 1). The read uops can execute out or order, while the
+add uops must wait for the previous uops to finish. This dependency chain does not take
+very long to execute, because each addition adds only 1 clock to the execution time. But if
+you have slow instructions like multiplications, or even worse: divisions, then you should
+definitely do something to break the dependency chain. The way to do this is to use multiple
+accumulators:
+<pre> MOV EAX, [MEM1] ; start first chain
+ MOV EBX, [MEM2] ; start other chain in different accumulator
+ IMUL EAX, [MEM3]
+ IMUL EBX, [MEM4]
+ IMUL EAX, EBX ; join chains in the end
+ MOV [MEM5], EAX</pre><p>
+Here, the second <kbd>IMUL</kbd> instruction can start before the first one is finished.
+Since the <kbd>IMUL</kbd> instruction has a delay of 4 clocks and is fully pipelined, you
+may have up to 4 accumulators.
+<p>
+Division is not pipelined so you cannot do the same with chained divisions,
+but you can of course multiply all the divisors and do only one division in
+the end.
+<p>
+Floating point instructions have a longer delay than integer instructions, so
+you should definitely break up long dependency chains with floating point
+instructions:
+<pre> FLD [MEM1] ; start first chain
+ FLD [MEM2] ; start second chain in different accumulator
+ FADD [MEM3]
+ FXCH
+ FADD [MEM4]
+ FXCH
+ FADD [MEM5]
+ FADD ; join chains in the end
+ FSTP [MEM6]</pre><p>
+You need a lot of <kbd>FXCH</kbd> instructions for this, but don't worry: they
+are cheap. <kbd>FXCH</kbd>
+instructions are resolved in the RAT by register renaming so they don't
+put any load on the execution ports. An <kbd>FXCH</kbd> does count as 1 uop in the RAT,
+ROB, and retirement station, though.
+<p>
+If the dependency chain is long you may need three accumulators:
+<pre> FLD [MEM1] ; start first chain
+ FLD [MEM2] ; start second chain
+ FLD [MEM3] ; start third chain
+ FADD [MEM4] ; third chain
+ FXCH ST(1)
+ FADD [MEM5] ; second chain
+ FXCH ST(2)
+ FADD [MEM6] ; first chain
+ FXCH ST(1)
+ FADD [MEM7] ; third chain
+ FXCH ST(2)
+ FADD [MEM8] ; second chain
+ FXCH ST(1)
+ FADD ; join first and third chain
+ FADD ; join with second chain
+ FSTP [MEM9]</pre><p>
+
+Avoid storing intermediate data in memory and read them immediately afterwards:
+<pre> MOV [TEMP], EAX
+ MOV EBX, [TEMP]</pre><p>
+There is a penalty for attempting to read from a memory address before a previous write to
+that address is finished. In the example above, change the last instruction to
+<kbd>MOV EBX,EAX</kbd>
+or put some other instructions in between.
+<p>
+There is one situation where you cannot avoid storing intermediate data in memory, and
+that is when transferring data from an integer register to a floating point register, or vice
+versa. For example:
+<pre> MOV EAX, [MEM1]
+ ADD EAX, [MEM2]
+ MOV [TEMP], EAX
+ FILD [TEMP]</pre><p>
+If you don't have anything to put in between the write to <kbd>TEMP</kbd> and the
+read from <kbd>TEMP</kbd>, then
+you may consider using a floating point register instead of <kbd>EAX</kbd>:
+<pre> FILD [MEM1]
+ FIADD [MEM2]</pre><p>
+
+Consecutive jumps, calls, or returns may also be considered dependency chains. The
+throughput for these instructions is one jump per two clock cycles. It is therefore
+recommended that you give the microprocessor something else to do between the jumps.
+<p>
+<h2><a name="21">21</a>. Searching for bottlenecks (PPro, PII and PIII)</h2><p>
+When optimizing code for these processors, it is important to analyze where the
+bottlenecks are. Spending time on optimizing away one bottleneck doesn't make sense if
+there is another bottleneck which is narrower.
+<p>
+If you expect code cache misses then you should restructure your code to keep the most
+used parts of code together.
+<p>
+If you expect many data cache misses then forget about everything else and concentrate
+on how to restructure your data to reduce the number of cache misses (chapter <a href="#7">7</a>), and
+avoid long dependency chains after a data read cache miss (chapter <a href="#20">20</a>).
+<p>
+If you have many divisions then try to reduce them (chapter <a href="#27_2">27.2</a>) and make sure the
+processor has something else to do during the divisions.
+<p>
+Dependency chains tend to hamper out-of-order execution (chapter <a href="#20">20</a>). Try to break long
+dependency chains, especially if they contain slow instructions such as multiplication,
+division, and floating point instructions.
+<p>
+If you have many jumps, calls, or returns, and especially if the jumps are poorly predictable,
+then try if some of them can be avoided. Replace conditional jumps with conditional moves
+if possible, and replace small procedures with macros (chapter <a href="#22_3">22.3</a>).
+<p>
+If you are mixing different data sizes (8, 16, and 32 bit integers) then look out for partial
+stalls. If you use <kbd>PUSHF</kbd> or <kbd>LAHF</kbd> instructions then look out for partial flags stalls. Avoid
+testing flags after shifts or rotates by more than 1 (chapter <a href="#19">19</a>).
+<p>
+If you aim at a throughput of 3 uops per clock cycle then be aware of possible delays in
+instruction fetch and decoding (chapter and <a href="#14">14</a> and <a href="#15">15</a>), especially in small loops.
+<p>
+The limit of two permanent register reads per clock cycle may reduce your throughput to
+less than 3 uops per clock cycle (chapter <a href="#16_2">16.2</a>). This is likely to happen if you often read
+registers more than 4 clock cycles after they last were modified. This may, for example,
+happen if you often use pointers for addressing your data but seldom modify the pointers.
+<p>
+A throughput of 3 uops per clock requires that no execution port gets more than one third of
+the uops (chapter <a href="#17">17</a>).
+<p>
+The retirement station can handle 3 uops per clock, but may be slightly less effective for
+taken jumps (chapter <a href="#18">18</a>).
+
+<p>
+<h2><a name="22">22</a>. Jumps and branches (all processors)</h2><p>
+The Pentium family of processors attempt to predict where a jump will go to, and whether a
+conditional jump will be taken or fall through. If the prediction is correct, then it can save a
+considerable amount of time by loading the subsequent instructions into the pipeline and
+start decoding them before the jump is executed. If the prediction turns out to be wrong,
+then the pipeline has to be flushed, which will cost a penalty depending on the length of the
+pipeline.
+<p>
+The predictions are based on a Branch Target Buffer (BTB) which stores the history for
+each branch or jump instruction and makes predictions based on the prior history of
+executions of each instruction. The BTB is organized like a set-associative cache where
+new entries are allocated according to a pseudo-random replacement method.
+<p>
+When optimizing code, it is important to minimize the number of misprediction penalties.
+This requires a good understanding of how the jump prediction works.
+<p>
+The branch prediction mechanisms are not described adequately in Intel manuals or
+anywhere else. I am therefore giving a very detailed description here. This information is
+based on my own research (with the help of Karki Jitendra Bahadur for the PPlain).
+<p>
+In the following, I will use the term 'control transfer instruction' for any instruction which can
+change the instruction pointer, including conditional and unconditional, direct and indirect,
+near and far, jumps, calls, and returns. All these instructions use prediction.
+<p>
+
+<h3><a name="22_1">22.1 Branch prediction in PPlain</a></h3><p>
+The branch prediction mechanism for the PPlain is very different from the other three
+processors. Information found in Intel documents and elsewhere on this subject is directly
+misleading, and following the advises given is such documents is likely to lead to
+sub-optimal code.
+<p>
+The PPlain has a branch target buffer (BTB), which can hold information for up to 256 jump
+instructions. The BTB is organized like a 4-way set-associative cache with 64 entries per
+way. This means that the BTB can hold no more than 4 entries with the same set value.
+Unlike the data cache, the BTB uses a pseudo random replacement algorithm, which
+means that a new entry will not necessarily displace the least recently used entry of the
+same set-value. How the set-value is calculated will be explained later. Each BTB entry
+stores the address of the jump target and a prediction state, which can have four different
+values:
+<p>
+state 0: "strongly not taken" <br>
+state 1: "weakly not taken" <br>
+state 2: "weakly taken" <br>
+state 3: "strongly taken"<p>
+
+A branch instruction is predicted to jump when in state 2 or 3, and to fall through when in
+state 0 or 1. The state transition works like a two-bit counter, so that the state is
+incremented when the branch is taken, and decremented when it falls through. The counter
+saturates, rather than wrap around, so that it does not decrement beyond 0 or increment
+beyond 3. Ideally, this would provide a reasonably good prediction, because a branch
+instruction would have to deviate twice from what it does most of the time, before the
+prediction changes.
+<p>
+However, this mechanism has been compromised by the fact that state 0 also means
+'unused BTB entry'. So a BTB entry in state 0 is the same as no BTB entry. This makes
+sense, because a branch instruction is predicted to fall through if it has no BTB entry. This
+improves the utilization of the BTB, because a branch instruction which is seldom taken will
+most of the time not take up any BTB entry.
+<p>
+Now, if a jumping instruction has no BTB entry, then a new BTB entry will be generated,
+and this new entry will always be set to state 3. This means that it is impossible to go from
+state 0 to state 1 (except for a very special case discussed later). From state 0 you can only
+go to state 3, if the branch is taken. If the branch falls through, then it will stay out of the
+BTB.
+<p>
+This is a serious design flaw. By throwing state 0 entries out of the BTB and always setting
+new entries to state 3, the designers apparently have given priority to minimizing the first
+time penalty for unconditional jumps and branches often taken, and ignored that this
+seriously compromises the basic idea behind the mechanism and reduces the performance
+in small innermost loops. The consequence of this flaw is, that a branch instruction which
+falls through most of the time will have up to three times as many mispredictions as a
+branch instruction which is taken most of the time. (Apparently, Intel engineers
+have been unaware of this flaw until I published my findings).
+<p>
+You may take this asymmetry into account by organizing your branches so that they are
+taken more often than not. Consider for example this if-then-else construction:
+<pre> TEST EAX,EAX
+ JZ A
+ <branch 1>
+ JMP E
+A: <branch 2>
+E:</pre>
+<p>
+If branch 1 is executed more often than branch 2, and branch 2 is seldom executed twice in
+succession, then you can reduce the number of branch mispredictions by up to a factor 3
+by swapping the two branches so that the branch instruction will jump more often than fall
+through:
+<pre> TEST EAX,EAX
+ JNZ A
+ <branch 2>
+ JMP E
+A: <branch 1>
+E:</pre><p>
+
+(This is contrary to the recommendations in Intel's manuals and tutorials).
+<p>
+There may be reasons to put the most often executed branch first, however:
+<ol>
+<li>Putting seldom executed branches away in the bottom of your code can improve code
+cache utilization.
+<li>A branch instruction seldom taken will stay out of the BTB most of the time, possibly
+improving BTB utilization.
+<li>The branch instruction will be predicted as not taken if it has been flushed out of the
+BTB by other branch instructions.
+<li>The asymmetry in branch prediction only exists on the PPlain.
+</ol>
+<p>
+These considerations have little weight, however, for small critical loops, so I would still
+recommend organizing branches with a skewed distribution so that the branch instruction is
+taken more often than not, unless branch 2 is executed so seldom, that misprediction
+doesn't matter.
+<p>
+Likewise, you should preferably organize loops with the testing branch instruction at the
+bottom, as in this example:
+<pre> MOV ECX, [N]
+L: MOV [EDI],EAX
+ ADD EDI,4
+ DEC ECX
+ JNZ L</pre><p>
+If N is high, then the JNZ instruction here will be taken more often than not, and never fall
+through twice in succession.
+<p>
+Consider the situation where a branch is taken every second time. The first time it jumps
+the BTB entry will go into state 3, and will then alternate between state 2 and 3. It is
+predicted to jump all the time, which gives 50% mispredictions. <a name="worstpred">Assume now that it deviates
+from this regular pattern and falls through an extra time</a>. The jump pattern is:<pre>
+01010100101010101010101, where 0 means nojump, and 1 means jump.
+ ^</pre>
+The extra nojump is indicated with a <kbd>^</kbd> above. After this incident, the BTB entry will alternate
+between state 1 and 2, which gives 100% mispredictions. It will continue in this unfortunate
+mode until there is another deviation from the 0101 pattern. This is the worst case for this
+branch prediction mechanism.
+<p>
+<h4>22.1.2 BTB is looking ahead (PPlain)</h4>
+The BTB mechanism is counting instruction pairs, rather than single instructions, so you
+have to know how instructions are pairing in order to analyze where a BTB entry is stored.
+The BTB entry for any control instruction is attached to the address of the U-pipe
+instruction in the preceding instruction pair. (An unpaired instruction counts as one pair).
+Example:
+<pre> SHR EAX,1
+ MOV EBX,[ESI]
+ CMP EAX,EBX
+ JB L</pre><p>
+Here <kbd>SHR</kbd> pairs with <kbd>MOV</kbd>, and <kbd>CMP</kbd> pairs with
+<kbd>JB</kbd>. The BTB entry for <kbd>JB L</kbd> is thus
+attached to the address of the <kbd>SHR EAX,1</kbd> instruction. When this BTB entry is met, and if it
+is in state 2 or 3, then the Pentium will read the target address from the BTB entry, and load
+the instructions following L into the pipeline. This happens before the branch instruction has
+been decoded, so the Pentium relies solely on the information in the BTB when doing this.
+<p>
+You may remember, that instructions are seldom pairing the first time they are executed
+(see chapter <a href="#8">8</a>). If the instructions above are not pairing, then the BTB entry should be
+attached to the address of the <kbd>CMP</kbd> instruction, and this entry would be wrong on the next
+execution, when instructions are pairing. However, in most cases the PPlain is smart
+enough to not make a BTB entry when there is an unused pairing opportunity, so you don't
+get a BTB entry until the second execution, and hence you won't get a prediction until the
+third execution. (In the rare case, where every second instruction is a single-byte
+instruction, you may get a BTB entry on the first execution which becomes invalid in the
+second execution, but since the instruction it is attached to will then go to the V-pipe, it is
+ignored and gives no penalty. A BTB entry is only read if it is attached to the address of a
+U-pipe instruction).
+<p>
+A BTB entry is identified by its set-value which is equal to bits 0-5 of the address it is
+attached to. Bits 6-31 are then stored in the BTB as a tag. Addresses which are spaced a
+multiple of 64 bytes apart will have the same set-value. You can have no more than four
+BTB entries with the same set-value. If you want to check whether your jump instructions
+contend for the same BTB entries, then you have to compare bits 0-5 of the addresses of
+the U-pipe instructions in the preceding instruction pairs. This is very tedious, and I have
+never heard of anybody doing so. There are no tools available to do this job for you.
+<p>
+<h4>22.1.3 Consecutive branches (PPlain)</h4><p>
+When a jump is mispredicted, then the pipeline gets flushed. If the next instruction pair
+executed also contains a control transfer instruction, then the PPlain won't load its target
+because it cannot load a new target while the pipeline is being flushed. The result is that the
+second jump instruction is predicted to fall through regardless of the state of its BTB entry.
+Therefore, if the second jump is also taken, then you will get another penalty. The state of
+the BTB entry for the second jump instruction does get correctly updated, though. If you
+have a long chain of control transfer instructions, and the first jump in the chain is
+mispredicted, then the pipeline will get flushed all the time, and you will get nothing but
+mispredictions until you meet an instruction pair which does not jump. The most extreme
+case of this is a loop which jumps to itself: It will get a misprediction penalty for each
+iteration.
+<p>
+This is not the only problem with consecutive control transfer instructions. Another problem
+is that you can have another branch instruction between a BTB entry and the control
+transfer instruction it belongs to. If the first branch instruction jumps to somewhere else,
+then strange things may happen. Consider this example:
+<pre> SHR EAX,1
+ MOV EBX,[ESI]
+ CMP EAX,EBX
+ JB L1
+ JMP L2
+
+L1: MOV EAX,EBX
+ INC EBX</pre><p>
+
+When <kbd>JB L1</kbd> falls through, then you will get a BTB entry for
+<kbd>JMP L2</kbd> attached to the
+address of <kbd>CMP EAX,EBX</kbd>. But what will happen when <kbd>JB L1</kbd>
+later is taken? At the time
+when the BTB entry for <kbd>JMP L2</kbd> is read, the processor doesn't know that the next
+instruction pair does not contain a jump instruction, so it will actually predict the instruction
+pair <kbd>MOV EAX,EBX / INC EBX</kbd> to jump to <kbd>L2</kbd>.
+The penalty for predicting non-jump
+instructions to jump is 3 clock cycles. The BTB entry for <kbd>JMP L2</kbd> will get its state
+decremented, because it is applied to something which doesn't jump. If we keep going to
+<kbd>L1</kbd>, then the BTB entry for <kbd>JMP L2</kbd> will be decremented to state 1 and 0, so that the
+problem will disappear until next time <kbd>JMP L2</kbd> is executed.
+<p>
+The penalty for predicting the non-jumping instructions to jump only occurs when the jump
+to <kbd>L1</kbd> is predicted. In the case that <kbd>JB L1</kbd> is mispredictedly
+jumping, then the pipeline gets
+flushed and we won't get the false <kbd>L2</kbd> target loaded, so in this case we will not see the
+penalty of predicting the non-jumping instructions to jump, but we do get the BTB entry for
+<kbd>JMP L2</kbd> decremented.
+<p>
+Suppose, now, that we replace the <kbd>INC EBX</kbd> instruction above with another jump
+instruction. This third jump instruction will then use the same BTB entry as
+<kbd>JMP L2</kbd> with
+the possible penalty of predicting a wrong target, (unless it happens to also
+have <kbd>L2</kbd> as target).
+<p>
+To summarize, consecutive jumps can lead to the following problems:
+<ul>
+<li>failure to load a jump target when the pipeline is being flushed by a preceding
+mispredicted jump.
+<li>a BTB entry being mis-applied to non-jumping instructions and predicting them to jump.
+<li>a second consequence of the above is that a mis-applied BTB entry will get its state
+decremented, possibly leading to a later misprediction of the jump it belongs to. Even
+unconditional jumps can be predicted to fall through for this reason.
+<li>two jump instructions may share the same BTB entry, leading to the prediction of a
+wrong target.
+</ul>
+<p>
+
+All this mess may give you a lot of penalties, so you should definitely avoid having an
+instruction pair containing a jump immediately after another poorly predictable control
+transfer instruction or its target.
+<p>
+It is time for another illustrative example:
+<pre> CALL P
+ TEST EAX,EAX
+ JZ L2
+L1: MOV [EDI],EBX
+ ADD EDI,4
+ DEC EAX
+ JNZ L1
+L2: CALL P</pre><p>
+
+This looks like a quite nice and normal piece of code: A function call, a loop which is
+bypassed when the count is zero, and another function call. How many problems can you
+spot in this program?
+<p>
+First, we may note that the function <kbd>P</kbd> is called alternatingly from two different locations.
+This means that the target for the return from <kbd>P</kbd> will be changing all the time. Consequently,
+the return from <kbd>P</kbd> will always be mispredicted.
+<p>
+Assume, now, that <kbd>EAX</kbd> is zero. The jump to <kbd>L2</kbd> will not have its target loaded because the
+mispredicted return caused a pipeline flush. Next, the second <kbd>CALL P</kbd> will also fail to have
+its target loaded because <kbd>JZ L2</kbd> caused a pipeline flush. Here we have the situation where
+a chain of consecutive jumps makes the pipeline flush repeatedly because the first jump
+was mispredicted. The BTB entry for <kbd>JZ L2</kbd> is stored at the address of <kbd>P</kbd>'s return
+instruction. This BTB entry will now be mis-applied to whatever comes after the second
+<kbd>CALL P</kbd>, but that doesn't give a penalty because the pipeline is flushed by the mispredicted
+second return.
+<p>
+Now, let's see what happens if <kbd>EAX</kbd> has a nonzero value the next time:
+<kbd>JZ L2</kbd> is always
+predicted to fall through because of the flush. The second <kbd>CALL P</kbd>
+has a BTB entry at the
+address of <kbd>TEST EAX,EAX</kbd>. This entry will be mis-applied to the
+<kbd>MOV/ADD</kbd> pair, predicting
+it to jump to <kbd>P</kbd>. This causes a flush which prevents <kbd>JNZ L1</kbd>
+from loading its target. If we
+have been here before, then the second <kbd>CALL P</kbd> will have another BTB entry at the
+address of <kbd>DEC EAX</kbd>. On the second and third iteration of the loop, this entry will also be
+mis-applied to the <kbd>MOV/ADD</kbd> pair, until it has had its state decremented to 1 or 0. This will
+not cause a penalty on the second iteration because the flush from <kbd>JNZ L1</kbd> prevents it
+from loading its false target, but on the third iteration it will. The subsequent iterations of the
+loop have no penalties, but when it exits, <kbd>JNZ L1</kbd> is mispredicted. The flush would now
+prevent <kbd>CALL P</kbd> from loading its target, were it not for the fact that the BTB entry for
+<kbd>CALL P</kbd> has already been destroyed by being mis-applied several times.
+<p>
+We can improve this code by putting in some <kbd>NOP</kbd>'s to separate all consecutive jumps:
+<pre> CALL P
+ TEST EAX,EAX
+ NOP
+ JZ L2
+L1: MOV [EDI],EBX
+ ADD EDI,4
+ DEC EAX
+ JNZ L1
+L2: NOP
+ NOP
+ CALL P</pre><p>
+The extra <kbd>NOP</kbd>'s cost 2 clock cycles, but they save much more.
+Furthermore, <kbd>JZ L2</kbd> is now
+moved to the U-pipe which reduces its penalty from 4 to 3 when mispredicted. The only
+problem that remains is that the returns from <kbd>P</kbd> are always mispredicted. This problem can
+only be solved by replacing the call to <kbd>P</kbd> by an inline macro (if you have enough code
+cache).
+<p>
+The lesson to learn from this example is that you should always look carefully for
+consecutive jumps and see if you can save time by inserting some <kbd>NOP</kbd>'s. You should be
+particularly aware of those situations where misprediction is unavoidable, such as loop exits
+and returns from procedures which are called from varying locations. If you have something
+useful to put in, instead of the <kbd>NOP</kbd>'s, then you should of course do so.
+<p>
+Multiway branches (case statements) may be implemented either as a tree of branch
+instructions or as a list of jump addresses. If you choose to use a tree of branch
+instructions, then you have to include some <kbd>NOP</kbd>'s or other instructions to separate the
+consecutive branches. A list of jump addresses may therefore be a better solution on the
+PPlain. The list of jump addresses should be placed in the data segment. Never put data in
+the code segment!
+<p>
+<h4>22.1.4 Tight loops (PPlain)</h4><p>
+In a small loop you will often access the same BTB entry repeatedly with small intervals.
+This never causes a stall. Rather than waiting for a BTB entry to be updated, the PPlain
+somehow bypasses the pipeline and gets the resulting state from the last jump before it has
+been written to the BTB. This mechanism is almost transparent to the user, but it does in
+some cases have funny effects: You can see a branch prediction going from state 0 to state
+1, rather than to state 3, if the zero has not yet been written to the BTB. This happens if the
+loop has no more than four instruction pairs. In loops with only two instruction pairs you
+may sometimes have state 0 for two consecutive iterations without going out of the BTB. In
+such small loops it also happens in rare cases that the prediction uses the state resulting
+from two iterations ago, rather than from the last iteration. These funny effects will usually
+not have any negative effects on performance.
+<p>
+<h3><a name="22_2">22.2 Branch prediction in PMMX, PPro, PII and PIII</a></h3>
+<h4>22.2.1 BTB organization (PMMX, PPro, PII and PIII)</h4><p>
+The branch target buffer (BTB) of the PMMX has 256 entries organized as 16 ways * 16
+sets. Each entry is identified by bits 2-31 of the address of the last byte of the control
+transfer instruction it belongs to. Bits 2-5 define the set, and bits 6-31 are stored in the BTB
+as a tag. Control transfer instructions which are spaced 64 bytes apart have the
+same set-value and may therefore occasionally push each other out of the BTB. Since there are 16
+ways per set, this won't happen too often.
+<p>
+The branch target buffer (BTB) of the PPro, PII and PIII has 512 entries organized as 16 ways *
+32 sets. Each entry is identified by bits 4-31 of the address of the last byte of the control
+transfer instruction it belongs to. Bits 4-8 define the set, and all bits are stored in the BTB as
+a tag. Control transfer instructions which are spaced 512 bytes apart have the
+same set-value and may therefore occasionally push each other out of the BTB. Since there are 16
+ways per set, this won't happen too often.
+<p>
+The PPro, PII and PIII allocate a BTB entry to any control transfer instruction the first time it is
+executed. The PMMX allocates it the first time it jumps. A branch instruction which never
+jumps will stay out of the BTB on the PMMX. As soon as it has jumped once, it will stay in
+the BTB, even if it never jumps again.
+<p>
+An entry may be pushed out of the BTB when another control transfer instruction with the
+same set-value needs a BTB entry.
+<p>
+<h4>22.2.2 Misprediction penalty (PMMX, PPro, PII and PIII)</h4><p>
+In the PMMX, the penalty for misprediction of a conditional jump is 4 clocks in the U-pipe,
+and 5 clocks if it is executed in the V-pipe. For all other control transfer instructions it is 4
+clocks.
+<p>
+In the PPro, PII and PIII, the misprediction penalty is very high due to the long pipeline. A
+misprediction usually costs between 10 and 20 clock cycles. It is therefore very important to
+be aware of poorly predictable branches when running on PPro, PII and PIII.
+<p>
+<h4>22.2.3 Pattern recognition for conditional jumps (PMMX, PPro, PII and PIII)</h4><p>
+These processors have an advanced pattern recognition mechanism which will correctly
+predict a branch instruction which, for example, is taken every fourth time and falls through
+the other three times. In fact, they can predict any repetitive pattern of jumps and nojumps
+with a period of up to five, and many patterns with higher periods.
+<p>
+The mechanism is a so-called "two-level adaptive branch prediction scheme", invented by
+T.-Y. Yeh and Y. N. Patt. It is based on the same kind of two-bit counters as described
+above for the PPlain (but without the assymmetry flaw). The counter is incremented when
+the jump is taken and decremented when not taken. There is no wrap-around when
+counting up from 3 or down from 0. A branch instruction is predicted to be taken when the
+corresponding counter is in state 2 or 3, and to fall through when in state 0 or 1. An
+impressive improvement is now obtained by having sixteen such counters for each BTB
+entry. It selects one of these sixteen counters based on the history of the branch instruction
+for the last four executions. If, for example, the branch instruction jumps once and then falls
+through three times, then you have the history bits 1000 (1=jump, 0=nojump). This will
+make it use counter number 8 (1000 binary = 8) for predicting the next time and update
+counter 8 afterwards.
+<p>
+If the sequence 1000 is always followed by a 1, then counter number 8 will soon end up in
+its highest state (state 3) so that it will always predict a 1000 sequence to be followed by a
+1. It will take two deviations from this pattern to change the prediction. The repetitive pattern
+100010001000 will have counter 8 in state 3, and counter 1, 2 and 4 in state 0. The other
+twelve counters will be unused.
+<p>
+<h4>22.2.4 Perfectly predicted patterns (PMMX, PPro, PII and PIII)</h4><p>
+A repetitive branch pattern is predicted perfectly by this mechanism if
+every 4-bit sub-sequence in the period is unique.
+Below is a list of repetitive branch patterns which are predicted perfectly:<p>
+<table border=1 cellpadding=1 cellspacing=1>
+<tr><td class="a3"> period </td>
+<td class="a3"> perfectly predicted patterns </td></tr>
+<tr><td>1-5</td><td>all</td></tr>
+<tr><td>6</td><td>000011, 000101, 000111, 001011</td></tr>
+<tr><td>7</td><td>0000101, 0000111, 0001011</td></tr>
+<tr><td>8</td><td>00001011, 00001111, 00010011, 00010111, 00101101</td></tr>
+<tr><td>9</td><td>000010011, 000010111, 000100111, 000101101</td></tr>
+<tr><td>10</td><td>0000100111, 0000101101, 0000101111, 0000110111, 0001010011, 0001011101</td></tr>
+<tr><td>11</td><td>00001001111, 00001010011, 00001011101, 00010100111</td></tr>
+<tr><td>12</td><td>000010100111, 000010111101, 000011010111, 000100110111, 000100111011</td></tr>
+<tr><td>13</td><td>0000100110111, 0000100111011, 0000101001111</td></tr>
+<tr><td>14</td><td>00001001101111, 00001001111011, 00010011010111, 00010011101011, 00010110011101, 00010110100111</td></tr>
+<tr><td>15</td><td>000010011010111, 000010011101011, 000010100110111,
+000010100111011, 000010110011101, 000010110100111,
+000010111010011, 000011010010111</td></tr>
+<tr><td>16</td><td>0000100110101111, 0000100111101011, 0000101100111101,
+0000101101001111</td></tr>
+</table>
+<p>When reading this table, you should be aware that if a pattern is predicted correctly than the
+same pattern reversed (read backwards) is also predicted correctly, as well as the same
+pattern with all bits inverted. Example:
+In the table we find the pattern: 0001011.
+Reversing this pattern gives: 1101000.
+Inverting all bits gives: 1110100.
+Both reversing and inverting: 0010111.
+These four patterns are all recognizable. Rotating the pattern one place to the left gives:
+0010110. This is of course not a new pattern, only a phase shifted version of the same
+pattern. All patterns which can be derived from one of the patterns in the table by reversing,
+inverting and rotating are also recognizable. For reasons of brevity, these are not listed.
+<p>
+It takes two periods for the pattern recognition mechanism to learn a regular repetitive
+pattern after the BTB entry has been allocated. The pattern of mispredictions in the learning
+period is not reproducible. This is probably because the BTB entry contained something
+prior to allocation. Since BTB entries are allocated according to a random scheme, there is
+little chance of predicting what happens during the initial learning period.
+<p>
+
+<h4>22.2.5 Handling deviations from a regular pattern (PMMX, PPro, PII and PIII)</h4><p>
+The branch prediction mechanism is also extremely good at handling 'almost regular'
+patterns, or deviations from the regular pattern. Not only does it learn what the regular
+pattern looks like. It also learns what deviations from the regular pattern look like. If
+deviations are always of the same type, then it will remember what comes after the irregular
+event, and the deviation will cost only one misprediction.
+<p>
+Example:
+<pre>
+0001110001110001110001011100011100011100010111000
+ ^ ^</pre><p>
+In this sequence, a 0 means nojump, a 1 means jump. The mechanism learns that the
+repeated sequence is 000111. The first irregularity is an unexpected 0, which I have
+marked with a <kbd>^</kbd>. After this 0 the next three jumps may be mispredicted, because it hasn't
+learned what comes after 0010, 0101, and 1011. After one or two irregularities of the same
+kind it has learned that after 0010 comes a 1, after 0101 comes 1, and after 1011 comes 1.
+This means that after at most two irregularities of the same kind, it has learned to handle
+this kind of irregularity with only one misprediction.
+<p>
+The prediction mechanism is also very effective when alternating between two different
+regular patterns. If, for example, we have the pattern 000111 (with period 6) repeated many
+times, then the pattern 01 (period 2) many times, and then return to the 000111 pattern,
+then the mechanism doesn't have to relearn the 000111 pattern, because the counters
+used in the 000111 sequence have been left un-touched during the 01 sequence. After a
+few alternations between the two patterns, it has also learned to handle the changes of
+pattern with only one misprediction for each time the pattern is switched.
+<p>
+<h4>22.2.6 Patterns which are not predicted perfectly (PMMX, PPro, PII and PIII)</h4><p>
+The simplest branch pattern which cannot be predicted perfectly is a branch which is taken
+on every 6'th execution. The pattern is:
+<pre>000001000001000001
+ ^^ ^^ ^^
+ ab ab ab</pre><p>
+The sequence 0000 is alternatingly followed by a 0, in the positions marked a above, and
+by a 1, in the positions marked b. This affects counter number 0 which will count up and
+down all the time. If counter 0 happens to start in state 0 or 1, then it will alternate between
+state 0 and 1. This will lead to a misprediction in position b. If counter 0 happens to start in
+state 3, then it will alternate between state 2 and 3 which will cause a misprediction in
+position a. The worst case is when it starts in state 2. It will alternate between state 1 and 2
+with the unfortunate consequence that we get a misprediction both in position a and b. (This
+is analogous to the worst case for the PPlain explained <a href="#worstpred">above</a>). Which of these four
+situations we will get depends on the history of the BTB entry prior to allocation to this
+branch. This is beyond our control because of the random allocation method.
+<p>
+In principle, it is possible to avoid the worst case situation where we have two mispredictions
+per cycle by giving it an initial branch sequence which is specially designed for putting the
+counter in the desired state. Such an approach cannot be recommended, however,
+because of the considerable extra code complexity required, and because whatever
+information we have put into the counter is likely to be lost during the next timer interrupt or
+task switch.
+<p>
+<h4>22.2.7 Completely random patterns (PMMX, PPro, PII and PIII)</h4><p>
+The powerful capability of pattern recognition has a minor drawback in the case of
+completely random sequences with no regularities.
+<p>
+The following table lists the experimental fraction of mispredictions for a completely random
+sequence of jumps and nojumps:<p>
+
+<table border=1 cellpadding=1 cellspacing=1><tr>
+<td align="center" class="a3"> fraction of jumps/nojumps </td>
+<td align="center" class="a3"> fraction of mispredictions </td></tr>
+<tr><td align="center">0.001/0.999</td>
+<td align="center">0.001001</td></tr>
+<tr><td align="center">0.01/0.99</td>
+<td align="center">0.0101</td></tr>
+<tr><td align="center">0.05/0.95</td>
+<td align="center">0.0525</td></tr>
+<tr><td align="center">0.10/0.90</td>
+<td align="center">0.110</td></tr>
+<tr><td align="center">0.15/0.85</td>
+<td align="center">0.171</td></tr>
+<tr><td align="center">0.20/0.80</td>
+<td align="center">0.235</td></tr>
+<tr><td align="center">0.25/0.75</td>
+<td align="center">0.300</td></tr>
+<tr><td align="center">0.30/0.70</td>
+<td align="center">0.362</td></tr>
+<tr><td align="center">0.35/0.65</td>
+<td align="center">0.418</td></tr>
+<tr><td align="center">0.40/0.60</td>
+<td align="center">0.462</td></tr>
+<tr><td align="center">0.45/0.55</td>
+<td align="center">0.490</td></tr>
+<tr><td align="center">0.50/0.50</td>
+<td align="center">0.500</td></tr>
+</table>
+<p>
+The fraction of mispredictions is slightly higher than it would be without pattern recognition
+because the processor keeps trying to find repeated patterns in a sequence which has no
+regularities.
+<p>
+<h4>22.2.8 Tight loops (PMMX)</h4><p>
+The branch prediction is not reliable in tiny loops where the pattern recognition mechanism
+doesn't have time to update its data before the next branch is met. This means that simple
+patterns, which would normally be predicted perfectly, are not recognized. Incidentally,
+some patterns which normally would not be recognized, are predicted perfectly in tight
+loops. For example, a loop which always repeats 6 times would have the branch pattern
+111110 for the branch instruction at the bottom of the loop. This pattern would normally
+have one or two mispredictions per iteration, but in a tight loop it has none. The same
+applies to a loop which repeats 7 times. Most other repeat counts are predicted poorer in
+tight loops than normally. This means that a loop which iterates 6 or 7 times should
+preferably be tight, whereas other loops should preferably not be tight. You may unroll a
+loop if necessary to make it less tight.
+<p>
+To find out whether a loop will behave as 'tight' on the PMMX you may follow the following
+rule of thumb: Count the number of instructions in the loop. If the number is 6 or less, then
+the loop will behave as tight. If you have more than 7 instructions, then you can be
+reasonably sure that the pattern recognition functions normally. Strangely enough, it doesn't
+matter how many clock cycles each instruction takes, whether it has stalls, or whether it is
+paired or not. Complex integer instructions do not count. A loop can have lots of complex
+integer instructions and still behave as a tight loop. A complex integer instruction
+is a non-pairable integer instruction which always takes more than one clock cycle. Complex floating
+point instructions and MMX instructions still count as one. Note, that this rule of thumb is
+heuristic and not completely reliable. In important cases you may want to do your own
+testing. You can use performance monitor counter number 35H for the PMMX to count
+branch mispredictions. Test results may not be completely deterministic, because branch
+predictions may depend on the history of the BTB entry prior to allocation.
+<p>
+Tight loops on PPro, PII and PIII are predicted normally, and take minimum two clock cycles per
+iteration.
+<p>
+<h4>22.2.9 Indirect jumps and calls (PMMX, PPro, PII and PIII)</h4><p>
+There is no pattern recognition for indirect jumps and calls, and the BTB can remember no
+more than one target for an indirect jump. It is simply predicted to go to the same target as it
+did last time.
+<p>
+<h4>22.2.10 JECXZ and LOOP (PMMX)</h4><p>
+There is no pattern recognition for these two instructions in the PMMX. They are simply
+predicted to go the same way as last time they were executed. These two instructions
+should be avoided in time-critical code for PMMX. (In PPro, PII and PIII they are predicted using
+pattern recognition, but the loop instruction is still inferior to <kbd>DEC ECX / JNZ</kbd>).
+<p>
+<h4>22.2.11 Returns (PMMX, PPro, PII and PIII)</h4><p>
+The PMMX, PPro, PII and PIII processors have a Return Stack Buffer (RSB) which is used for
+predicting return instructions. The RSB works as a First-In-Last-Out buffer. Each time a
+call instruction is executed, the corresponding return address is pushed into the RSB. And
+each time a return instruction is executed, a return address is pulled out of the RSB and
+used for prediction of the return. This mechanism makes sure that return instructions are
+correctly predicted when the same subroutine is called from several different locations.
+<p>
+In order to make sure this mechanism works correctly, you must make sure that all calls
+and returns are matched. Never jump out of a subroutine without a return and never use a
+return as an indirect jump if speed is critical.
+<p>
+The RSB can hold four entries in the PMMX, sixteen in the PPro, PII and PIII. In the case where
+the RSB is empty, the return instruction is predicted in the same way as an indirect jump,
+i.e. it is expected to go to the same target as it did last time.
+<p>
+On the PMMX, when subroutines are nested deeper than four levels then the innermost
+four levels use the RSB, whereas all subsequent returns from the outer levels use the
+simpler prediction mechanism as long as there are no new calls. A return instruction which
+uses the RSB still occupies a BTB entry. Four entries in the RSB of the PMMX doesn't
+sound of much, but it is probably sufficient. Subroutine nesting deeper than four levels is
+certainly not unusual, but only the innermost levels matter in terms of speed, except
+possibly for recursive procedures.
+<p>
+On the PPro, PII and PIII, when subroutines are nested deeper than sixteen levels then the
+innermost 16 levels use the RSB, whereas all subsequent returns from the outer levels are
+mispredicted. Recursive subroutines should therefore not go deeper than 16 levels.
+<p>
+<h4>22.2.12 Static prediction in PMMX</h4><p>
+A control transfer instruction which has not been seen before or which is not in the BTB is
+always predicted to fall through on the PMMX. It doesn't matter whether it goes forward or
+backwards.
+<p>
+A branch instruction will not get a BTB entry if it always falls through. As soon as it is taken
+once, it will get into the BTB and stay there no matter how many times it falls through. A
+control transfer instruction can only go out of the BTB when it is pushed out by another
+control transfer instruction which steals its BTB entry.
+<p>
+Any control transfer instruction which jumps to the address immediately following itself will
+not get a BTB entry. Example: <pre>
+ JMP SHORT LL
+LL:</pre><p>
+This instruction will never get a BTB entry and therefore always have a misprediction
+penalty.
+<p>
+<h4>22.2.13 Static prediction in PPro, PII and PIII</h4><p>
+On PPro, PII and PIII, a control transfer instruction which has not been seen before or which is
+not in the BTB is predicted to fall through if it goes forwards, and to be taken if it goes
+backwards (e.g. a loop). Static prediction takes longer time than dynamic prediction on
+these processors.
+<p>
+If your code is unlikely to be cached then it is preferred to have the most frequently
+executed branch fall through in order to improve prefetching.
+<p>
+<h4>22.2.14 Close jumps (PMMX)</h4><p>
+On the PMMX, there is a risk that two control transfer instructions will share the same BTB
+entry if they are too close to each other. The obvious result is that they will always be
+mispredicted.
+<p>
+The BTB entry for a control transfer instruction is identified by bits 2-31 of the address of
+the last byte in the instruction. If two control transfer instructions are so close together that
+they differ only in bits 0-1 of the address, then we have the problem of a shared BTB entry.
+Example:
+<pre> CALL P
+ JNC SHORT L</pre><p>
+If the last byte of the <kbd>CALL</kbd> instruction and the last byte of the <kbd>JNC</kbd> instruction lie within the
+same dword of memory, then we have the penalty. You have to look at the output list file
+from the assembler to see whether the two addresses are separated by a DWORD boundary
+or not. (A DWORD boundary is an address divisible by 4).
+<p>
+There are various ways to solve this problem: <br>
+1. Move the code sequence a little up or down in memory so that you get a dword
+boundary between the two addresses.<br>
+2. Change the short jump to a near jump (with 4 bytes displacement) so that the end of the
+instruction is moved further down. There is no way you can force the assembler to use
+anything but the shortest form of an instruction so you have to hard-code the near
+branch if you choose this solution.<br>
+3. Put in some instruction between the <kbd>CALL</kbd> and the <kbd>JNC</kbd> instructions. This is the easiest
+method, and the only method if you don't know where DWORD boundaries are because
+your segment is not dword aligned or because the code keeps moving up and down as
+you make changes in the preceding code:<br>
+<pre> CALL P
+ MOV EAX,EAX ; two bytes filler to be safe
+ JNC SHORT L</pre><p>
+If you want to avoid problems on the PPlain too, then put in two <kbd>NOP</kbd>'s instead to prevent
+pairing (see section 22.1.3 above).
+ <p>
+The <kbd>RET</kbd> instruction is particularly prone to this problem because it is only one byte long:
+<pre> JNZ NEXT
+ RET</pre><p>
+Here you may need up to three bytes of fillers:
+<pre> JNZ NEXT
+ NOP
+ MOV EAX,EAX
+ RET</pre>
+<p>
+<h4>22.2.15 Consecutive calls or returns (PMMX)</h4><p>
+There is a penalty when the first instruction pair following the target label of a call contains
+another call instruction or if a return follows immediately after another return. Example:
+<pre>FUNC1 PROC NEAR
+ NOP ; avoid call after call
+ NOP
+ CALL FUNC2
+ CALL FUNC3
+ NOP ; avoid return after return
+ RET
+FUNC1 ENDP</pre><p>
+Two <kbd>NOP</kbd>'s are required before <kbd>CALL FUNC2</kbd> because a single
+<kbd>NOP</kbd> would pair with the
+<kbd>CALL</kbd>. One <kbd>NOP</kbd> is enough before the <kbd>RET</kbd> because
+<kbd>RET</kbd> is unpairable. No <kbd>NOP</kbd>'s are required
+between the two <kbd>CALL</kbd> instructions because there is no penalty for call after return. (On the
+PPlain you would need two <kbd>NOP</kbd>'s here too).
+<p>
+The penalty for chained calls only occurs when the same subroutines are called from more
+than one location (probably because the RSB needs updating). Chained returns always
+have a penalty. There is sometimes a small stall for a jump after a call, but no penalty for
+return after call; call after return; jump, call, or return after jump; or jump after return.
+<p>
+<h4>22.2.16 Chained jumps (PPro, PII and PIII)</h4><p>
+A jump, call, or return cannot be executed in the first clock cycle after a previous jump, call,
+or return. Therefore, chained jumps will take two clock cycles for each jump, and you may
+want to make sure that the processor has something else to do in parallel. For the same
+reason, a loop will take at least two clock cycles per iteration on these processors.
+<p>
+<h4>22.2.17 Designing for branch predictabiligy (PMMX, PPro, PII and PIII)</h4><p>
+Multiway branches (switch/case statements) are implemented either as an indirect jump
+using a list of jump addresses, or as a tree of branch instructions. Since indirect jumps are
+poorly predicted, the latter method may be preferred if easily predicted patterns can be
+expected and you have enough BTB entries. In case you decide to use the former method,
+then it is recommended that you put the list of jump addresses in the data segment.
+<p>
+You may want to reorganize your code so that branch patterns which are not predicted
+perfectly can be replaced by other patterns which are. Consider, for example, a loop which
+always executes 20 times. The conditional jump at the bottom of the loop is taken 19 times
+and falls through every 20'th time. This pattern is regular, but not recognized by the pattern
+recognition mechanism, so the fall-through is always mispredicted. You may make two
+nested loops by four and five, or unroll the loop by four and let it execute 5 times, in order to
+have only recognizable patterns. This kind of complicated schemes are only worth the extra
+code on the PPro, PII and PIII processors where mispredictions are very expensive. For higher
+loop counts there is no reason to do anything about the single misprediction.
+<p>
+<h3><a name="22_3">22.3. Avoiding jumps (all processors)</a></h3><p>
+There can be many reasons why you may want reduce the number of jumps, calls and
+returns:
+<ul>
+<li>jump mispredictions are very expensive,
+<li>there are various penalties for consecutive or chained jumps, depending on the
+processor,
+<li>jump instructions may push one another out of the branch target buffer because of the
+random replacement algorithm,
+<li>a return takes 2 clocks on PPlain and PMMX, calls and returns generate 4 uops on
+PPro, PII and PIII.
+<li>on PPro, PII and PIII, instruction fetch may be delayed after a jump
+(chapter <a href="#15">15</a>), and
+retirement may be slightly less effective for taken jumps then for other uops
+(chapter <a href="#18">18</a>).
+</ul>
+<p>
+Calls and returns can be avoided by replacing small procedures with inline macros.
+And in many cases it is possible to reduce the number of jumps by restructuring
+your code. For example, a jump to a jump should be replaced by a jump to the final
+target. In some cases this is even possible with conditional jumps if the condition
+is the same or is known. A jump to a return can be replaced by a return. If you want
+to eliminate a return to a return, then you should not manipulate the stack pointer
+because that would interfere with the prediction mechanism of the return stack buffer.
+Instead, you can replace the preceding call with a jump. For example
+<kbd>CALL PRO1 / RET</kbd> can be replaced by <kbd>JMP PRO1</kbd> if
+<kbd>PRO1</kbd> ends with the same kind of <kbd>RET</kbd>.
+<p>
+You may also eliminate a jump by dublicating the code jumped to. This can be
+useful if you have a two-way branch inside a loop or before a return. Example:
+<pre>A: CMP [EAX+4*EDX],ECX
+ JE B
+ CALL X
+ JMP C
+B: CALL Y
+C: INC EDX
+ JNZ A
+ MOV ESP, EBP
+ POP EBP
+ RET</pre><p>
+The jump to <kbd>C</kbd> may be eliminated by dublicating the loop epilog:
+<pre>A: CMP [EAX+4*EDX],ECX
+ JE B
+ CALL X
+ INC EDX
+ JNZ A
+ JMP D
+B: CALL Y
+C: INC EDX
+ JNZ A
+D: MOV ESP, EBP
+ POP EBP
+ RET</pre><p>
+The most often executed branch should come first here. The jump to <kbd>D</kbd>
+is outside the loop and therefore less critical. If this jump is executed so often
+that it needs optimizing too, then replace it with the three instructions following
+<kbd>D</kbd>.
+<p>
+<h3><a name="22_4">22.4. Avoiding conditional jumps by using flags (all processors)</a></h3><p>
+The most important jumps to eliminate are conditional jumps, especially if
+they are poorly predictable. Sometimes it is possible to obtain the same effect
+as a branch by ingenious manipulation of bits and flags. For example you may
+calculate the absolute value of a signed number
+without branching:
+<pre> CDQ
+ XOR EAX,EDX
+ SUB EAX,EDX</pre><p>
+(On PPlain and PMMX, use <kbd>MOV EDX,EAX / SAR EDX,31</kbd> instead of <kbd>CDQ</kbd>).
+<p>
+The carry flag is particularly useful for this kind of tricks:<br>
+Setting carry if a value is zero: <kbd>CMP [VALUE],1</kbd><br>
+Setting carry if a value is not zero: <kbd>XOR EAX,EAX / CMP EAX,[VALUE]</kbd><br>
+Incrementing a counter if carry: <kbd>ADC EAX,0</kbd><br>
+Setting a bit for each time the carry is set: <kbd>RCL EAX,1</kbd><br>
+Generating a bit mask if carry is set: <kbd>SBB EAX,EAX</kbd><br>
+Setting a bit on an arbitrary condition: <kbd>SETcond AL</kbd><br>
+Setting all bits on an arbitrary condition: <kbd>XOR EAX,EAX / SETNcond AL / DEC EAX</kbd><br>
+(remember to reverse the condition in the last example)
+<p>
+The following example finds the minimum of two unsigned numbers: if (b < a) a = b;
+<pre> SUB EBX,EAX
+ SBB ECX,ECX
+ AND ECX,EBX
+ ADD EAX,ECX</pre><p>
+The next example chooses between two numbers: if (a != 0) a = b; else a = c;
+<pre> CMP EAX,1
+ SBB EAX,EAX
+ XOR ECX,EBX
+ AND EAX,ECX
+ XOR EAX,EBX</pre><p>
+Whether or not such tricks are worth the extra code depends on how predictable a
+conditional jump would be, whether the extra pairing or scheduling opportunities of the branch-free code
+can be utilized, and whether there are other jumps following immediately after which could
+suffer the penalties of consecutive jumps.
+<p>
+<h3><a name="22_5">22.5. Replacing conditional jumps by conditional moves (PPro, PII and PIII)</a></h3><p>
+The PPro, PII and PIII processors have conditional move instructions intended specifically for
+avoiding branches because branch misprediction is very time-consuming on these
+processors. There are conditional move instructions for both integer and floating point
+registers. For code that will run only on these processors you may replace poorly
+predictable branches with conditional moves whenever possible. If you want your code to
+run on all processors then you may make two versions of the most critical parts of the code,
+one for processors that support conditional move instructions and one for those that don't
+(see chapter <a href="#27_10">27.10</a> for how to detect if conditional moves are supported).
+<p>
+The misprediction penalty for a branch may be so high that it is advantageous to replace it
+with conditional moves even when it costs several extra instructions. But a conditional move
+instruction has the disadvantage that it makes dependency chains longer. The conditional move
+waits for both register operands to be ready even
+though only one of them is needed. A conditional move is waiting for three operands to be
+ready: the condition flag and the two move operands. You have to consider if any of these
+three operands are likely to be delayed by dependency chains or cache misses. If the
+condition flag is available long before the move operands then you may as well use a
+branch, because a possible branch misprediction could be resolved while waiting for the
+move operands. In situations where you have to wait long for a move operand that may not
+be needed after all, the branch will be faster than the conditional move despite a possible
+misprediction penalty. The opposite situation is when the condition flag is delayed while
+both move operands are available early. In this situation the conditional move is preferred
+over the branch if misprediction is likely.
+
+<p>
+<h2><a name="23">23</a>. Reducing code size (all processors)</h2><p>
+As explained in chapter <a href="#7">7</a>, the code cache is 8 or 16 kb. If you have problems keeping the
+critical parts of your code within the code cache, then you may consider reducing the size of
+your code.
+<p>
+ 32 bit code is usually bigger than 16 bit code because addresses and data constants take 4
+bytes in 32 bit code and only 2 bytes in 16 bit code. However, 16 bit code has other
+penalties such as prefixes and problems with accessing adjacent words simultaneously
+(see chapter 10.2 <a href="#imperfectpush">above</a>). Some other methods for reducing the size or your code are discussed
+below.
+<p>
+Both jump addresses, data addresses, and data constants take less space if they can be
+expressed as a sign-extended byte, i.e. if they are within the interval from -128 to +127.
+<p>
+For jump addresses this means that short jumps take two bytes of code, whereas jumps
+beyond 127 bytes take 5 bytes if unconditional and 6 bytes if conditional.
+<p>
+Likewise, data addresses take less space if they can be expressed as a pointer and a
+displacement between -128 and +127.
+Example:<br>
+<kbd> MOV EBX,DS:[100000] / ADD EBX,DS:[100004] ; 12 bytes</kbd><br>
+Reduce to:<br>
+<kbd> MOV EAX,100000 / MOV EBX,[EAX] / ADD EBX,[EAX+4] ; 10 bytes</kbd>
+<p>
+The advantage of using a pointer obviously increases if you use it many times. Storing data
+on the stack and using <kbd>EBP</kbd> or <kbd>ESP</kbd> as pointer will thus make your code smaller than if you
+use static memory locations and absolute addresses, provided of course that your data are
+within +/-127 bytes of the pointer. Using <kbd>PUSH</kbd> and <kbd>POP</kbd> to write and read temporary data is
+even shorter.
+<p>
+ Data constants may also take less space if they are between -128 and +127. Most
+instructions with immediate operands have a short form where the operand is a
+sign-extended single byte. Examples:
+<pre> PUSH 200 ; 5 bytes
+ PUSH 100 ; 2 bytes
+
+ ADD EBX,128 ; 6 bytes
+ SUB EBX,-128 ; 3 bytes</pre><p>
+
+ The most important instruction with an immediate operand which doesn't have such a short
+form is <kbd>MOV</kbd>.<br>
+Examples:
+<pre> MOV EAX, 0 ; 5 bytes</pre><p>
+ May be changed to:<br>
+<pre> XOR EAX,EAX ; 2 bytes</pre><p>
+And
+<pre> MOV EAX, 1 ; 5 bytes</pre><p>
+ May be changed to:
+<pre> XOR EAX,EAX / INC EAX ; 3 bytes</pre><p>
+or:
+<pre> PUSH 1 / POP EAX ; 3 bytes</pre><p>
+And
+<pre> MOV EAX, -1 ; 5 bytes</pre><p>
+May be changed to:
+<pre> OR EAX, -1 ; 3 bytes</pre>
+<p>
+If the same address or constant is used more than once then you may load it
+into a register. A <kbd>MOV</kbd>
+with a 4-byte immediate operand may sometimes be replaced by an arithmetic
+instruction if the value of the register before the <kbd>MOV</kbd> is known. Example:
+<pre> MOV [mem1],200 ; 10 bytes
+ MOV [mem2],200 ; 10 bytes
+ MOV [mem3],201 ; 10 bytes
+ MOV EAX,100 ; 5 bytes
+ MOV EBX,150 ; 5 bytes</pre><p>
+Assuming that <kbd>mem1</kbd> and <kbd>mem3</kbd> are both within -128/+127
+bytes of <kbd>mem2</kbd>, this may be changed to:
+<pre> MOV EBX, OFFSET mem2 ; 5 bytes
+ MOV EAX,200 ; 5 bytes
+ MOV [EBX+mem1-mem2],EAX ; 3 bytes
+ MOV [EBX],EAX ; 2 bytes
+ INC EAX ; 1 byte
+ MOV [EBX+mem3-mem2],EAX ; 3 bytes
+ SUB EAX,101 ; 3 bytes
+ LEA EBX,[EAX+50] ; 3 bytes</pre><p>
+Be aware of the AGI stall in the <kbd>LEA</kbd> instruction (for PPlain and PMMX).
+<p>
+You may also consider that different instructions have different lengths. The following
+instructions take only one byte and are therefore very attractive:
+<kbd>PUSH reg</kbd>, <kbd>POP reg, INC reg32, DEC reg32</kbd>.<br>
+<kbd>INC</kbd> and <kbd>DEC</kbd> with 8 bit registers take 2 bytes, so
+<kbd>INC EAX</kbd> is shorter than <kbd>INC AL</kbd>.
+<p>
+<kbd>XCHG EAX,reg</kbd> is also a single-byte instruction and thus takes less space
+than <kbd>MOV EAX,reg</kbd>, but it is slower.
+<p>
+Some instructions take one byte less when they use the accumulator than when they use
+any other register. <br>
+Examples:
+
+<pre> MOV EAX,DS:[100000] is smaller than MOV EBX,DS:[100000]
+ ADD EAX,1000 is smaller than ADD EBX,1000</pre><p>
+
+ Instructions with pointers take one byte less when they have only a base pointer
+ (not <kbd>ESP</kbd>)
+and a displacement than when they have a scaled index register, or both base pointer and
+index register, or <kbd>ESP</kbd> as base pointer. <br>
+Examples:
+<pre> MOV EAX,[array][EBX] is smaller than MOV EAX,[array][EBX*4]
+ MOV EAX,[EBP+12] is smaller than MOV EAX,[ESP+12]</pre><p>
+ Instructions with <kbd>EBP</kbd> as base pointer and no displacement and no index take one byte more
+than with other registers:
+<pre> MOV EAX,[EBX] is smaller than MOV EAX,[EBP], but
+ MOV EAX,[EBX+4] is same size as MOV EAX,[EBP+4].</pre><p>
+ Instructions with a scaled index pointer and no base pointer must have a four byte
+displacement, even when it is 0:
+<pre> LEA EAX,[EBX+EBX] is shorter than LEA EAX,[2*EBX].</pre>
+<p>
+<h2><a name="24">24</a>. Scheduling floating point code (PPlain and PMMX)</h2><p>
+Floating point instructions cannot pair the way integer instructions can, except for one
+special case, defined by the following rules:
+<ul>
+<li>the first instruction (executing in the U-pipe) must be <kbd>FLD, FADD, FSUB, FMUL,
+FDIV, FCOM, FCHS,</kbd> or <kbd>FABS</kbd>.
+<li>the second instruction (in V-pipe) must be <kbd>FXCH</kbd>
+<li>the instruction following the <kbd>FXCH</kbd> must be a floating point instruction, otherwise the
+<kbd>FXCH</kbd> will pair imperfectly and take an extra clock cycle.
+</ul><p>
+This special pairing is important, as will be explained shortly.
+<p>
+While floating point instructions in general cannot be paired, many can be pipelined, i.e. one
+instruction can begin before the previous instruction has finished. Example:
+<pre> FADD ST(1),ST(0) ; clock cycle 1-3
+ FADD ST(2),ST(0) ; clock cycle 2-4
+ FADD ST(3),ST(0) ; clock cycle 3-5
+ FADD ST(4),ST(0) ; clock cycle 4-6</pre><p>
+Obviously, two instructions cannot overlap if the second instruction needs the result of the
+first. Since almost all floating point instructions involve the top of stack register,
+<kbd>ST(0)</kbd>, there are seemingly not very many possibilities for making an instruction independent of the
+result of previous instructions. The solution to this problem is register renaming. The <kbd>FXCH</kbd>
+instruction does not in reality swap the contents of two registers, it only swaps their names.
+Instructions which push or pop the register stack also work by renaming. Floating point
+register renaming has been highly optimized on the Pentiums so that a register may be
+renamed while in use. Register renaming never causes stalls - it is even possible to rename
+a register more than once in the same clock cycle, as for example when you pair <kbd>FLD</kbd> or
+<kbd>FCOMPP</kbd> with <kbd>FXCH</kbd>.
+<p>
+By the proper use of <kbd>FXCH</kbd> instructions you may obtain a lot of overlapping in your floating
+point code. Example:
+<pre> FLD [a1] ; clock cycle 1
+ FADD [a2] ; clock cycle 2-4
+ FLD [b1] ; clock cycle 3
+ FADD [b2] ; clock cycle 4-6
+ FLD [c1] ; clock cycle 5
+ FADD [c2] ; clock cycle 6-8
+ FXCH ST(2) ; clock cycle 6
+ FADD [a3] ; clock cycle 7-9
+ FXCH ST(1) ; clock cycle 7
+ FADD [b3] ; clock cycle 8-10
+ FXCH ST(2) ; clock cycle 8
+ FADD [c3] ; clock cycle 9-11
+ FXCH ST(1) ; clock cycle 9
+ FADD [a4] ; clock cycle 10-12
+ FXCH ST(2) ; clock cycle 10
+ FADD [b4] ; clock cycle 11-13
+ FXCH ST(1) ; clock cycle 11
+ FADD [c4] ; clock cycle 12-14
+ FXCH ST(2) ; clock cycle 12</pre><p>
+In the above example we are interleaving three independent threads. Each <kbd>FADD</kbd> takes 3
+clock cycles, and we can start a new <kbd>FADD</kbd> in each clock cycle. When we have started an
+<kbd>FADD</kbd> in the 'a' thread we have time to start two new <kbd>FADD</kbd>
+instructions in the '<kbd>b</kbd>' and '<kbd>c</kbd>'
+threads before returning to the '<kbd>a</kbd>' thread, so every third
+<kbd>FADD</kbd> belongs to the same thread.
+We are using <kbd>FXCH</kbd> instructions every time to get the register that belongs to the desired
+thread into <kbd>ST(0)</kbd>. As you can see in the example above, this generates a regular pattern,
+but note well that the <kbd>FXCH</kbd> instructions repeat with a period of two while the threads have a
+period of three. This can be quite confusing, so you have to 'play computer' in order to know
+which registers are where.
+<p>
+All versions of the instructions <kbd>FADD, FSUB, FMUL,</kbd> and
+<kbd>FILD</kbd> take 3 clock cycles and are
+able to overlap, so that these instructions may be scheduled using the method described
+above. Using a memory operand does not take more time than a register operand if the
+memory operand is in the level 1 cache and properly aligned.
+<p>
+By now you must be used to rules having exceptions, and the overlapping rule is no
+exception: You cannot start an <kbd>FMUL</kbd> instruction one clock cycle
+after another <kbd>FMUL</kbd>
+instruction, because the <kbd>FMUL</kbd> circuitry is not perfectly pipelined.
+It is recommended that you
+put another instruction in between two <kbd>FMUL</kbd>'s. Example:
+<pre> FLD [a1] ; clock cycle 1
+ FLD [b1] ; clock cycle 2
+ FLD [c1] ; clock cycle 3
+ FXCH ST(2) ; clock cycle 3
+ FMUL [a2] ; clock cycle 4-6
+ FXCH ; clock cycle 4
+ FMUL [b2] ; clock cycle 5-7 (stall)
+ FXCH ST(2) ; clock cycle 5
+ FMUL [c2] ; clock cycle 7-9 (stall)
+ FXCH ; clock cycle 7
+ FSTP [a3] ; clock cycle 8-9
+ FXCH ; clock cycle 10 (unpaired)
+ FSTP [b3] ; clock cycle 11-12
+ FSTP [c3] ; clock cycle 13-14</pre><p>
+Here you have a stall before <kbd>FMUL [b2]</kbd> and before <kbd>FMUL [c2]</kbd>
+because another <kbd>FMUL</kbd>
+started in the preceding clock cycle. You can improve this code by putting
+<kbd>FLD</kbd> instructions in between the <kbd>FMUL</kbd>'s:
+<pre> FLD [a1] ; clock cycle 1
+ FMUL [a2] ; clock cycle 2-4
+ FLD [b1] ; clock cycle 3
+ FMUL [b2] ; clock cycle 4-6
+ FLD [c1] ; clock cycle 5
+ FMUL [c2] ; clock cycle 6-8
+ FXCH ST(2) ; clock cycle 6
+ FSTP [a3] ; clock cycle 7-8
+ FSTP [b3] ; clock cycle 9-10
+ FSTP [c3] ; clock cycle 11-12</pre><p>
+In other cases you may put <kbd>FADD, FSUB</kbd>, or anything else in
+between <kbd>FMUL</kbd>'s to avoid the stalls.
+<p>
+Overlapping floating point instructions requires of course that you have some independent
+threads that you can interleave. If you have only one big formula to execute, then you may
+compute parts of the formula in parallel to achieve overlapping. If, for example, you want to
+add six numbers, then you may split the operations into two threads with three numbers in
+each, and add the two threads in the end:
+
+<pre> FLD [a] ; clock cycle 1
+ FADD [b] ; clock cycle 2-4
+ FLD [c] ; clock cycle 3
+ FADD [d] ; clock cycle 4-6
+ FXCH ; clock cycle 4
+ FADD [e] ; clock cycle 5-7
+ FXCH ; clock cycle 5
+ FADD [f] ; clock cycle 7-9 (stall)
+ FADD ; clock cycle 10-12 (stall)</pre><p>
+
+Here we have a one clock stall before <kbd>FADD [f]</kbd> because it is waiting
+for the result of <kbd>FADD [d]</kbd> and a two clock stall before the last
+<kbd>FADD</kbd> because it is waiting for the result of
+<kbd>FADD [f]</kbd>. The latter stall can be hidden by filling in some integer
+instructions, but the first stall can not because an integer instruction at
+this place would make the <kbd>FXCH</kbd> pair imperfectly.
+<p>
+The first stall can be avoided by having three threads rather than two, but
+that would cost an extra <kbd>FLD</kbd> so we do not save anything by having
+three threads rather than two unless there are at least eight numbers to add.
+<p>
+Not all floating point instructions can overlap. And some floating point
+instructions can overlap more subsequent integer instructions than subsequent
+floating point instructions. The <kbd>FDIV</kbd> instruction, for example,
+takes 39 clock cycles. All but the first clock cycle can
+overlap with integer instructions, but only the last two clock cycles can
+overlap with floating point instructions. Example:
+<pre> FDIV ; clock cycle 1-39 (U-pipe)
+ FXCH ; clock cycle 1-2 (V-pipe, imperfect pairing)
+ SHR EAX,1 ; clock cycle 3 (U-pipe)
+ INC EBX ; clock cycle 3 (V-pipe)
+ CMC ; clock cycle 4-5 (non-pairable)
+ FADD [x] ; clock cycle 38-40 (U-pipe, waiting while FPU busy)
+ FXCH ; clock cycle 38 (V-pipe)
+ FMUL [y] ; clock cycle 40-42 (U-pipe, waiting for result of FDIV)</pre><p>
+The first <kbd>FXCH</kbd> pairs with the <kbd>FDIV</kbd>, but takes an extra
+clock cycle because it is not followed by a floating point instruction.
+The <kbd>SHR / INC</kbd> pair starts before the <kbd>FDIV</kbd> is finished, but
+has to wait for the <kbd>FXCH</kbd> to finish. The <kbd>FADD</kbd> has to wait
+till clock 38 because new floating point instructions can only execute during
+the last two clock cycles of the <kbd>FDIV</kbd>. The second <kbd>FXCH</kbd>
+pairs with the <kbd>FADD</kbd>. The <kbd>FMUL</kbd> has to wait for the <kbd>FDIV</kbd>
+to finish because it uses the result of the division.
+<p>
+If you have nothing else to put in after a floating point instruction with a
+large integer overlap, such as <kbd>FDIV</kbd> or <kbd>FSQRT</kbd>, then you
+may put in a dummy read from an address which you expect to need later in
+the program to make sure it is in the level one cache. Example:
+<pre> FDIV QWORD PTR [EBX]
+ CMP [ESI],ESI
+ FMUL QWORD PTR [ESI]</pre><p>
+Here we use the integer overlap to pre-load the value at <kbd>[ESI]</kbd> into
+the cache while the <kbd>FDIV</kbd> is being computed (we don't care what
+the result of the <kbd>CMP</kbd> is).
+<p>
+Chapter <a href="#28">28</a> gives a complete listing of floating point instructions, and
+what they can pair or overlap with.
+<p>
+There is no penalty for using a memory operand on floating point instuctions
+because the arithmetic unit is one step later in the pipeline than the read
+unit. The tradeoff of this comes when you store floating point data to memory.
+The <kbd>FST</kbd> or <kbd>FSTP</kbd> instruction with a memory
+operand takes two clock cycles in the execution stage, but it needs the data one clock
+earlier so you will get a one clock stall if the value to store is not ready one clock cycle in
+advance. This is analogous to an AGI stall. Example:
+<pre> FLD [a1] ; clock cycle 1
+ FADD [a2] ; clock cycle 2-4
+ FLD [b1] ; clock cycle 3
+ FADD [b2] ; clock cycle 4-6
+ FXCH ; clock cycle 4
+ FSTP [a3] ; clock cycle 6-7
+ FSTP [b3] ; clock cycle 8-9</pre><p>
+
+The <kbd>FSTP [a3]</kbd> stalls for one clock cycle because the result of
+<kbd>FADD [a2]</kbd> is not ready
+in the preceding clock cycle. In many cases you cannot hide this type of stall without
+scheduling your floating point code into four threads or putting some integer instructions in
+between. The two clock cycles in the execution stage of the <kbd>FST(P)</kbd> instruction cannot pair
+or overlap with any subsequent instructions.
+<p>
+Instructions with integer operands such as <kbd>FIADD, FISUB, FIMUL, FIDIV, FICOM</kbd> may
+be split up into simpler operations in order to improve overlapping. Example:
+<pre> FILD [a] ; clock cycle 1-3
+ FIMUL [b] ; clock cycle 4-9</pre><p>
+Split up into:
+<pre> FILD [a] ; clock cycle 1-3
+ FILD [b] ; clock cycle 2-4
+ FMUL ; clock cycle 5-7</pre><p>
+In this example, you save two clocks by overlapping the two FILD instructions.
+<p>
+<h2><a name="25">25</a>. Loop optimization (all processors)</h2><p>
+When analyzing a program you often find that most of the time consumption lies in the
+innermost loop. The way to improve the speed is to carefully optimize the most
+time-consuming loop using assembly language. The rest of the program may be left in high-level
+language.
+<p>
+In all the following examples it is assumed that all data are in the level 1 cache. If the speed
+is limited by cache misses then there is no reason to optimize the instructions. Rather, you
+should concentrate on organizing your data in a way that minimizes cache misses (see
+chapter <a href="#7">7</a>).
+<p>
+<h3><a name="25_1">25.1. Loops in PPlain and PMMX</a></h3><p>
+A loop generally contains a counter controlling how many times to iterate, and often array
+access reading or writing one array element for each iteration. I have chosen as example a
+procedure which reads integers from an array, changes the sign of each integer, and stores
+the results in another array.
+<p>
+A C language code for this procedure would be:
+<pre>void ChangeSign (int * A, int * B, int N) {
+ int i;
+ for (i=0; i<N; i++) B[i] = -A[i];}</pre>
+<p>
+Translating to assembly, we might write the procedure like this:
+<p>
+<h4>Example 1.1:</h4><p>
+<pre>_ChangeSign PROC NEAR
+ PUSH ESI
+ PUSH EDI
+A EQU DWORD PTR [ESP+12]
+B EQU DWORD PTR [ESP+16]
+N EQU DWORD PTR [ESP+20]
+ MOV ECX, [N]
+ JECXZ L2
+ MOV ESI, [A]
+ MOV EDI, [B]
+ CLD
+L1: LODSD
+ NEG EAX
+ STOSD
+ LOOP L1
+L2: POP EDI
+ POP ESI
+ RET ; (no extra pop if _cdecl calling convention)
+_ChangeSign ENDP</pre><p>
+This looks like a nice solution, but it is not optimal because it uses slow non-pairable
+instructions. It takes 11 clock cycles per iteration if all data are in the level one cache.
+<p>
+<h4>Using pairable instructions only (PPlain and PMMX)</h4>
+<h4>Example 1.2:</h4><p>
+<pre> MOV ECX, [N]
+ MOV ESI, [A]
+ TEST ECX, ECX
+ JZ SHORT L2
+ MOV EDI, [B]
+L1: MOV EAX, [ESI] ; u
+ XOR EBX, EBX ; v (pairs)
+ ADD ESI, 4 ; u
+ SUB EBX, EAX ; v (pairs)
+ MOV [EDI], EBX ; u
+ ADD EDI, 4 ; v (pairs)
+ DEC ECX ; u
+ JNZ L1 ; v (pairs)
+L2:</pre><p>
+Here we have used pairable instructions only, and scheduled the instructions so that
+everything pairs. It now takes only 4 clock cycles per iteration. We could have obtained the
+same speed without splitting the NEG instruction, but the other unpairable instructions
+should be split up.
+<p>
+<h4>Using the same register for counter and index</h4>
+<h4>Example 1.3:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EDI, [B]
+ MOV ECX, [N]
+ XOR EDX, EDX
+ TEST ECX, ECX
+ JZ SHORT L2
+L1: MOV EAX, [ESI+4*EDX] ; u
+ NEG EAX ; u
+ MOV [EDI+4*EDX], EAX ; u
+ INC EDX ; v (pairs)
+ CMP EDX, ECX ; u
+ JB L1 ; v (pairs)
+L2:</pre><p>
+Using the same register for counter and index gives us fewer instructions in the body of the
+loop, but it still takes 4 clocks because we have two unpaired instructions.
+<p>
+<h4>Letting the counter end at zero (PPlain and PMMX)</h4><p>
+We want to get rid of the <kbd>CMP</kbd> instruction in example 1.3 by letting the counter end at zero
+and use the zero flag for detecting when we are finished as we did in example 1.2. One way
+to do this would be to execute the loop backwards taking the last array elements first.
+However, data caches are optimized for accessing data forwards, not backwards, so if
+cache misses are likely, then you should rather start the counter at -N and count through
+negative values up to zero. The base registers should then point to the end of the arrays
+rather than the beginning:
+<p>
+<h4>Example 1.4:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EAX, [N]
+ MOV EDI, [B]
+ XOR ECX, ECX
+ LEA ESI, [ESI+4*EAX] ; point to end of array A
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+4*EAX] ; point to end of array B
+ JZ SHORT L2
+L1: MOV EAX, [ESI+4*ECX] ; u
+ NEG EAX ; u
+ MOV [EDI+4*ECX], EAX ; u
+ INC ECX ; v (pairs)
+ JNZ L1 ; u
+L2:</pre><p>
+We are now down at five instructions in the loop body but it still takes 4 clocks because of
+poor pairing. (If the addresses and sizes of the arrays are constants we may save two
+registers by substituting <kbd>A+SIZE A</kbd> for <kbd>ESI</kbd>
+and <kbd>B+SIZE B</kbd> for <kbd>EDI</kbd>). Now let's see how we
+can improve pairing.
+<p>
+<h4>Pairing calculations with loop overhead (PPlain and PMMX)</h4><p>
+We may want to improve pairing by intermingling calculations with the loop control
+instructions. If we want to put something in between <kbd>INC ECX</kbd>
+and <kbd>JNZ L1</kbd>, it has to be
+something that doesn't affect the zero flag. The <kbd>MOV [EDI+4*ECX],EBX</kbd>
+instruction after <kbd>INC ECX</kbd> would generate an AGI delay, so we have
+to be more ingenious:
+<p>
+<h4>Example 1.5:</h4><p>
+<pre> MOV EAX, [N]
+ XOR ECX, ECX
+ SHL EAX, 2 ; 4 * N
+ JZ SHORT L3
+ MOV ESI, [A]
+ MOV EDI, [B]
+ SUB ECX, EAX ; - 4 * N
+ ADD ESI, EAX ; point to end of array A
+ ADD EDI, EAX ; point to end of array B
+ JMP SHORT L2
+L1: MOV [EDI+ECX-4], EAX ; u
+L2: MOV EAX, [ESI+ECX] ; v (pairs)
+ XOR EAX, -1 ; u
+ ADD ECX, 4 ; v (pairs)
+ INC EAX ; u
+ JNC L1 ; v (pairs)
+ MOV [EDI+ECX-4], EAX
+L3:</pre><p>
+I have used a different way to calculate the negative of <kbd>EAX</kbd> here:
+inverting all bits and adding one. The reason why I am using this method is
+that I can use a dirty trick with the
+<kbd>INC</kbd> instruction: <kbd>INC</kbd> doesn't change the carry flag,
+whereas <kbd>ADD</kbd> does. I am using <kbd>ADD</kbd>
+rather than <kbd>INC</kbd> to increment my loop counter and testing the carry
+flag rather than the zero
+flag. It is then possible to put the <kbd>INC EAX</kbd> in between without
+affecting the carry flag. You
+may think that we could have used <kbd>LEA EAX,[EAX+1]</kbd> here instead of
+<kbd>INC EAX</kbd>, at least
+that doesn't change any flags, but the <kbd>LEA</kbd> instruction would have
+an AGI stall so that's not
+the best solution. Note that the trick with the <kbd>INC</kbd> instruction
+not changing the carry flag is useful only on PPlain and PMMX, but will
+cause a partial flags stall on PPro, PII and PIII.
+<p>
+I have obtained perfect pairing here and the loop now takes only 3 clock cycles.
+Whether you want to increment the loop counter by 1 (as in example 1.4) or by 4
+(as in example 1.5) is a matter of taste, it makes no difference in loop timing.
+<p>
+<h4>Overlapping the end of one operation with the beginning of the next (PPlain and PMMX)</h4><p>
+The method used in example 1.5 is not very generally applicable so we may look for other
+methods of improving pairing opportunities. One way is to reorganize the loop so that the
+end of one operation overlaps with the beginning of the next. I will call this convoluting the
+loop. A convoluted loop has an unfinished operation at the end of each loop iteration which
+will be finished in the next run. Actually, example 1.5 did pair the last <kbd>MOV</kbd> of one iteration
+with the first <kbd>MOV</kbd> of the next, but we want to explore this method further:
+<p>
+<h4>Example 1.6:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EAX, [N]
+ MOV EDI, [B]
+ XOR ECX, ECX
+ LEA ESI, [ESI+4*EAX] ; point to end of array A
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+4*EAX] ; point to end of array B
+ JZ SHORT L3
+ XOR EBX, EBX
+ MOV EAX, [ESI+4*ECX]
+ INC ECX
+ JZ SHORT L2
+L1: SUB EBX, EAX ; u
+ MOV EAX, [ESI+4*ECX] ; v (pairs)
+ MOV [EDI+4*ECX-4], EBX ; u
+ INC ECX ; v (pairs)
+ MOV EBX, 0 ; u
+ JNZ L1 ; v (pairs)
+L2: SUB EBX, EAX
+ MOV [EDI+4*ECX-4], EBX
+L3:</pre><p>
+
+Here we begin reading the second value before we have stored the first, and
+this of course improves pairing opportunities. The <kbd>MOV EBX,0</kbd>
+instruction has been put in between <kbd>INC ECX</kbd> and <kbd>JNZ L1</kbd>
+not to improve pairing but to avoid AGI stall.
+<p>
+<h4>Rolling out a loop (PPlain and PMMX)</h4><p>
+The most generally applicable way to improve pairing opportunities is to do two operations
+for each run and do half as many runs. This is called rolling out a loop:
+<p>
+<h4>Example 1.7:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EAX, [N]
+ MOV EDI, [B]
+ XOR ECX, ECX
+ LEA ESI, [ESI+4*EAX] ; point to end of array A
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+4*EAX] ; point to end of array B
+ JZ SHORT L2
+ TEST AL,1 ; test if N is odd
+ JZ SHORT L1
+ MOV EAX, [ESI+4*ECX] ; N is odd. do the odd one
+ NEG EAX
+ MOV [EDI+4*ECX], EAX
+ INC ECX ; make counter even
+ JZ SHORT L2 ; N = 1
+L1: MOV EAX, [ESI+4*ECX] ; u
+ MOV EBX, [ESI+4*ECX+4] ; v (pairs)
+ NEG EAX ; u
+ NEG EBX ; u
+ MOV [EDI+4*ECX], EAX ; u
+ MOV [EDI+4*ECX+4], EBX ; v (pairs)
+ ADD ECX, 2 ; u
+ JNZ L1 ; v (pairs)
+L2:</pre>
+<p>
+Now we are doing two operations in parallel which gives the best pairing opportunities. We
+have to test if <kbd>N</kbd> is odd and if so do one operation outside the loop because the loop can
+only do an even number of operations.
+<p>
+The loop has an AGI stall at the first <kbd>MOV</kbd> instruction because
+<kbd>ECX</kbd> has been incremented in
+the preceding clock cycle. The loop therefore takes 6 clock cycles for two operations.
+<p>
+<h4>Reorganizing a loop to remove AGI stall (PPlain and PMMX)</h4>
+<h4>Example 1.8:</h4><p>
+<pre> MOV ESI, [A]
+ MOV EAX, [N]
+ MOV EDI, [B]
+ XOR ECX, ECX
+ LEA ESI, [ESI+4*EAX] ; point to end of array A
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+4*EAX] ; point to end of array B
+ JZ SHORT L3
+ TEST AL,1 ; test if N is odd
+ JZ SHORT L2
+ MOV EAX, [ESI+4*ECX] ; N is odd. do the odd one
+ NEG EAX ; no pairing opportunity
+ MOV [EDI+4*ECX-4], EAX
+ INC ECX ; make counter even
+ JNZ SHORT L2
+ NOP ; add NOP's if JNZ L2 not predictable
+ NOP
+ JMP SHORT L3 ; N = 1
+L1: NEG EAX ; u
+ NEG EBX ; u
+ MOV [EDI+4*ECX-8], EAX ; u
+ MOV [EDI+4*ECX-4], EBX ; v (pairs)
+L2: MOV EAX, [ESI+4*ECX] ; u
+ MOV EBX, [ESI+4*ECX+4] ; v (pairs)
+ ADD ECX, 2 ; u
+ JNZ L1 ; v (pairs)
+ NEG EAX
+ NEG EBX
+ MOV [EDI+4*ECX-8], EAX
+ MOV [EDI+4*ECX-4], EBX
+L3:</pre>
+<p>
+The trick is to find a pair of instructions that do not use the loop counter as index and
+reorganize the loop so that the counter is incremented in the preceding clock cycle. We are
+now down at 5 clock cycles for two operations which is close to the best possible.
+<p>
+If data caching is critical, then you may improve the speed further by
+interleaving the <kbd>A</kbd> and <kbd>B</kbd> arrays into one structured array
+so that each <kbd>B[i]</kbd> comes immediately after the
+corresponding <kbd>A[i]</kbd>. If the structured array is aligned by at least
+8 then <kbd>B[i]</kbd> will always be
+in the same cache line as <kbd>A[i]</kbd>, so you will never have a cache
+miss when writing <kbd>B[i]</kbd>.
+This may of course have a tradeoff in other parts of the program so you
+have to weigh the costs against the benefits.
+<p>
+<h4>Rolling out by more than 2 (PPlain and PMMX)</h4><p>
+You may think of doing more than two operations per iteration in order to reduce the loop
+overhead per operation. But since the loop overhead in most cases can be reduced to only
+one clock cycle per iteration, then rolling out the loop by 4 rather than by 2 would only save
+1/4 clock cycle per operation, which is hardly worth the effort. Only if the loop overhead
+cannot be reduced to one clock cycle and if N is very big, should you think of unrolling by 4.
+<p>
+The drawbacks of excessive loop unrolling are:
+<ol>
+<li>You need to calculate N MODULO R, where R is the unrolling factor, and do N
+MODULO R operations before or after the main loop in order to make the remaining
+number of operations divisible by R. This takes a lot of extra code and poorly predictable
+branches. And the loop body of course also becomes bigger.
+<li>A Piece of code usually takes much more time the first time it executes, and the penalty
+of first time execution is bigger the more code you have, especially if N is small.
+<li>Excessive code size makes the utilization of the code cache less effective.
+</ol>
+<p>
+<h4>Handling multiple 8 or 16 bit operands simultaneously in 32 bit registers (PPlain and PMMX)</h4><p>
+If you need to manipulate arrays of 8 or 16 bit operands, then there is a problem with
+unrolled loops because you may not be able to pair two memory access operations. For
+example <kbd>MOV AL,[ESI] / MOV BL,[ESI+1]</kbd> will not pair if the two operands are within
+the same dword of memory. But there may be a much smarter method, namely to handle
+four bytes at a time in the same 32 bit register.
+<p>
+The following example adds 2 to all elements of an array of bytes:
+<p>
+<h4>Example 1.9:</h4><p>
+<pre> MOV ESI, [A] ; address of byte array
+ MOV ECX, [N] ; number of elements in byte array
+ TEST ECX, ECX ; test if N is 0
+ JZ SHORT L2
+ MOV EAX, [ESI] ; read first four bytes
+L1: MOV EBX, EAX ; copy into EBX
+ AND EAX, 7F7F7F7FH ; get lower 7 bits of each byte in EAX
+ XOR EBX, EAX ; get the highest bit of each byte
+ ADD EAX, 02020202H ; add desired value to all four bytes
+ XOR EBX, EAX ; combine bits again
+ MOV EAX, [ESI+4] ; read next four bytes
+ MOV [ESI], EBX ; store result
+ ADD ESI, 4 ; increment pointer
+ SUB ECX, 4 ; decrement loop counter
+ JA L1 ; loop
+L2:</pre><p>
+This loop takes 5 clock cycles for every 4 bytes. The array should of course be aligned by
+4. If the number of elements in the array is not divisible by four, then you may padd it in the
+end with a few extra bytes to make the length divisible by four. This loop will always read
+past the end of the array, so you should make sure the array is not placed at the end of a
+segment to avoid a general protection error.
+<p>
+Note that I have masked out the highest bit of each byte to avoid a possible carry from
+each byte into the next when adding. I am using <kbd>XOR</kbd> rather than
+<kbd>ADD</kbd> when putting in the high bit again to avoid carry.
+<p>
+The <kbd>ADD ESI,4</kbd> instruction could have been avoided by using the loop counter as index
+as in example 1.4. However, this would give an odd number of instructions in the loop
+body, so there would be one unpaired instruction and the loop would still take 5 clocks.
+Making the branch instruction unpaired would save one clock after the last operation when
+the branch is mispredicted, but we would have to spend an extra clock cycle in the prolog
+code to setup a pointer to the end of the array and calculate -N, so the two methods will be
+exactly equally fast. The method presented here is the simplest and shortest.
+<p>
+The next example finds the length of a zero-terminated string by searching
+for the first byte of zero. It is faster than using <kbd>REP SCASB</kbd>:
+<p>
+<h4><a name="1-10">Example 1.10:</a></h4><p>
+<pre>STRLEN PROC NEAR
+ MOV EAX,[ESP+4] ; get pointer
+ MOV EDX,7
+ ADD EDX,EAX ; pointer+7 used in the end
+ PUSH EBX
+ MOV EBX,[EAX] ; read first 4 bytes
+ ADD EAX,4 ; increment pointer
+L1: LEA ECX,[EBX-01010101H] ; subtract 1 from each byte
+ XOR EBX,-1 ; invert all bytes
+ AND ECX,EBX ; and these two
+ MOV EBX,[EAX] ; read next 4 bytes
+ ADD EAX,4 ; increment pointer
+ AND ECX,80808080H ; test all sign bits
+ JZ L1 ; no zero bytes, continue loop
+ TEST ECX,00008080H ; test first two bytes
+ JNZ SHORT L2
+ SHR ECX,16 ; not in the first 2 bytes
+ ADD EAX,2
+L2: SHL CL,1 ; use carry flag to avoid a branch
+ POP EBX
+ SBB EAX,EDX ; compute length
+ RET
+STRLEN ENDP</pre><p>
+Again we have used the method of overlapping the end of one operation with the beginning
+of the next to improve pairing. I have not unrolled the loop because it is likely to repeat
+relatively few times. The string should of course be aligned by 4. The code will always read
+past the end of the string, so the string should not be placed at the end of a segment.
+<p>
+The loop body has an odd number of instructions so there is one unpaired. Making the
+branch instruction unpaired rather than one of the other instructions has the advantage that
+it saves 1 clock cycle when the branch is mispredicted.
+<p>
+The <kbd>TEST ECX,00008080H</kbd> instruction is non-pairable. You could use the pairable
+instruction <kbd>OR CH,CL</kbd> here instead, but then you would have to put
+in a <kbd>NOP</kbd> or something to avoid the penalties of consecutive branches.
+Another problem with <kbd>OR CH,CL</kbd> is that it
+would cause a partial register stall on a PPro, PII and PIII. So I have chosen to keep the
+unpairable <kbd>TEST</kbd> instruction.
+<p>
+Handling 4 bytes simultaneously can be quite difficult. The code uses a formula which
+generates a nonzero value for a byte if, and only if, the byte is zero. This makes it possible
+to test all four bytes in one operation. This algorithm involves the subtraction of 1 from all
+bytes (in the <kbd>LEA</kbd> instruction). I have not masked out the highest bit of each byte before
+subtracting, as I did in the previous example, so the subtraction may generate a borrow to
+the next byte, but only if it is zero, and this is exactly the situation where we don't care what
+the next byte is, because we are searching forwards for the first zero. If we were searching
+backwards then we would have to re-read the dword after detecting a zero, and then test all
+four bytes to find the last zero, or use <kbd>BSWAP</kbd> to reverse the order of the bytes.
+<p>
+If you want to search for a byte value other than zero, then you may <kbd>XOR</kbd> all four bytes
+with the value you are searching for, and then use the method above to search for zero.
+<p>
+<h4>Loops with MMX operations (PMMX)</h4><p>
+Handling multiple operands in the same register is easier on the MMX processors because
+they have special instructions and special 64 bit registers for exactly this purpose.
+<p>
+Returning to the problem of adding two to all bytes in an array, we may take advantage of
+the MMX instructions:
+<h4>Example 1.11:</h4><p>
+<pre>.data
+ALIGN 8
+ADDENTS DQ 0202020202020202h ; specify byte to add eight times
+A DD ? ; address of byte array
+N DD ? ; number of iterations
+
+.code
+ MOV ESI, [A]
+ MOV ECX, [N]
+ MOVQ MM2, [ADDENTS]
+ JMP SHORT L2
+ ; top of loop
+L1: MOVQ [ESI-8], MM0 ; store result
+L2: MOVQ MM0, MM2 ; load addents
+ PADDB MM0, [ESI] ; add eight bytes in one operation
+ ADD ESI, 8
+ DEC ECX
+ JNZ L1
+ MOVQ [ESI-8], MM0 ; store last result
+ EMMS</pre><p>
+The store instruction is moved to after the loop control instructions in order to avoid a store stall.
+<p>
+This loop takes 4 clocks because the <kbd>PADDB</kbd> instruction doesn't pair
+with <kbd>ADD ESI,8</kbd>. (A MMX instruction with memory access cannot pair
+with a non-MMX instruction or with another MMX instruction with memory access).
+We could get rid of <kbd>ADD ESI,8</kbd> by using <kbd>ECX</kbd> as index,
+but that would give an AGI stall.
+<p>
+Since the loop overhead is considerable we might want to unroll the loop:
+<p>
+<h4>Example 1.12:</h4><p>
+<pre>.data
+ALIGN 8
+ADDENTS DQ 0202020202020202h ; specify byte to add eight
+times
+A DD ? ; address of byte array
+N DD ? ; number of iterations
+
+.code
+ MOVQ MM2, [ADDENTS]
+ MOV ESI, [A]
+ MOV ECX, [N]
+ MOVQ MM0, MM2
+ MOVQ MM1, MM2
+L3: PADDB MM0, [ESI]
+ PADDB MM1, [ESI+8]
+ MOVQ [ESI], MM0
+ MOVQ MM0, MM2
+ MOVQ [ESI+8], MM1
+ MOVQ MM1, MM2
+ ADD ESI, 16
+ DEC ECX
+ JNZ L3
+ EMMS</pre><p>
+This unrolled loop takes 6 clocks per iteration for adding 16 bytes.
+The <kbd>PADDB</kbd> instructions are not paired. The two threads are
+interleaved to avoid a store stall.
+<p>
+Using the MMX instructions has a high penalty if you are using floating point
+instructions shortly afterwards, so there may still be situations where you
+want to use 32 bit registers as in example 1.9.
+<p>
+<h4>Loops with floating point operations (PPlain and PMMX)</h4><p>
+The methods of optimizing floating point loops are basically the same as for integer loops,
+although the floating point instructions are overlapping rather than pairing.
+<p>
+Consider the C language code:
+<pre> int i, n; double * X; double * Y; double DA;
+ for (i=0; i<n; i++) Y[i] = Y[i] - DA * X[i];</pre><p>
+This piece of code (called DAXPY) has been studied extensively because it is the key to
+solving linear equations.
+<p>
+<h4>Example 1.13:</h4><p>
+<pre>DSIZE = 8 ; data size
+ MOV EAX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ XOR ECX, ECX
+ LEA ESI, [ESI+DSIZE*EAX] ; point to end of X
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+DSIZE*EAX] ; point to end of Y
+ JZ SHORT L3 ; test for N = 0
+ FLD DSIZE PTR [DA]
+ FMUL DSIZE PTR [ESI+DSIZE*ECX] ; DA * X[0]
+ JMP SHORT L2 ; jump into loop
+L1: FLD DSIZE PTR [DA]
+ FMUL DSIZE PTR [ESI+DSIZE*ECX] ; DA * X[i]
+ FXCH ; get old result
+ FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE] ; store Y[i]
+L2: FSUBR DSIZE PTR [EDI+DSIZE*ECX] ; subtract from Y[i]
+ INC ECX ; increment index
+ JNZ L1 ; loop
+ FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE] ; store last result
+L3:</pre><p>
+Here we are using the same methods as in example 1.6: Using the loop counter as index
+register and counting through negative values up to zero. The end of one operation
+overlaps with the beginning of the next.
+<p>
+The interleaving of floating point operations work perfectly here:
+The 2 clock stall between <kbd>FMUL</kbd> and <kbd>FSUBR</kbd> is filled
+with the <kbd>FSTP</kbd> of the previous result. The 3 clock stall between
+<kbd>FSUBR</kbd> and <kbd>FSTP</kbd> is filled with the loop overhead and the
+first two instructions of the next operation. An AGI stall has been avoided
+by reading the only parameter that doesn't depend on the index in the first clock cycle after the index has been incremented.
+<p>
+This solution takes 6 clock cycles per operation, which is better than the
+unrolled solution published by Intel!
+<p>
+<h4>Unrolling floating point loops (PPlain and PMMX)</h4><p>
+<a name="unrollby3">The DAXPY loop unrolled by 3 is quite complicated:</a>
+<h4>Example 1.14:</h4><p>
+<pre>DSIZE = 8 ; data size
+IF DSIZE EQ 4
+SHIFTCOUNT = 2
+ELSE
+SHIFTCOUNT = 3
+ENDIF
+
+ MOV EAX, [N] ; number of elements
+ MOV ECX, 3*DSIZE ; counter bias
+ SHL EAX, SHIFTCOUNT ; DSIZE*N
+ JZ L4 ; N = 0
+ MOV ESI, [X] ; pointer to X
+ SUB ECX, EAX ; (3-N)*DSIZE
+ MOV EDI, [Y] ; pointer to Y
+ SUB ESI, ECX ; end of pointer - bias
+ SUB EDI, ECX
+ TEST ECX, ECX
+ FLD DSIZE PTR [ESI+ECX] ; first X
+ JNS SHORT L2 ; less than 4 operations
+L1: ; main loop
+ FMUL DSIZE PTR [DA]
+ FLD DSIZE PTR [ESI+ECX+DSIZE]
+ FMUL DSIZE PTR [DA]
+ FXCH
+ FSUBR DSIZE PTR [EDI+ECX]
+ FXCH
+ FLD DSIZE PTR [ESI+ECX+2*DSIZE]
+ FMUL DSIZE PTR [DA]
+ FXCH
+ FSUBR DSIZE PTR [EDI+ECX+DSIZE]
+ FXCH ST(2)
+ FSTP DSIZE PTR [EDI+ECX]
+ FSUBR DSIZE PTR [EDI+ECX+2*DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+ECX+DSIZE]
+ FLD DSIZE PTR [ESI+ECX+3*DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+ECX+2*DSIZE]
+ ADD ECX, 3*DSIZE
+ JS L1 ; loop
+L2: FMUL DSIZE PTR [DA] ; finish leftover operation
+ FSUBR DSIZE PTR [EDI+ECX]
+ SUB ECX, 2*DSIZE ; change pointer bias
+ JZ SHORT L3 ; finished
+ FLD DSIZE PTR [DA] ; start next operation
+ FMUL DSIZE PTR [ESI+ECX+3*DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+ECX+2*DSIZE]
+ FSUBR DSIZE PTR [EDI+ECX+3*DSIZE]
+ ADD ECX, 1*DSIZE
+ JZ SHORT L3 ; finished
+ FLD DSIZE PTR [DA]
+ FMUL DSIZE PTR [ESI+ECX+3*DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+ECX+2*DSIZE]
+ FSUBR DSIZE PTR [EDI+ECX+3*DSIZE]
+ ADD ECX, 1*DSIZE
+L3: FSTP DSIZE PTR [EDI+ECX+2*DSIZE]
+L4:</pre><p>
+The reason why I am showing you how to unroll a loop by 3 is not to recommend
+it, but to warn you how difficult it is! Be prepared to spend a considerable amount of time debugging
+and verifying your code when doing something like this. There are several problems to take
+care of: In most cases, you cannot remove all stalls from a floating point loop unrolled by
+less than 4 unless you convolute it (i.e. there are unfinished operations at the end of each
+run which are being finished in the next run). The last <kbd>FLD</kbd> in the main loop above is the
+beginning of the first operation in the next run. It would be tempting here to make a solution
+which reads past the end of the array and then discards the extra value in the end, as in
+example 1.9 and 1.10, but that is not recommended in floating point loops because the
+reading of the extra value might generate a denormal operand exception in case the
+memory position after the array doesn't contain a valid floating point number. To avoid this,
+we have to do at least one more operation after the main loop.
+<p>
+The number of operations to do outside an unrolled loop would normally be N MODULO R,
+where N is the number of operations, and R is the unrolling factor. But in the case of a
+convoluted loop, we have to do one more, i.e. (N-1) MODULO R + 1, for the
+abovementioned reason.
+<p>
+Normally, we would prefer to do the extra operations before the main loop, but here we have
+to do them afterwards for two reasons: One reason is to take care of the leftover operand
+from the convolution. The other reason is that calculating the number of extra operations
+requires a division if R is not a power of 2, and a division is time consuming. Doing the extra
+operations after the loop saves the division.
+<p>
+The next problem is to calculate how to bias the loop counter so that it will change sign at
+the right time, and adjust the base pointers so as to compensate for this bias. Finally, you
+have to make sure the leftover operand from the convolution is handled correctly for all
+values of N.
+<p>
+The epilog code doing 1-3 operations could have been implemented as a separate loop, but
+that would cost an extra branch misprediction, so the solution above is faster.
+<p>Now that I have scared you by demonstrating how difficult it is to unroll by 3, I will show you
+that it is much easier to unroll by 4:
+<p>
+<h4>Example 1.15:</h4><p>
+<pre>DSIZE = 8 ; data size
+ MOV EAX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ XOR ECX, ECX
+ LEA ESI, [ESI+DSIZE*EAX] ; point to end of X
+ SUB ECX, EAX ; -N
+ LEA EDI, [EDI+DSIZE*EAX] ; point to end of Y
+ TEST AL,1 ; test if N is odd
+ JZ SHORT L1
+ FLD DSIZE PTR [DA] ; do the odd operation
+ FMUL DSIZE PTR [ESI+DSIZE*ECX]
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX]
+ INC ECX ; adjust counter
+ FSTP DSIZE PTR [EDI+DSIZE*ECX-DSIZE]
+L1: TEST AL,2 ; test for possibly 2 more operations
+ JZ L2
+ FLD DSIZE PTR [DA] ; N MOD 4 = 2 or 3. Do two more
+ FMUL DSIZE PTR [ESI+DSIZE*ECX]
+ FLD DSIZE PTR [DA]
+ FMUL DSIZE PTR [ESI+DSIZE*ECX+DSIZE]
+ FXCH
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX]
+ FXCH
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX+DSIZE]
+ FXCH
+ FSTP DSIZE PTR [EDI+DSIZE*ECX]
+ FSTP DSIZE PTR [EDI+DSIZE*ECX+DSIZE]
+ ADD ECX, 2 ; counter is now divisible by 4
+L2: TEST ECX, ECX
+ JZ L4 ; no more operations
+L3: ; main loop:
+ FLD DSIZE PTR [DA]
+ FLD DSIZE PTR [ESI+DSIZE*ECX]
+ FMUL ST,ST(1)
+ FLD DSIZE PTR [ESI+DSIZE*ECX+DSIZE]
+ FMUL ST,ST(2)
+ FLD DSIZE PTR [ESI+DSIZE*ECX+2*DSIZE]
+ FMUL ST,ST(3)
+ FXCH ST(2)
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX]
+ FXCH ST(3)
+ FMUL DSIZE PTR [ESI+DSIZE*ECX+3*DSIZE]
+ FXCH
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX+DSIZE]
+ FXCH ST(2)
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX+2*DSIZE]
+ FXCH
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX+3*DSIZE]
+ FXCH ST(3)
+ FSTP DSIZE PTR [EDI+DSIZE*ECX]
+ FSTP DSIZE PTR [EDI+DSIZE*ECX+2*DSIZE]
+ FSTP DSIZE PTR [EDI+DSIZE*ECX+DSIZE]
+ FSTP DSIZE PTR [EDI+DSIZE*ECX+3*DSIZE]
+ ADD ECX, 4 ; increment index by 4
+ JNZ L3 ; loop
+L4:</pre>
+<p>
+It is usually quite easy to find a stall-free solution when unrolling by 4, and there is no need
+for convolution. The number of extra operations to do outside the main loop is N MODULO
+4, which can be calculated easily without division, simply by testing the two lowest bits in N.
+The extra operations are done before the main loop rather than after, to make the handling
+of the loop counter simpler.
+<p>
+The tradeoff of loop unrolling is that the extra operations outside the loop are slower due to
+incomplete overlapping and possible branch mispredictions, and the first time penalty is
+higher because of increased code size.
+<p>
+As a general recommendation, I would say that if N is big or if convoluting the loop without
+unrolling cannot remove enough stalls, then you should unroll critical integer loops by 2 and
+floating point loops by 4.
+<p>
+<h3><a name="25_2">25.2 Loops in PPro, PII and PIII</a></h3><p>
+In the previous chapter (<a href="#25_1">25.1</a>) I explained how to use convolution and loop unrolling in order
+to improve pairing in PPlain and PMMX. On the PPro, PII and PIII there is no reason to do this
+thanks to the out-of-order execution mechanism. But there are other quite difficult problems
+to take care of, most importantly ifetch boundaries and register read stalls.
+<p>
+I have chosen the same example as in chapter <a href="#25_1">25.1</a>
+for the previous microprocessors: a procedure which reads integers from an
+array, changes the sign of each integer, and stores the results in another array.
+<p>
+A C language code for this procedure would be:
+<pre>void ChangeSign (int * A, int * B, int N) {
+ int i;
+ for (i=0; i<N; i++) B[i] = -A[i];}</pre><p>
+Translating to assembly, we might write the procedure like this:
+<h4>Example 2.1:</h4><p>
+<pre>_ChangeSign PROC NEAR
+ PUSH ESI
+ PUSH EDI
+A EQU DWORD PTR [ESP+12]
+B EQU DWORD PTR [ESP+16]
+N EQU DWORD PTR [ESP+20]
+
+ MOV ECX, [N]
+ JECXZ L2
+ MOV ESI, [A]
+ MOV EDI, [B]
+ CLD
+L1: LODSD
+ NEG EAX
+ STOSD
+ LOOP L1
+L2: POP EDI
+ POP ESI
+ RET
+_ChangeSign ENDP</pre><p>
+This looks like a nice solution, but it is not optimal because it uses the non-optimal
+instructions <kbd>LOOP, LODSD</kbd> and <kbd>STOSD</kbd> that generate many uops.
+It takes 6-7 clock cycles per iteration if all data are in the level one cache.
+Avoiding these instructions we get:
+<h4>Example 2.2:</h4><p>
+<pre> MOV ECX, [N]
+ JECXZ L2
+ MOV ESI, [A]
+ MOV EDI, [B]
+ALIGN 16
+L1: MOV EAX, [ESI] ; len=2, p2rESIwEAX
+ ADD ESI, 4 ; len=3, p01rwESIwF
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI], EAX ; len=2, p4rEAX, p3rEDI
+ ADD EDI, 4 ; len=3, p01rwEDIwF
+ DEC ECX ; len=1, p01rwECXwF
+ JNZ L1 ; len=2, p1rF
+L2:</pre><p>
+The comments are interpreted as follows: the <kbd>MOV EAX,[ESI]</kbd>
+instruction is 2 bytes long, it generates one uop for port 2 that reads
+<kbd>ESI</kbd> and writes to (renames) <kbd>EAX</kbd>. This
+information is needed for analyzing the possible bottlenecks.
+<p>
+Let's first analyze the instruction decoding (chapter <a href="#14">14</a>): One of the
+instructions generates 2 uops (<kbd>MOV [EDI],EAX</kbd>).
+This instruction must go into decoder D0. There are three
+decode groups in the loop so it can decode in 3 clock cycles.
+<p>
+Next, let's look at the instruction fetch (chapter <a href="#15">15</a>): If an ifetch boundary prevents the first
+three instructions from decoding together then there will be three decode groups in the last
+ifetch block so that the next iteration will have the ifetch block starting at the first instruction
+where we want it, and we will get a delay only in the first iteration. A worse situation would
+be a 16-byte boundary and an ifetch boundary in one of the last three instructions.
+According to the <a href="#ifetchtable">ifetch table</a>, this will generate a delay of 1 clock and cause the next
+iteration to have its first ifetch block aligned by 16, so that the problem continues through all
+iterations. The result is a fetch time of 4 clocks per iteration rather than 3. There are two
+ways to prevent this situation: the first method is to control where the ifetch blocks lie on the
+first iteration; the second method is to control where the 16-byte boundaries are. The latter
+method is the easiest. Since the entire loop has only 15 bytes of code you can avoid any
+16-byte boundary by aligning the loop entry by 16, as shown above. This will put the entire
+loop into a single ifetch block so that no further analysis of instruction fetching is needed.
+<p>
+The third problem to look at is register read stalls (chapter <a href="#16">16</a>). No register is read in this
+loop without being written to at least a few clock cycles before, so there can be no register
+read stalls.
+<p>
+The fourth analysis is execution (chapter <a href="#17">17</a>). Counting the uops for the different ports we
+get:<br>
+port 0 or 1: 4 uops<br>
+port 1 only: 1 uop<br>
+port 2: 1 uop<br>
+port 3: 1 uop<br>
+port 4: 1 uop<br>
+Assuming that the uops that can go to either port 0 or 1 are distributed optimally, the
+execution time will be 2.5 clocks per iteration.
+<p>
+The last analysis is retirement (chapter <a href="#18">18</a>). Since the number of uops in the loop is not
+divisible by 3, the retirement slots will not be used optimally when the jump has to retire in
+the first slot. The time needed for retirement is the number of uops divided by 3, and
+rounded up to nearest integer. This gives 3 clocks for retirement.
+<p>
+In conclusion, the loop above can execute in 3 clocks per iteration if the loop entry is
+aligned by 16. I am assuming that the conditional jump is predicted every time except on the
+exit of the loop (chapter <a href="#22_2">22.2</a>).
+<p>
+<h4>Using the same register for counter and index and letting the counter end at zero (PPro, PII and PIII)</h4>
+<h4><a name="2-3">Example 2.3:</a></h4><p>
+<pre> MOV ECX, [N]
+ MOV ESI, [A]
+ MOV EDI, [B]
+ LEA ESI, [ESI+4*ECX] ; point to end of array A
+ LEA EDI, [EDI+4*ECX] ; point to end of array B
+ NEG ECX ; -N
+ JZ SHORT L2
+ALIGN 16
+L1: MOV EAX, [ESI+4*ECX] ; len=3, p2rESIrECXwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+4*ECX], EAX ; len=3, p4rEAX, p3rEDIrECX
+ INC ECX ; len=1, p01rwECXwF
+ JNZ L1 ; len=2, p1rF
+L2:</pre><p>
+Here we have reduced the number of uops to 6 by using the same register as counter and
+index. The base pointers point to the end of the arrays so that the index can count up
+through negative values to zero.
+<p>
+Decoding: There are two decode groups in the loop so it will decode in 2 clocks.
+<p>
+Instruction fetch: A loop always takes at least one clock cycle more than the the number of
+16 byte blocks. Since there are only 11 bytes of code in the loop it is possible to have it all
+in one ifetch block. By aligning the loop entry by 16 we can make sure that we don't get
+more than one 16-byte block so that it is possible to fetch in 2 clocks.
+<p>
+Register read stalls: The <kbd>ESI</kbd> and <kbd>EDI</kbd> registers are read, but not modified inside the loop.
+They will therefore be counted as permanent register reads, but not in the same triplet.
+Register <kbd>EAX, ECX</kbd>, and flags are modified inside the loop and read
+before they are written back so they will cause no permanent register reads.
+The conclusion is that there are no register read stalls.
+<p>
+Execution:<br>
+port 0 or 1: 2 uops<br>
+port 1: 1 uop<br>
+port 2: 1 uop<br>
+port 3: 1 uop<br>
+port 4: 1 uop<br>
+Execution time: 1.5 clocks.
+<p>
+Retirement:<br>
+6 uops = 2 clocks.
+<p>
+Conclusion: this loop takes only 2 clock cycles per iteration.
+<p>
+If you use absolute addresses instead of <kbd>ESI</kbd> and <kbd>EDI</kbd> then the loop will take 3 clocks
+because it cannot be contained in a single 16-byte block.
+<p>
+<h4>Unrolling a loop (PPro, PII and PIII)</h4><p>
+Doing more than one operation in each run and doing correspondingly fewer runs is called
+loop unrolling. In previous processors you would unroll loops to get parallel execution by
+pairing (chapter <a href="#25_1">25.1</a>). In PPro, PII and PIII this is not needed because the out-of-order
+execution mechanism takes care of that. There is no need to use two different registers
+either, because register renaming takes care of this. The purpose of unrolling here is to
+reduce the loop overhead per iteration.
+<p>
+The following example is the same as example 2.2 , but unrolled by 2, which means that
+you do two operations per iteration and half as many iterations
+<h4>Example 2.4:</h4><p>
+<pre> MOV ECX, [N]
+ MOV ESI, [A]
+ MOV EDI, [B]
+ SHR ECX, 1 ; N/2
+ JNC SHORT L1 ; test if N was odd
+ MOV EAX, [ESI] ; do the odd one first
+ ADD ESI, 4
+ NEG EAX
+ MOV [EDI], EAX
+ ADD EDI, 4
+L1: JECXZ L3
+
+ALIGN 16
+L2: MOV EAX, [ESI] ; len=2, p2rESIwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI], EAX ; len=2, p4rEAX, p3rEDI
+ MOV EAX, [ESI+4] ; len=3, p2rESIwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+4], EAX ; len=3, p4rEAX, p3rEDI
+ ADD ESI, 8 ; len=3, p01rwESIwF
+ ADD EDI, 8 ; len=3, p01rwEDIwF
+ DEC ECX ; len=1, p01rwECXwF
+ JNZ L2 ; len=2, p1rF
+L3:</pre><p>
+In example 2.2 the loop overhead (i.e. adjusting pointers and counter, and jumping back)
+was 4 uops and the 'real job' was 4 uops. When unrolling the loop by two you do the 'real
+job' twice and the overhead once, so you get 12 uops in all. This reduces the overhead from
+50% to 33% of the uops. Since the unrolled loop can do only an even number of operations
+you have to check if N is odd and if so do one operation outside the loop.
+<p>
+Analyzing instruction fetching in this loop we find that a new ifetch block begins in the
+<kbd>ADD ESI,8</kbd> instruction, forcing it into decoder D0. This makes the loop decode in 5 clock cycles
+and not 4 as we wanted. We can solve this problem by coding the preceding instruction in a
+longer version. Change <kbd>MOV [EDI+4],EAX </kbd> to:
+<pre> MOV [EDI+9999],EAX ; make instruction with long displacement
+ ORG $-4
+ DD 4 ; rewrite displacement to 4</pre><p>
+This will force a new ifetch block to begin at the long <kbd>MOV [EDI+4],EAX</kbd>
+instruction, so that decoding time is now down at 4 clocks. The rest of the
+pipeline can handle 3 uops per clock so that the expected execution time is 4
+clocks per iteration, or 2 clocks per operation.
+<p>
+Testing this solution shows that it actually takes a little more. My measurements showed
+approximately 4.5 clocks per iteration. This is probably due to a sub-optimal reordering of
+the uops. Possibly, the ROB doesn't find the optimal execution-order for the uops but
+submits them in a less than optimal order. This problem was not predicted, and only testing
+can reveal such a problem. We may help the ROB by doing some of the reordering
+manually:
+<h4>Example 2.5:</h4><p>
+<pre>ALIGN 16
+L2: MOV EAX, [ESI] ; len=2, p2rESIwEAX
+ MOV EBX, [ESI+4] ; len=3, p2rESIwEBX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI], EAX ; len=2, p4rEAX, p3rEDI
+ ADD ESI, 8 ; len=3, p01rwESIwF
+ NEG EBX ; len=2, p01rwEBXwF
+ MOV [EDI+4], EBX ; len=3, p4rEBX, p3rEDI
+ ADD EDI, 8 ; len=3, p01rwEDIwF
+ DEC ECX ; len=1, p01rwECXwF
+ JNZ L2 ; len=2, p1rF
+L3:</pre><p>
+The loop now executes in 4 clocks per iteration. This solution also solves the problem with
+instruction fetch blocks. The cost is that we need an extra register because we cannot take
+advantage of register renaming.
+<p>
+<h4>Rolling out by more than 2</h4><p>
+Loop unrolling is recommended when the loop overhead constitutes a high proportion of the
+total execution time. In example 2.3 the overhead is only 2 uops, so the gain by unrolling is
+little, but I will show you how to unroll it anyway, just for the exercise.
+<p>
+The 'real job' is 4 uops and the overhead 2. Unrolling by two we get 2*4+2 = 10 uops. The
+retirement time will be 10/3, rounded up to an integer, that is 4 clock cycles. This calculation
+shows that nothing is gained by unrolling this by two. Unrolling by four we get:
+<h4>Example 2.6:</h4><p>
+<pre> MOV ECX, [N]
+ SHL ECX, 2 ; number of bytes to handle
+ MOV ESI, [A]
+ MOV EDI, [B]
+ ADD ESI, ECX ; point to end of array A
+ ADD EDI, ECX ; point to end of array B
+ NEG ECX ; -4*N
+ TEST ECX, 4 ; test if N is odd
+ JZ SHORT L1
+ MOV EAX, [ESI+ECX] ; N is odd. do the odd one
+ NEG EAX
+ MOV [EDI+ECX], EAX
+ ADD ECX, 4
+L1: TEST ECX, 8 ; test if N/2 is odd
+ JZ SHORT L2
+ MOV EAX, [ESI+ECX] ; N/2 is odd. do two extra
+ NEG EAX
+ MOV [EDI+ECX], EAX
+ MOV EAX, [ESI+ECX+4]
+ NEG EAX
+ MOV [EDI+ECX+4], EAX
+ ADD ECX, 8
+L2: JECXZ SHORT L4
+
+ALIGN 16
+L3: MOV EAX, [ESI+ECX] ; len=3, p2rESIrECXwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+ECX], EAX ; len=3, p4rEAX, p3rEDIrECX
+ MOV EAX, [ESI+ECX+4] ; len=4, p2rESIrECXwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+ECX+4], EAX ; len=4, p4rEAX, p3rEDIrECX
+ MOV EAX, [ESI+ECX+8] ; len=4, p2rESIrECXwEAX
+ MOV EBX, [ESI+ECX+12] ; len=4, p2rESIrECXwEAX
+ NEG EAX ; len=2, p01rwEAXwF
+ MOV [EDI+ECX+8], EAX ; len=4, p4rEAX, p3rEDIrECX
+ NEG EBX ; len=2, p01rwEAXwF
+ MOV [EDI+ECX+12], EBX ; len=4, p4rEAX, p3rEDIrECX
+ ADD ECX, 16 ; len=3, p01rwECXwF
+ JS L3 ; len=2, p1rF
+L4:</pre><p>
+The ifetch blocks are where we want them. Decode time is 6 clocks.
+<p>
+Register read stalls is a problem here because <kbd>ECX</kbd> has retired near the end of the loop
+and we need to read both <kbd>ESI, EDI,</kbd> and <kbd>ECX</kbd>. The instructions have been reordered in
+order to avoid reading ESI near the bottom so that we can avoid a register read stall. In
+other words, the reason for reordering instructions and use an extra register (<kbd>EBX</kbd>) is not the
+same as in the previous example.
+<p>
+There are 12 uops and the loop executes in 6 clocks per iteration, or 1.5 clocks per
+operation.
+<p>
+It may be tempting to unroll loops by a high factor in order to get the maximum speed. But
+since the loop overhead in most cases can be reduced to something like one clock cycle
+per iteration then unrolling the loop by 4 rather than by 2 would save only 1/4 clock cycle
+per operation which is hardly worth the effort. Only if the loop overhead is high compared to
+the rest of the loop and N is very big should you think of unrolling by 4. Unrolling by more
+than 4 does not make sense.
+<p>
+The drawbacks of excessive loop unrolling are:
+<ol>
+<li>You need to calculate N MODULO R, where R is the unrolling factor, and do N
+MODULO R operations before or after the main loop in order to make the remaining
+number of operations divisible by R. This takes a lot of extra code and poorly predictable
+branches. And the loop body of course also becomes bigger.
+<li>A Piece of code usually takes much more time the first time it executes, and the penalty
+of first time execution is bigger the more code you have, especially if N is small.
+<li>Excessive code size makes the utilization of the code cache less effective.
+</ol>
+<p>
+Using an unrolling factor which is not a power of 2 makes the calculation of N MODULO R
+quite difficult, and is generally not recommended unless N is known to be divisible by R.
+<a href="#unrollby3">Example 1.14</a> shows how to unroll by 3.
+<p>
+<h4>Handling multiple 8 or 16 bit operands simultaneously in 32 bit registers (PPro, PII and PIII)</h4><p>
+It is sometimes possible to handle four bytes at a time in the same 32 bit register. The
+following example adds 2 to all elements of an array of bytes:
+<h4><a name="2-7">Example 2.7:</a></h4><p>
+<pre> MOV ESI, [A] ; address of byte array
+ MOV ECX, [N] ; number of elements in byte array
+ JECXZ L2
+ALIGN 16
+ DB 7 DUP (90H) ; 7 NOP's for controlling alignment
+
+ L1: MOV EAX, [ESI] ; read four bytes
+ MOV EBX, EAX ; copy into EBX
+ AND EAX, 7F7F7F7FH ; get lower 7 bits of each byte in EAX
+ XOR EBX, EAX ; get the highest bit of each byte
+ ADD EAX, 02020202H ; add desired value to all four bytes
+ XOR EBX, EAX ; combine bits again
+ MOV [ESI], EBX ; store result
+ ADD ESI, 4 ; increment pointer
+ SUB ECX, 4 ; decrement loop counter
+ JA L1 ; loop
+L2:</pre><p>
+Note that I have masked out the highest bit of each byte to avoid a possible carry from each
+byte into the next one when adding. I am using <kbd>XOR</kbd> rather than
+<kbd>ADD</kbd> when putting in the high bit again to avoid carry.
+The array should of course be aligned by 4.
+<p>
+This loop should ideally take 4 clocks per iteration, but it takes somewhat
+more due to the dependency chain and difficult reordering. On PII and PIII
+you can do the same more effectively using MMX registers.
+<p>
+The next example finds the length of a zero-terminated string by searching for the first byte
+of zero. It is much faster than using <kbd>REPNE SCASB</kbd>:
+<h4><a name="2-8">Example 2.8:</a></h4><p>
+<pre>_strlen PROC NEAR
+ PUSH EBX
+ MOV EAX,[ESP+8] ; get pointer to string
+ LEA EDX,[EAX+3] ; pointer+3 used in the end
+L1: MOV EBX,[EAX] ; read first 4 bytes
+ ADD EAX,4 ; increment pointer
+ LEA ECX,[EBX-01010101H] ; subtract 1 from each byte
+ NOT EBX ; invert all bytes
+ AND ECX,EBX ; and these two
+ AND ECX,80808080H ; test all sign bits
+ JZ L1 ; no zero bytes, continue loop
+ MOV EBX,ECX
+ SHR EBX,16
+ TEST ECX,00008080H ; test first two bytes
+ CMOVZ ECX,EBX ; shift right if not in the first 2 bytes
+ LEA EBX,[EAX+2]
+ CMOVZ EAX,EBX
+ SHL CL,1 ; use carry flag to avoid branch
+ SBB EAX,EDX ; compute length
+ POP EBX
+ RET
+_strlen ENDP</pre><p>
+This loop takes 3 clocks for each iteration testing 4 bytes. The string should of course be
+aligned by 4. The code may read past the end of the string, so the string should not be
+placed at the end of a segment.
+<p>
+Handling 4 bytes simultaneously can be quite difficult. This code uses a formula which
+generates a nonzero value for a byte if, and only if, the byte is zero. This makes it possible
+to test all four bytes in one operation. This algorithm involves the subtraction of 1 from all
+bytes (in the <kbd>LEA ECX</kbd> instruction). I have not masked out the highest bit of each byte
+before subtracting, as I did in example <a href="#2-7">2.7</a>, so the subtraction may generate a borrow to the
+next byte, but only if it is zero, and this is exactly the situation where we don't care what the
+next byte is, because we are searching forwards for the first zero. If we were searching
+backwards then we would have to re-read the dword after detecting a zero, and then test all
+four bytes to find the last zero, or use <kbd>BSWAP</kbd> to reverse the order of the bytes. If you want
+to search for a byte value other than zero, then you may <kbd>XOR</kbd> all four bytes with the value
+you are searching for, and then use the method above to search for zero.
+<p>
+<h4>Loops with MMX instructions (PII and PIII)</h4><p>
+Using MMX instructions we can compare 8 bytes in one operation:
+<h4><a name="2-9">Example 2.9:</a></h4><p>
+<pre>_strlen PROC NEAR
+ PUSH EBX
+ MOV EAX,[ESP+8]
+ LEA EDX,[EAX+7]
+ PXOR MM0,MM0
+L1: MOVQ MM1,[EAX] ; len=3 p2rEAXwMM1
+ ADD EAX,8 ; len=3 p01rEAX
+ PCMPEQB MM1,MM0 ; len=3 p01rMM0rMM1
+ MOVD EBX,MM1 ; len=3 p01rMM1wEBX
+ PSRLQ MM1,32 ; len=4 p1rMM1
+ MOVD ECX,MM1 ; len=3 p01rMM1wECX
+ OR ECX,EBX ; len=2 p01rECXrEBXwF
+ JZ L1 ; len=2 p1rF
+ MOVD ECX,MM1
+ TEST EBX,EBX
+ CMOVZ EBX,ECX
+ LEA ECX,[EAX+4]
+ CMOVZ EAX,ECX
+ MOV ECX,EBX
+ SHR ECX,16
+ TEST BX,BX
+ CMOVZ EBX,ECX
+ LEA ECX,[EAX+2]
+ CMOVZ EAX,ECX
+ SHR BL,1
+ SBB EAX,EDX
+ EMMS
+ POP EBX
+ RET
+_strlen ENDP</pre><p>
+This loop has 7 uops for port 0 and 1 which gives an average execution time of 3.5 clocks
+per iteration. The measured time is 3.8 clocks which shows that the ROB handles the
+situation reasonably well despite a dependency chain that is 6 uops long. Testing 8 bytes in
+less than 4 clocks is incredibly much faster than <kbd>REPNE SCASB</kbd>.
+<p>
+<h4>Loops with floating point instructions (PPro, PII and PIII)</h4><p>
+The methods for optimizing floating point loops are basically the same as for integer loops,
+but you should be more aware of dependency chains because of the long latencies of
+instruction execution.
+<p>
+Consider the C language code:
+<pre> int i, n; double * X; double * Y; double DA;
+ for (i=0; i<n; i++) Y[i] = Y[i] - DA * X[i];</pre><p>
+This piece of code (called DAXPY) has been studied extensively because it is the key to
+solving linear equations.
+<h4>Example 2.10:</h4><p>
+<pre>DSIZE = 8 ; data size (4 or 8)
+ MOV ECX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ JECXZ L2 ; test for N = 0
+ FLD DSIZE PTR [DA] ; load DA outside loop
+ALIGN 16
+ DB 2 DUP (90H) ; 2 NOP's for alignment
+L1: FLD DSIZE PTR [ESI] ; len=3 p2rESIwST0
+ ADD ESI,DSIZE ; len=3 p01rESI
+ FMUL ST,ST(1) ; len=2 p0rST0rST1
+ FSUBR DSIZE PTR [EDI] ; len=3 p2rEDI, p0rST0
+ FSTP DSIZE PTR [EDI] ; len=3 p4rST0, p3rEDI
+ ADD EDI,DSIZE ; len=3 p01rEDI
+ DEC ECX ; len=1 p01rECXwF
+ JNZ L1 ; len=2 p1rF
+ FSTP ST ; discard DA
+L2:</pre><p>
+The dependency chain is 10 clock cycles long, but the loop takes only 4 clocks per iteration
+because it can begin a new operation before the previous one is finished. The purpose of
+the alignment is to prevent a 16-byte boundary in the last ifetch block.
+<p>
+<h4>Example 2.11:</h4><p>
+<pre>DSIZE = 8 ; data size (4 or 8)
+ MOV ECX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ LEA ESI, [ESI+DSIZE*ECX] ; point to end of array
+ LEA EDI, [EDI+DSIZE*ECX] ; point to end of array
+ NEG ECX ; -N
+ JZ SHORT L2 ; test for N = 0
+ FLD DSIZE PTR [DA] ; load DA outside loop
+ALIGN 16
+L1: FLD DSIZE PTR [ESI+DSIZE*ECX] ; len=3 p2rESIrECXwST0
+ FMUL ST,ST(1) ; len=2 p0rST0rST1
+ FSUBR DSIZE PTR [EDI+DSIZE*ECX] ; len=3 p2rEDIrECX, p0rST0
+ FSTP DSIZE PTR [EDI+DSIZE*ECX] ; len=3 p4rST0, p3rEDIrECX
+ INC ECX ; len=1 p01rECXwF
+ JNZ L1 ; len=2 p1rF
+ FSTP ST ; discard DA
+L2:</pre><p>
+Here we have used the same trick as in example <a href="#2-3">2.3</a>. Ideally, this loop should take 3
+clocks, but measurements say approximately 3.5 clocks due to the long dependency chain.
+Unrolling the loop doesn't save much.
+<p>
+<h4>Loops with XMM instructions (PIII)</h4><p>
+The XMM instructions on the PIII allow you to operate on four single precision
+floating point numbers in parallel. The operands must be aligned by 16.
+<p>
+The DAXPY algorithm is not very suited for XMM instructions because the precision
+is poor, it may not be possible to align the operands by 16, and you need some
+extra code if the number of operations is not a multiple of four. I am showing
+the code here anyway, just to give an example of a loop with XMM instructions:
+<h4>Example 2.12:</h4><p>
+<pre> MOV ECX, [N] ; number of elements
+ MOV ESI, [X] ; pointer to X
+ MOV EDI, [Y] ; pointer to Y
+ SHL ECX, 2
+ ADD ESI, ECX ; point to end of X
+ ADD EDI, ECX ; point to end of Y
+ NEG ECX ; -4*N
+ MOV EAX, [DA] ; load DA outside loop
+ XOR EAX, 80000000H ; change sign of DA
+ PUSH EAX
+ MOVSS XMM1, [ESP] ; -DA
+ ADD ESP, 4
+ SHUFPS XMM1, XMM1, 0 ; copy -DA to all four positions
+ CMP ECX, -16
+ JG L2
+L1: MOVAPS XMM0, [ESI+ECX] ; len=4 2*p2rESIrECXwXMM0
+ ADD ECX, 16 ; len=3 p01rwECXwF
+ MULPS XMM0, XMM1 ; len=3 2*p0rXMM0rXMM1
+ CMP ECX, -16 ; len=3 p01rECXwF
+ ADDPS XMM0, [EDI+ECX-16] ; len=5 2*p2rEDIrECX, 2*p1rXMM0
+ MOVAPS [EDI+ECX-16], XMM0 ; len=5 2*p4rXMM0, 2*p3rEDIrECX
+ JNG L1 ; len=2 p1rF
+L2: JECXZ L4 ; check if finished
+ MOVAPS XMM0, [ESI+ECX] ; 1-3 operations missing, do 4 more
+ MULPS XMM0, XMM1
+ ADDPS XMM0, [EDI+ECX]
+ CMP ECX, -8
+ JG L3
+ MOVLPS [EDI+ECX], XMM0 ; store two more results
+ ADD ECX, 8
+ MOVHLPS XMM0, XMM0
+L3: JECXZ L4
+ MOVSS [EDI+ECX], XMM0 ; store one more result
+L4:</pre><p>
+The <kbd>L1</kbd> loop takes 5-6 clocks for 4 operations.
+The <kbd>ECX</kbd> instructions have been placed before and after the
+<kbd>MULPS XMM0, XMM1</kbd> instruction in order to avoid a register read port stall
+generated by the reading of the two parts of the <kbd>XMM1</kbd> register
+together with <kbd>ESI</kbd> or <kbd>EDI</kbd> in the RAT. The extra code after
+<kbd>L2</kbd> takes care of the situation where N is not divisible by 4.
+Note that this code may read past the end of A and B. This may delay the last
+operation if the extra memory positions read do not contain normal floating
+point numbers. If possible, put in some dummy extra data to make the number
+of operations divisible by 4 and leave out the extra code after <kbd>L2</kbd>.
+<p>
+<h2><a name="26">26</a>. Problematic Instructions</h2>
+<h3><a name="26_1">26.1 XCHG (all processors)</a></h3><p>
+The <kbd>XCHG register,[memory]</kbd> instruction is dangerous. By default this instruction has
+an implicit <kbd>LOCK</kbd> prefix which prevents it from using the cache. This instruction is therefore
+very time consuming, and should always be avoided.
+<p>
+<h3><a name="26_2">26.2 Rotates through carry (all processors)</a></h3><p>
+<kbd>RCR</kbd> and <kbd>RCL</kbd> with a count different from one are slow and should be avoided.
+<p>
+<h3><a name="26_3">26.3 String instructions (all processors)</a></h3><p>
+String instructions without a repeat prefix are too slow and should be replaced by simpler
+instructions. The same applies to <kbd>LOOP</kbd> on all processors and to
+<kbd>JECXZ</kbd> on PPlain and PMMX.
+<p>
+<kbd>REP MOVSD</kbd> and <kbd>REP STOSD</kbd> are quite fast if the repeat
+count is not too small. Always use the DWORD version if possible, and make
+sure that both source and destination are aligned by 8.
+<p>
+Some other methods of moving data are faster under certain conditions. See
+chapter <a href="#27_8">27.8</a> for details.
+<p>
+Note that while the <kbd>REP MOVS</kbd> instruction writes a word to the destination, it reads the next
+word from the source in the same clock cycle. You can have a cache bank conflict if bit 2-4
+are the same in these two addresses. In other words, you will get a penalty of one clock
+extra per iteration if <kbd>ESI+(wordsize)-EDI</kbd> is divisible by 32. The easiest way to avoid
+cache bank conflicts is to use the DWORD version and align both source and destination by
+8. Never use <kbd>MOVSB</kbd> or <kbd>MOVSW</kbd> in optimized code, not even in 16 bit mode.
+<p>
+<kbd>REP MOVS</kbd> and <kbd>REP STOS</kbd> can perform very fast by moving an entire cache line at a time
+on PPro, PII and PIII. This happens only when the following conditions are met:
+<ul>
+<li>both source and destination must be aligned by 8
+<li>direction must be forward (direction flag cleared)
+<li>the count (<kbd>ECX</kbd>) must be greater than or equal to 64
+<li>the difference between <kbd>EDI</kbd> and <kbd>ESI</kbd> must be numerically greater than or equal to 32
+<li>the memory type for both source and destination must be either writeback or
+write-combining (you can normally assume this).
+</ul><p>
+Under these conditions the number of uops issued is approximately 215+2*<kbd>ECX</kbd> for
+<kbd>REP MOVSD</kbd> and 185+1.5*<kbd>ECX</kbd> for <kbd>REP STOSD,</kbd>
+giving a speed of approximately 5 bytes per
+clock cycle for both instructions, which is almost 3 times as fast as when the above
+conditions are not met.
+<p>
+The byte and word versions also benefit from this fast mode, but they are less effective than
+the dword versions.
+<p>
+<kbd>REP STOSD</kbd> is optimal under the same conditions as <kbd>REP MOVSD</kbd>.
+<p>
+<kbd>REP LOADS, REP SCAS,</kbd> and <kbd>REP CMPS</kbd> are not optimal, and
+may be replaced by loops. See example <a href="#1-10">1.10</a>, <a href="#2-8">2.8</a>
+and <a href="#2-9">2.9</a> for alternatives to <kbd>REPNE SCASB. REP CMPS</kbd>
+may suffer cache bank conflicts if bit 2-4 are the same in <kbd>ESI</kbd> and
+<kbd>EDI</kbd>.
+<p>
+<h3><a name="26_4">26.4 Bit test (all processors)</a></h3><p>
+<kbd>BT, BTC, BTR</kbd>, and <kbd>BTS</kbd> instructions should preferably be replaced by instructions like
+<kbd>TEST, AND, OR, XOR</kbd>, or shifts on PPlain and PMMX. On PPro, PII and PIII, bit tests with a
+memory operand should be avoided.
+<p>
+<h3><a name="26_5">26.5 Integer multiplication (all processors)</a></h3><p>
+An integer multiplication takes approximately 9 clock cycles on PPlain and PMMX and 4 on
+PPro, PII and PIII. It is therefore often advantageous to replace a multiplication by a constant
+with a combination of other instructions such as <kbd>SHL, ADD, SUB</kbd>,
+and <kbd>LEA</kbd>. Example:<br>
+<kbd>IMUL EAX,10</kbd><br>
+can be replaced with<br>
+<kbd>MOV EBX,EAX / ADD EAX,EAX / SHL EBX,3 / ADD EAX,EBX</kbd><br>
+or<br>
+<kbd>LEA EAX,[EAX+4*EAX] / ADD EAX,EAX</kbd>
+<p>
+Floating point multiplication is faster than integer multiplication on PPlain and PMMX, but
+the time spent on converting integers to float and converting the product back again is
+usually more than the time saved by using floating point multiplication, except when the
+number of conversions is low compared with the number of multiplications. MMX
+multiplication is fast, but is only available with 16-bit operands.
+<p>
+<h3><a name="26_6">26.6 WAIT instruction (all processors)</a></h3><p>
+You can often increase speed by omitting the <kbd>WAIT</kbd> instruction.
+The <kbd>WAIT</kbd> instruction has three functions:
+<p>
+<u>a.</u> The old 8087 processor requires a <kbd>WAIT</kbd> before every
+floating point instruction to make sure the coprocessor is ready to receive it.
+<p>
+<u>b.</u> <kbd>WAIT</kbd> is used for coordinating memory access between the floating point unit and the
+integer unit. Examples:
+<pre><u>b.1.</u> FISTP [mem32]
+ WAIT ; wait for FPU to write before..
+ MOV EAX,[mem32] ; reading the result with the integer unit
+
+<u>b.2.</u> FILD [mem32]
+ WAIT ; wait for FPU to read value..
+ MOV [mem32],EAX ; before overwriting it with integer unit
+
+<u>b.3.</u> FLD QWORD PTR [ESP]
+ WAIT ; prevent an accidental interrupt from..
+ ADD ESP,8 ; overwriting value on stack</pre>
+<p>
+<u>c.</u> <kbd>WAIT</kbd> is sometimes used to check for exceptions. It will generate an interrupt if an
+unmasked exception bit in the floating point status word has been set by a preceding
+floating point instruction.
+<p>
+<u>Regarding a:</u><br>
+The function in point a is never needed on any other processors than the old 8087. Unless
+you want your code to be compatible with the 8087 you should tell your assembler not to
+put in these <kbd>WAIT</kbd>'s by specifying a higher processor. A 8087 floating point emulator also
+inserts <kbd>WAIT</kbd> instructions. You should therefore tell your assembler not to generate
+emulation code unless you need it.
+<p>
+<u>Regarding b:</u><br>
+<kbd>WAIT</kbd> instructions to coordinate memory access are definitely needed on the 8087 and
+80287 but not on the Pentiums. It is not quite clear whether it is needed on the 80387 and
+80486. I have made several tests on these Intel processors and not been able to provoke
+any error by omitting the <kbd>WAIT</kbd> on any 32 bit Intel processor, although Intel manuals say that
+the <kbd>WAIT</kbd> is needed for this purpose except after <kbd>FNSTSW</kbd>
+ and <kbd>FNSTCW</kbd>. Omitting <kbd>WAIT</kbd>
+instructions for coordinating memory access is not 100 % safe, even when writing 32 bit
+code, because the code may be able to run on the very rare combination of a 80386 main
+processor with a 287 coprocessor, which requires the <kbd>WAIT</kbd>. Also, I have no information on
+non-Intel processors, and I have not tested all possible hardware and software
+combinations, so there may be other situations where the <kbd>WAIT</kbd> is needed.
+<p>
+If you want to be certain that your code will work on any 32 bit processor (including
+non-Intel processors) then I would recommend that you include the <kbd>WAIT</kbd> here in order to be
+safe.
+<p>
+<u>Regarding c:</u><br>
+The assembler automatically inserts a <kbd>WAIT</kbd> for this purpose before the following
+instructions: <kbd>FCLEX, FINIT, FSAVE, FSTCW, FSTENV, FSTSW</kbd>. You can omit the <kbd>WAIT</kbd>
+by writing FNCLEX, etc. My tests show that the WAIT is unneccessary in most cases
+because these instructions without <kbd>WAIT</kbd> will still generate an interrupt on exceptions except
+for <kbd>FNCLEX</kbd> and <kbd>FNINIT</kbd> on the 80387. (There is some inconsistency about whether the
+<kbd>IRET</kbd> from the interrupt points to the <kbd>FN..</kbd> instruction or to the next instruction).
+<p>
+Almost all other floating point instructions will also generate an interrupt if a previous floating
+point instruction has set an unmasked exception bit, so the exception is likely to be detected
+sooner or later anyway. You may insert a <kbd>WAIT</kbd> after the last floating point instruction in your
+program to be sure to catch all exceptions.
+<p>
+You may still need the <kbd>WAIT</kbd> if you want to know exactly where an exception occurred in
+order to be able to recover from the situation. Consider, for example, the code under b.3
+above: If you want to be able to recover from an exception generated by the <kbd>FLD</kbd> here, then
+you need the <kbd>WAIT</kbd> because an interrupt after <kbd>ADD ESP,8</kbd> would overwrite the value to load.
+<kbd>FNOP</kbd> may be faster than <kbd>WAIT</kbd> and serve the same purpose.
+<p>
+<h3><a name="26_7">26.7 FCOM + FSTSW AX (all processors)</a></h3><p>
+The <kbd>FNSTSW</kbd> instruction is very slow on all processors. The PPro, PII and PIII
+processors have
+<kbd>FCOMI</kbd> instructions to avoid the slow <kbd>FNSTSW</kbd>.
+Using <kbd>FCOMI</kbd> instead of the common
+sequence <kbd>FCOM / FNSTSW AX / SAHF</kbd> will save you 8 clock cycles. You should
+therefore use <kbd>FCOMI</kbd> to avoid <kbd>FNSTSW</kbd> wherever possible, even in cases where it costs
+some extra code.
+<p>
+On processors without <kbd>FCOMI</kbd> instructions, the usual way of doing floating point
+comparisons is:
+<pre> FLD [a]
+ FCOMP [b]
+ FSTSW AX
+ SAHF
+ JB ASmallerThanB</pre><p>
+You may improve this code by using <kbd>FNSTSW AX</kbd> rather than
+<kbd>FSTSW AX</kbd> and test <kbd>AH</kbd>
+directly rather than using the non-pairable <kbd>SAHF</kbd>
+(TASM version 3.0 has a bug with the <kbd>FNSTSW AX</kbd> instruction):
+<pre> FLD [a]
+ FCOMP [b]
+ FNSTSW AX
+ SHR AH,1
+ JC ASmallerThanB</pre>
+<p>
+Testing for zero or equality:
+<pre> FTST
+ FNSTSW AX
+ AND AH,40H
+ JNZ IsZero ; (the zero flag is inverted!)</pre>
+<p>
+Test if greater:
+<pre> FLD [a]
+ FCOMP [b]
+ FNSTSW AX
+ AND AH,41H
+ JZ AGreaterThanB</pre>
+<p>
+Do not use <kbd>TEST AH,41H</kbd> as it is not pairable on PPlain and PMMX.
+<p>
+On the PPlain and PMMX, the <kbd>FNSTSW</kbd> instruction takes 2 clocks, but it is delayed for an
+additional 4 clocks after any floating point instruction because it is waiting for the status
+word to retire from the pipeline. This delay comes even after <kbd>FNOP</kbd>
+which cannot change the status word, but not after integer instructions.
+You can fill the latency between <kbd>FCOM</kbd> and
+<kbd>FNSTSW</kbd> with integer instructions taking up to four clock cycles.
+A paired <kbd>FXCH</kbd> immediately
+after <kbd>FCOM</kbd> doesn't delay the <kbd>FNSTSW</kbd>, not even if the pairing is imperfect:
+<pre> FCOM ; clock 1
+ FXCH ; clock 1-2 (imperfect pairing)
+ INC DWORD PTR [EBX] ; clock 3-5
+ FNSTSW AX ; clock 6-7</pre>
+<p>
+You may want to use <kbd>FCOM</kbd> rather than <kbd>FTST</kbd>
+here because <kbd>FTST</kbd> is not pairable.
+Remember to include the <kbd>N</kbd> in <kbd>FNSTSW</kbd>. <kbd>FSTSW</kbd>
+(without <kbd>N</kbd>) has a <kbd>WAIT</kbd> prefix which delays
+it further.
+<p>
+It is sometimes faster to use integer instructions for comparing floating point values, as
+described in chapter <a href="#27_6">27.6</a>.
+<p>
+<h3><a name="26_8">26.8 FPREM (all processors)</a></h3><p>
+The <kbd>FPREM</kbd> and <kbd>FPREM1</kbd> instructions are slow on all
+processors. You may replace it by the following algorithm: Multiply by
+the reciprocal divisor, get the fractional part by subtracting
+the truncated value, then multiply by the divisor.
+(see chapter <a href="#27_5">27.5</a> on how to truncate)
+<p>
+Some documents say that these instructions may give incomplete reductions and
+that it is therefore necessary to repeat the <kbd>FPREM</kbd> or
+<kbd>FPREM1</kbd> instruction until the reduction is complete.
+I have tested this on several processors beginning with the old 8087 and I have
+found no situation where a repetition of the <kbd>FPREM</kbd> or <kbd>FPREM1</kbd>
+was needed.
+<p>
+<h3><a name="26_9">26.9 FRNDINT (all processors)</a></h3><p>
+This instruction is slow on all processors. Replace it by:
+<pre>
+ FISTP QWORD PTR [TEMP]
+ FILD QWORD PTR [TEMP]</pre><p>
+This code is faster despite a possible penalty for attempting to read from
+<kbd>[TEMP]</kbd> before the write is finished. It is recommended to put
+other instructions in between in order to avoid
+this penalty. See chapter <a href="#27_5">27.5</a> on how to truncate.
+<p>
+<h3><a name="26_10">26.10 FSCALE and exponential function (all processors)</a></h3><p>
+<kbd>FSCALE</kbd> is slow on all processors. Computing integer powers
+of 2 can be done much faster by inserting the desired power in the exponent
+field of the floating point number.
+To calculate 2<sup>N</sup>, where N is a signed integer, select from the examples below the one that
+fits your range of N:
+<p>
+For |N| < 2<sup>7</sup>-1 you can use single precision:
+<pre> MOV EAX, [N]
+ SHL EAX, 23
+ ADD EAX, 3F800000H
+ MOV DWORD PTR [TEMP], EAX
+ FLD DWORD PTR [TEMP]</pre>
+<p>
+For |N| < 2<sup>10</sup>-1 you can use double precision:
+<pre> MOV EAX, [N]
+ SHL EAX, 20
+ ADD EAX, 3FF00000H
+ MOV DWORD PTR [TEMP], 0
+ MOV DWORD PTR [TEMP+4], EAX
+ FLD QWORD PTR [TEMP]</pre>
+<p>
+For |N| < 2<sup>14</sup>-1 use long double precision:
+<pre> MOV EAX, [N]
+ ADD EAX, 00003FFFH
+ MOV DWORD PTR [TEMP], 0
+ MOV DWORD PTR [TEMP+4], 80000000H
+ MOV DWORD PTR [TEMP+8], EAX
+ FLD TBYTE PTR [TEMP]</pre>
+<p>
+<kbd>FSCALE</kbd> is often used in the calculation of exponential functions. The following code shows
+an exponential function without the slow <kbd>FRNDINT</kbd> and <kbd>FSCALE</kbd> instructions:
+<p>
+<pre>; extern "C" long double _cdecl exp (double x);
+_exp PROC NEAR
+PUBLIC _exp
+ FLDL2E
+ FLD QWORD PTR [ESP+4] ; x
+ FMUL ; z = x*log2(e)
+ FIST DWORD PTR [ESP+4] ; round(z)
+ SUB ESP, 12
+ MOV DWORD PTR [ESP], 0
+ MOV DWORD PTR [ESP+4], 80000000H
+ FISUB DWORD PTR [ESP+16] ; z - round(z)
+ MOV EAX, [ESP+16]
+ ADD EAX,3FFFH
+ MOV [ESP+8],EAX
+ JLE SHORT UNDERFLOW
+ CMP EAX,8000H
+ JGE SHORT OVERFLOW
+ F2XM1
+ FLD1
+ FADD ; 2^(z-round(z))
+ FLD TBYTE PTR [ESP] ; 2^(round(z))
+ ADD ESP,12
+ FMUL ; 2^z = e^x
+ RET
+
+UNDERFLOW:
+ FSTP ST
+ FLDZ ; return 0
+ ADD ESP,12
+ RET
+
+OVERFLOW:
+ PUSH 07F800000H ; +infinity
+ FSTP ST
+ FLD DWORD PTR [ESP] ; return infinity
+ ADD ESP,16
+ RET
+
+_exp ENDP</pre>
+<p>
+<h3><a name="26_11">26.11 FPTAN (all processors)</a></h3><p>
+According to the manuals, <kbd>FPTAN</kbd> returns two values X and Y and
+leaves it to the programmer to divide Y with X to get the result, but in
+fact it always returns 1 in X so you can save the division. My tests show that
+on all 32 bit Intel processors with floating point unit or coprocessor,
+<kbd>FPTAN</kbd> always returns 1 in X regardless of the argument. If you want to
+be absolutely sure that your code will run correctly on all processors, then
+you may test if X is 1, which is faster than dividing with X. The Y value may
+be very high, but never infinity, so you don't have to test if Y contains a
+valid number if you know that the argument is valid.
+<p>
+<h3><a name="26_12">26.12 FSQRT (PIII)</a></h3><p>
+A fast way of calculating an approximate squareroot on the PIII is to multiply
+the reciprocal squareroot of x by x:<br>
+SQRT(x) = x * RSQRT(x)<br>
+The instruction <kbd>RSQRTSS</kbd> or <kbd>RSQRTPS</kbd> gives the reciprocal
+squareroot with a precision of 12 bits. You can improve the precision to 23 bits
+by using the Newton-Raphson formula described in Intel's application note AP-803:<br>
+x<sub>0</sub> = <kbd>RSQRTSS</kbd>(a)<br>
+x<sub>1</sub> = 0.5 * x<sub>0</sub> * (3 - (a * x<sub>0</sub>)) * x<sub>0</sub>)<br>
+where x<sub>0</sub> is the first approximation to the reciprocal squareroot of
+a, and x<sub>1</sub> is a better approximation. The order of evaluation is
+important. You must use this formula before multiplying with a to get the squareroot.
+<p>
+<h3><a name="26_13">26.13 MOV [MEM], ACCUM (PPlain and PMMX)</a></h3><p>
+The instructions <kbd>MOV [mem],AL MOV [mem],AX MOV [mem],EAX</kbd>
+ are treated by the pairing circuitry as if they were writing to the accumulator.
+ Thus the following instructions do not pair:
+<pre> MOV [mydata], EAX
+ MOV EBX, EAX</pre>
+<p>
+This problem occurs only with the short form of the <kbd>MOV</kbd>
+ instruction which can not have a
+base or index register, and which can only have the accumulator as source.
+You can avoid the problem by using another register, by reordering your
+instructions, by using a pointer, or by hard-coding the general form of
+the <kbd>MOV</kbd> instruction.
+<p>
+In 32 bit mode you can write the general form of <kbd>MOV [mem],EAX</kbd>:
+<pre> DB 89H, 05H
+ DD OFFSET DS:mem</pre>
+<p>
+In 16 bit mode you can write the general form of <kbd>MOV [mem],AX</kbd>:
+<pre> DB 89H, 06H
+ DW OFFSET DS:mem</pre>
+<p>
+To use <kbd>AL</kbd> instead of <kbd>(E)AX</kbd>, you replace <kbd>89H</kbd>
+ with <kbd>88H</kbd>
+<p>
+This flaw has not been fixed in the PMMX.
+<p>
+<h3><a name="26_14">26.14 TEST instruction (PPlain and PMMX)</a></h3><p>
+The <kbd>TEST</kbd> instruction with an immediate operand is only
+pairable if the destination is <kbd>AL</kbd>, <kbd>AX</kbd>, or <kbd>EAX</kbd>.
+<p>
+<kbd>TEST register,register</kbd>
+ and <kbd>TEST register,memory</kbd> is always pairable.
+<p>
+Examples:
+<pre> TEST ECX,ECX ; pairable
+ TEST [mem],EBX ; pairable
+ TEST EDX,256 ; not pairable
+ TEST DWORD PTR [EBX],8000H ; not pairable</pre><p>
+To make it pairable, use any of the following methods:
+<pre> MOV EAX,[EBX] / TEST EAX,8000H
+ MOV EDX,[EBX] / AND EDX,8000H
+ MOV AL,[EBX+1] / TEST AL,80H
+ MOV AL,[EBX+1] / TEST AL,AL ; (result in sign flag)</pre><p>
+(The reason for this non-pairability is probably that the first byte of the 2-byte instruction is
+the same as for some other non-pairable instructions, and the processor cannot afford to
+check the second byte too when determining pairability.)
+<p>
+<h3><a name="26_15">26.15 Bit scan (PPlain and PMMX)</a></h3><p>
+<kbd>BSF</kbd> and <kbd>BSR</kbd> are the poorest optimized instructions on
+the PPlain and PMMX, taking
+approximately 11 + 2*n clock cycles, where n is the number of zeros skipped.
+<p>
+The following code emulates <kbd>BSR ECX,EAX</kbd>:
+<pre> TEST EAX,EAX
+ JZ SHORT BS1
+ MOV DWORD PTR [TEMP],EAX
+ MOV DWORD PTR [TEMP+4],0
+ FILD QWORD PTR [TEMP]
+ FSTP QWORD PTR [TEMP]
+ WAIT ; WAIT only needed for compatibility with old 80287 processor
+ MOV ECX, DWORD PTR [TEMP+4]
+ SHR ECX,20 ; isolate exponent
+ SUB ECX,3FFH ; adjust
+ TEST EAX,EAX ; clear zero flag
+BS1:</pre>
+<p>
+The following code emulates <kbd>BSF ECX,EAX</kbd>:
+<pre> TEST EAX,EAX
+ JZ SHORT BS2
+ XOR ECX,ECX
+ MOV DWORD PTR [TEMP+4],ECX
+ SUB ECX,EAX
+ AND EAX,ECX
+ MOV DWORD PTR [TEMP],EAX
+ FILD QWORD PTR [TEMP]
+ FSTP QWORD PTR [TEMP]
+ WAIT ; WAIT only needed for compatibility with old 80287 processor
+ MOV ECX, DWORD PTR [TEMP+4]
+ SHR ECX,20
+ SUB ECX,3FFH
+ TEST EAX,EAX ; clear zero flag
+BS2:</pre>
+<p>
+These emulation codes should not be used on the PPro, PII and PIII, where the bit scan
+instructions take only 1 or 2 clocks, and where the emulation codes shown above have two
+partial memory stalls.
+<p>
+<h3><a name="26_16">26.16 FLDCW (PPro, PII and PIII)</a></h3><p>
+The PPro, PII and PIII have a serious stall after the
+<kbd>FLDCW</kbd> instruction if followed by any floating
+point instruction which reads the control word (which almost all floating
+point instructions do).
+<p>
+When C or C++ code is compiled it often generates a lot of
+<kbd>FLDCW</kbd> instructions because conversion of floating point numbers
+to integers is done with truncation while other floating
+point instructions use rounding. After translation to assembly, you can
+improve this code by using rounding instead of truncation where possible,
+or by moving the <kbd>FLDCW</kbd> out of a loop
+where truncation is needed inside the loop.
+<p>
+See chapter <a href="#27_5">27.5</a> on how to convert floating point numbers to integers
+whitout changing the control word.
+<p>
+<h2><a name="27">27</a>. Special topics</h2>
+<h3><a name="27_1">27.1 LEA instruction (all processors)</a></h3><p>
+The <kbd>LEA</kbd> instruction is useful for many purposes because it can do
+a shift, two additions, and a move in just one instruction taking one clock cycle.
+Example:<br>
+<kbd>LEA EAX,[EBX+8*ECX-1000]</kbd><br>
+is much faster than<br>
+<kbd>MOV EAX,ECX / SHL EAX,3 / ADD EAX,EBX / SUB EAX,1000</kbd><br>
+The <kbd>LEA</kbd> instruction can also be used to do an add or shift without
+changing the flags. The source and destination need not have the same word size,
+so <kbd>LEA EAX,[BX]</kbd> is a possible
+replacement for <kbd>MOVZX EAX,BX</kbd>, although suboptimal on most processors.
+<p>
+You must be aware, however, that the <kbd>LEA</kbd> instruction will suffer
+an AGI stall on the PPlain and PMMX if it uses a base or index register
+which has been written to in the preceding clock cycle.
+<p>
+Since the <kbd>LEA</kbd> instruction is pairable in the v-pipe on PPlain and
+PMMX and shift instructions are not, you may use <kbd>LEA</kbd> as
+a substitute for a <kbd>SHL</kbd> by 1, 2, or 3 if you want the
+instruction to execute in the V-pipe.
+<p>
+The 32 bit processors have no documented addressing mode with a scaled index register
+and nothing else, so an instruction like <kbd>LEA EAX,[EAX*2]</kbd>
+is actually coded as <kbd>LEA EAX,[EAX*2+00000000]</kbd>
+with an immediate displacement of 4 bytes. You may reduce the
+instruction size by instead writing <kbd>LEA EAX,[EAX+EAX]</kbd> or even
+better <kbd>ADD EAX,EAX</kbd>.
+The latter code cannot have an AGI delay in PPlain and PMMX. If you happen to have a register
+which is zero (like a loop counter after a loop), then you may use it
+as a base register to reduce the code size:
+<p>
+<pre>LEA EAX,[EBX*4] ; 7 bytes
+LEA EAX,[ECX+EBX*4] ; 3 bytes</pre>
+<p>
+<h3><a name="27_2">27.2 Division (all processors)</a></h3><p>
+Division is quite time consuming. On PPro, PII and PIII an integer division
+takes 19, 23, or 39 clocks for byte, word, and dword divisors respectively.
+On PPlain and PMMX an unsigned integer division takes approximately the same,
+while a signed integer division takes somewhat more. It is therefore
+preferable to use the smallest operand size possible that won't generate an
+overflow, even if it costs an operand size prefix, and use unsigned
+division if possible.
+<p>
+<h4>Integer division by a constant (all processors)</h4><p>
+Integer division by a power of two can be done by shifting right. Dividing an
+unsigned integer by 2<sup>N</sup>:
+<pre> SHR EAX, N</pre><p>
+Dividing a signed integer by 2<sup>N</sup>:
+<pre> CDQ
+ AND EDX, (1 SHL N) -1 ; or SHR EDX, 32-N
+ ADD EAX, EDX
+ SAR EAX, N</pre><p>
+The <kbd>SHR</kbd> alternative is shorter than the <kbd>AND</kbd> if N > 7,
+but can only go to execution port 0 (or u-pipe), whereas <kbd>AND</kbd> can
+go to either port 0 or 1 (u or v-pipe).
+<p>
+Dividing by a constant can be done by multiplying with the reciprocal.
+To calculate the unsigned integer division q = x / d, you first calculate
+the reciprocal of the divisor, f = 2<sup>r</sup> / d, where r defines the position of the binary
+decimal point (radix point). Then multiply x with f and shift
+right r positions. The maximum value of r is 32+b, where b is the number of binary digits in d
+minus 1. (b is the highest integer for which 2<sup>b</sup> <= d). Use r = 32+b to cover the maximum
+range for the value of the dividend x.
+<p>
+This method needs some refinement in order to compensate for rounding errors.
+The following algorithm will give you the correct result for unsigned integer
+division with truncation, i.e. the same result as the <kbd>DIV</kbd>
+instruction gives (Thanks to Terje Mathisen who invented this method):
+ <pre>
+ b = (the number of significant bits in d) - 1
+ r = 32 + b
+ f = 2<sup>r</sup> / d
+ If f is an integer then d is a power of 2: goto case A.
+ If f is not an integer, then check if the fractional part of f is < 0.5
+ If the fractional part of f < 0.5: goto case B.
+ If the fractional part of f > 0.5: goto case C.
+
+ case A: (d = 2<sup>b</sup>)
+ result = x SHR b
+
+ case B: (fractional part of f < 0.5)
+ round f down to nearest integer
+ result = ((x+1) * f) SHR r
+
+ case C: (fractional part of f > 0.5)
+ round f up to nearest integer
+ result = (x * f) SHR r
+ </pre>
+<p>
+Example:<br>
+Assume that you want to divide by 5.<br>
+5 = 00000101b.<br>
+b = (number of significant binary digits) - 1 = 2<br>
+r = 32+2 = 34<br>
+f = 2<sup>34</sup> / 5 = 3435973836.8 = 0CCCCCCCC.CCC...(hexadecimal)<br>
+The fractional part is greater than a half: use case C.<br>
+Round f up to 0CCCCCCCDh.
+<p>
+The following code divides <kbd>EAX</kbd> by 5 and returns the result in <kbd>EDX</kbd>:
+<pre> MOV EDX,0CCCCCCCDh
+ MUL EDX
+ SHR EDX,2</pre>
+<p>
+After the multiplication, <kbd>EDX</kbd> contains the product shifted right
+32 places. Since r = 34 you have to shift 2 more places to get the result.
+To divide by 10 you just change the last line to <kbd>SHR EDX,3</kbd>.
+<p>
+In case B you would have:
+<pre> INC EAX
+ MOV EDX,f
+ MUL EDX
+ SHR EDX,b</pre>
+<p>
+This code works for all values of x except 0FFFFFFFFH which gives zero because of
+overflow in the <kbd>INC</kbd> instruction. If x = 0FFFFFFFFH is possible, then change the code to:
+<pre> MOV EDX,f
+ ADD EAX,1
+ JC DOVERFL
+ MUL EDX
+DOVERFL:SHR EDX,b</pre>
+<p>
+If the value of x is limited, then you may use a lower value of r, i.e.
+fewer digits. There can be several reasons to use a lower value of r:
+<ul>
+<li>you may set r = 32 to avoid the <kbd>SHR EDX,b</kbd> in the end.
+<li>you may set r = 16+b and use a multiplication instruction that
+gives a 32 bit result rather
+than 64 bits. This will free the <kbd>EDX</kbd> register:
+<pre> IMUL EAX,0CCCDh / SHR EAX,18</pre>
+<li>you may choose a value of r that gives case C rather than case
+B in order to avoid the <kbd>INC EAX</kbd> instruction
+</ul>
+<p>
+The maximum value for x in these cases is at least 2<sup>r-b</sup>,
+sometimes higher. You have to do a systematic test if you want to know the
+exact maximum value of x for which your code works correctly.
+<p>
+You may want to replace the slow multiplication instruction with faster instructions as
+explained in chapter <a href="#26"_5>26.5</a>.
+<p>
+The following example divides <kbd>EAX</kbd> by 10 and returns the result
+in <kbd>EAX</kbd>. I have chosen r=17 rather than 19 because it happens
+to give a code, which is easier to optimize, and covers
+the same range for x. f = 2<sup>17</sup> / 10 = 3333h, case B: q = (x+1)*3333h:
+<pre> LEA EBX,[EAX+2*EAX+3]
+ LEA ECX,[EAX+2*EAX+3]
+ SHL EBX,4
+ MOV EAX,ECX
+ SHL ECX,8
+ ADD EAX,EBX
+ SHL EBX,8
+ ADD EAX,ECX
+ ADD EAX,EBX
+ SHR EAX,17</pre>
+<p>
+A systematic test shows that this code works correctly for all x < 10004H.
+<p>
+<h4>Repeated integer division by the same value (all processors)</h4><p>
+If the divisor is not known at assembly time, but you are dividing
+repeatedly with the same divisor, then you may use the same method as above.
+The code has to distinguish between
+case A, B and C and calculate f before doing the divisions.
+<p>
+The code that follows shows how to do multiple divisions with the same divisor (unsigned
+division with truncation). First call <kbd>SET_DIVISOR</kbd> to specify the
+divisor and calculate the
+reciprocal, then call <kbd>DIVIDE_FIXED</kbd> for each value to divide by the same divisor.
+<pre>
+.data
+
+RECIPROCAL_DIVISOR DD ? ; rounded reciprocal divisor
+CORRECTION DD ? ; case A: -1, case B: 1, case C: 0
+BSHIFT DD ? ; number of bits in divisor - 1
+
+.code
+
+SET_DIVISOR PROC NEAR ; divisor in EAX
+ PUSH EBX
+ MOV EBX,EAX
+ BSR ECX,EAX ; b = number of bits in divisor - 1
+ MOV EDX,1
+ JZ ERROR ; error: divisor is zero
+ SHL EDX,CL ; 2^b
+ MOV [BSHIFT],ECX ; save b
+ CMP EAX,EDX
+ MOV EAX,0
+ JE SHORT CASE_A ; divisor is a power of 2
+ DIV EBX ; 2^(32+b) / d
+ SHR EBX,1 ; divisor / 2
+ XOR ECX,ECX
+ CMP EDX,EBX ; compare remainder with divisor/2
+ SETBE CL ; 1 if case B
+ MOV [CORRECTION],ECX ; correction for rounding errors
+ XOR ECX,1
+ ADD EAX,ECX ; add 1 if case C
+ MOV [RECIPROCAL_DIVISOR],EAX ; rounded reciprocal divisor
+ POP EBX
+ RET
+CASE_A: MOV [CORRECTION],-1 ; remember that we have case A
+ POP EBX
+ RET
+SET_DIVISOR ENDP
+
+DIVIDE_FIXED PROC NEAR ; dividend in EAX, result in EAX
+ MOV EDX,[CORRECTION]
+ MOV ECX,[BSHIFT]
+ TEST EDX,EDX
+ JS SHORT DSHIFT ; divisor is power of 2
+ ADD EAX,EDX ; correct for rounding error
+ JC SHORT DOVERFL ; correct for overflow
+ MUL [RECIPROCAL_DIVISOR] ; multiply with reciprocal divisor
+ MOV EAX,EDX
+DSHIFT: SHR EAX,CL ; adjust for number of bits
+ RET
+DOVERFL:MOV EAX,[RECIPROCAL_DIVISOR] ; dividend = 0FFFFFFFFH
+ SHR EAX,CL ; do division by shifting
+ RET
+DIVIDE_FIXED ENDP</pre><p>
+This code gives the same result as the <kbd>DIV</kbd> instruction for
+0 <= x < 2<sup>32</sup>, 0 < d < 2<sup>32</sup>.<br>
+Note: The line <kbd>JC DOVERFL</kbd> and its target are not needed if
+you are certain that x < 0FFFFFFFFH.
+<p>
+If powers of 2 occur so seldom that it is not worth optimizing for them,
+then you may leave out the jump to <kbd>DSHIFT</kbd> and instead do a
+multiplication with <kbd>CORRECTION</kbd> = 0 for case A.
+<p>
+If the divisor is changed so often that the procedure <kbd>SET_DIVISOR</kbd> needs optimizing, then you may
+replace the <kbd>BSR</kbd> instruction with the code given in chapter
+<a href="#26_15">26.15</a> for the PPlain and PMMX processors.
+<p>
+<h4>Floating point division (all processors)</h4><p>
+Floating point division takes 38 or 39 clock cycles for the highest precision.
+You can save time by specifying a lower precision in the floating point
+control word (On PPlain and PMMX, only <kbd>FDIV</kbd> and <kbd>FIDIV</kbd> are faster at low
+precision; on PPro, PII and PIII, this also applies
+to <kbd>FSQRT</kbd>. No other instructions can be speeded up this way).
+<p>
+<h4><a name="paralleldiv">Parallel division (PPlain and PMMX)</a></h4><p>
+On PPlain and PMMX, it is possible to do a floating point division and an integer division in
+parallel to save time. On PPro, PII and PIII this is not possible, because integer division and
+floating point division use the same circuitry.<br>
+Example: A = A1 / A2; B = B1 / B2
+<pre> FILD [B1]
+ FILD [B2]
+ MOV EAX, [A1]
+ MOV EBX, [A2]
+ CDQ
+ FDIV
+ DIV EBX
+ FISTP [B]
+ MOV [A], EAX</pre><p>
+(make sure you set the floating point control word to the desired rounding method)
+<p>
+<h4>Using reciprocal instruction for fast division (PIII)</h4><p>
+On PIII you can use the fast reciprocal instruction <kbd>RCPSS</kbd> or
+<kbd>RCPPS</kbd> on the divisor and then multiply with the dividend. However,
+the precision is only 12 bits. You can increase the precision to 23 bits by
+using the Newton-Raphson method described in Intel's application note AP-803:<br>
+x<sub>0</sub> = <kbd>RCPSS</kbd>(d)<br>
+x<sub>1</sub> = x<sub>0</sub> * (2 - d * x<sub>0</sub>)
+= 2*x<sub>0</sub> - d * x<sub>0</sub> * x<sub>0</sub><br>
+where x<sub>0</sub> is the first approximation to the reciprocal of the divisor, d,
+and x<sub>1</sub> is a better approximation. You must use this formula before
+multiplying with the dividend:
+<pre> MOVAPS XMM1, [DIVISORS] ; load divisors
+ RCPPS XMM0, XMM1 ; approximate reciprocal
+ MULPS XMM1, XMM0 ; Newton-Raphson formula
+ MULPS XMM1, XMM0
+ ADDPS XMM0, XMM0
+ SUBPS XMM0, XMM1
+ MULPS XMM0, [DIVIDENDS] ; results in XMM0</pre><p>
+This makes four divisions in 18 clock cycles with a precision of 23 bits.
+Increasing the precision further by repeating the Newton-Raphson formula
+in the floating point registers is possible, but not very advantageous.
+<p>
+If you want to use this method for integer divisions then you have to check for
+rounding errors. The following code makes four divisions with truncation on packed
+word size integers in approximately 42 clock cycles. It gives exact results for
+0 <= dividend < 7FFFFH and 0 < divisor <= 7FFFFH:
+<pre> MOVQ MM1, [DIVISORS] ; load four divisors
+ MOVQ MM2, [DIVIDENDS] ; load four dividends
+ PUNPCKHWD MM4, MM1 ; unpack divisors to DWORDs
+ PSRAD MM4, 16
+ PUNPCKLWD MM3, MM1
+ PSRAD MM3, 16
+ CVTPI2PS XMM1, MM4 ; convert divisors to float, upper two operands
+ MOVLHPS XMM1, XMM1
+ CVTPI2PS XMM1, MM3 ; convert lower two operands
+ PUNPCKHWD MM4, MM2 ; unpack dividends to DWORDs
+ PSRAD MM4, 16
+ PUNPCKLWD MM3, MM2
+ PSRAD MM3, 16
+ CVTPI2PS XMM2, MM4 ; convert dividends to float, upper two operands
+ MOVLHPS XMM2, XMM2
+ CVTPI2PS XMM2, MM3 ; convert lower two operands
+ RCPPS XMM0, XMM1 ; approximate reciprocal of divisors
+ MULPS XMM1, XMM0 ; improve precision with Newton-Raphson method
+ PCMPEQW MM4, MM4 ; make four integer 1's in the meantime
+ PSRLW MM4, 15
+ MULPS XMM1, XMM0
+ ADDPS XMM0, XMM0
+ SUBPS XMM0, XMM1 ; reciprocal divisors with 23 bit precision
+ MULPS XMM0, XMM2 ; multiply with dividends
+ CVTTPS2PI MM0, XMM0 ; truncate lower two results
+ MOVHLPS XMM0, XMM0
+ CVTTPS2PI MM3, XMM0 ; truncate upper two results
+ PACKSSDW MM0, MM3 ; pack the four results into MM0
+ MOVQ MM3, MM1 ; multiply results with divisors...
+ PMULLW MM3, MM0 ; to check for rounding errors
+ PADDSW MM0, MM4 ; add 1 to compensate for later subtraction
+ PADDSW MM3, MM1 ; add divisor. this should be > dividend
+ PCMPGTW MM3, MM2 ; check if too small
+ PADDSW MM0, MM3 ; subtract 1 if not too small
+ MOVQ [QUOTIENTS], MM0 ; save the four results</pre><p>
+This code checks if the result is too small and makes the appropriate
+correction. It is not necessary to check if the result is too big.
+<p>
+<h4>Avoiding divisions (all processors)</h4><p>
+Obviously, you should always try to minimize the number of divisions. Floating point division
+with a constant or repeated division with the same value should of course be done by
+multiplying with the reciprocal. But there are many other situations where you can reduce
+the number of divisions. For example:
+if (A/B > C)... can be rewritten as if (A > B*C)... when B is positive, and the opposite when
+B is negative.
+<p>
+A/B + C/D can be rewritten as (A*D + C*B) / (B*D)
+<p>
+If you are using integer division, then you should be aware that the rounding errors may be
+different when you rewrite the formulas.
+<p>
+<h3><a name="27_3">27.3 Freeing floating point registers (all processors)</a></h3><p>
+You have to free all used floating point registers before exiting a subroutine,
+except for any register used for the result.
+<p>
+The fastest way of freeing one register is <kbd>FSTP ST</kbd>.
+The fastest way of freeing two registers is <kbd>FCOMPP</kbd> on PPlain and PMMX;
+on PPro, PII and PIII you may use either
+<kbd>FCOMPP</kbd> or two times <kbd>FSTP ST</kbd>, whichever fits best into
+the decoding sequence.
+<p>
+It is not recommended to use <kbd>FFREE</kbd>.
+<p>
+<h3><a name="27_4">27.4 Transitions between floating point and MMX instructions (PMMX, PII and PIII)</a></h3><p>
+You must issue an <kbd>EMMS</kbd> instruction after your last MMX instruction if there
+is a possibility that floating point code follows later.
+<p>
+On PMMX there is a high penalty for switching between floating point and MMX
+instructions. The first floating point instruction after an
+<kbd>EMMS</kbd> takes approximately 58 clocks extra, and the first MMX instruction
+after a floating point instruction takes approximately 38 clocks extra.
+<p>
+On PII and PIII there is no such penalty. The delay after <kbd>EMMS</kbd>
+can be hidden by putting in integer
+instructions between <kbd>EMMS</kbd> and the first floating point instruction.
+<p>
+<h3><a name="27_5">27.5 Converting from floating point to integer (All processors)</a></h3><p>
+All conversions from floating point to integer, and vice versa, must go via a memory
+location:
+<pre> FISTP DWORD PTR [TEMP]
+ MOV EAX, [TEMP]</pre><p>
+On PPro, PII and PIII, this code is likely to have a penalty for attempting to
+read from <kbd>[TEMP]</kbd> before the write to <kbd>[TEMP]</kbd> is finished
+because the <kbd>FIST</kbd> instruction is slow (see chapter <a href="#17">17</a>).
+It doesn't help to put in a <kbd>WAIT</kbd> (see chapter <a href="#26_6">26.6</a>).
+It is recommended that you put in other instructions between the write to
+<kbd>[TEMP]</kbd> and the read from <kbd>[TEMP]</kbd> if possible in
+order to avoid this penalty. This applies to all the examples that follow.
+<p>
+The specifications for the C and C++ language requires that conversion
+from floating point
+numbers to integers use truncation rather than rounding. The method used by most C
+libraries is to change the floating point control word to indicate truncation before using an
+<kbd>FISTP</kbd> instruction and changing it back again afterwords. This method is very slow on all
+processors. On PPro, PII and PIII, the floating point control word cannot be renamed, so all
+subsequent floating point instructions must wait for the <kbd>FLDCW</kbd> instruction to retire.
+<p>
+Whenever you have a conversion from floating point to integer in C or C++, you should
+think of whether you can use rounding to nearest integer instead of truncation. If your
+standard library doesn't have a fast round function then make your own using the code
+examples listed below.
+<p>
+If you need truncation inside a loop then you should change the control word only outside
+the loop if the rest of the floating point instructions in the loop can work correctly in
+truncation mode.
+<p>
+You may use various tricks for truncating without changing the control word, as illustrated in
+the examples below. These examples presume that the control word is set to default, i.e.
+rounding to nearest or even.
+<p>
+<h4>Rounding to nearest or even</h4><p>
+<pre>; extern "C" int round (double x);
+_round PROC NEAR
+PUBLIC _round
+ FLD QWORD PTR [ESP+4]
+ FISTP DWORD PTR [ESP+4]
+ MOV EAX, DWORD PTR [ESP+4]
+ RET
+_round ENDP</pre>
+<p>
+<h4>Truncation towards zero</h4><p>
+<pre>; extern "C" int truncate (double x);
+_truncate PROC NEAR
+PUBLIC _truncate
+ FLD QWORD PTR [ESP+4] ; x
+ SUB ESP, 12 ; space for local variables
+ FIST DWORD PTR [ESP] ; rounded value
+ FST DWORD PTR [ESP+4] ; float value
+ FISUB DWORD PTR [ESP] ; subtract rounded value
+ FSTP DWORD PTR [ESP+8] ; difference
+ POP EAX ; rounded value
+ POP ECX ; float value
+ POP EDX ; difference (float)
+ TEST ECX, ECX ; test sign of x
+ JS SHORT NEGATIVE
+ ADD EDX, 7FFFFFFFH ; produce carry if difference < -0
+ SBB EAX, 0 ; subtract 1 if x-round(x) < -0
+ RET
+NEGATIVE:
+ XOR ECX, ECX
+ TEST EDX, EDX
+ SETG CL ; 1 if difference > 0
+ ADD EAX, ECX ; add 1 if x-round(x) > 0
+ RET
+_truncate ENDP</pre>
+<p>
+<h4>Truncation towards minus infinity</h4><p>
+<pre>; extern "C" int ifloor (double x);
+_ifloor PROC NEAR
+PUBLIC _ifloor
+ FLD QWORD PTR [ESP+4] ; x
+ SUB ESP, 8 ; space for local variables
+ FIST DWORD PTR [ESP] ; rounded value
+ FISUB DWORD PTR [ESP] ; subtract rounded value
+ FSTP DWORD PTR [ESP+4] ; difference
+ POP EAX ; rounded value
+ POP EDX ; difference (float)
+ ADD EDX, 7FFFFFFFH ; produce carry if difference < -0
+ SBB EAX, 0 ; subtract 1 if x-round(x) < -0
+ RET
+_ifloor ENDP</pre>
+<p>
+These procedures work for -2<sup>31</sup> < x < 2<sup>31</sup>-1.
+They do not check for overflow or NAN's.
+<p>
+The PIII has instructions for truncation of single precision floating point
+numbers: <kbd>CVTTSS2SI</kbd> and <kbd>CVTTPS2PI</kbd>. These instructions
+are very useful if the single precision is satisfactory, but if you are converting
+a float with higher precision to single precision in order to use these truncation
+instructions then you have the problem that the number may be rounded up in the
+conversion to single precision.
+<p>
+<h4>Alternative to FISTP instruction (PPlain and PMMX)</h4>
+<p>
+Converting a floating point number to integer is normally done like this:
+<pre> FISTP DWORD PTR [TEMP]
+ MOV EAX, [TEMP]</pre>
+<p>
+An alternative method is:
+<pre>.DATA
+ALIGN 8
+TEMP DQ ?
+MAGIC DD 59C00000H ; f.p. representation of 2^51 + 2^52
+
+.CODE
+ FADD [MAGIC]
+ FSTP QWORD PTR [TEMP]
+ MOV EAX, DWORD PTR [TEMP]</pre>
+<p>
+Adding the 'magic number' of 2<sup>51</sup> + 2<sup>52</sup> has the effect
+that any integer between -2<sup>31</sup> and +2<sup>31</sup>
+ will be aligned in the lower 32 bits when storing as a double precision floating
+point number. The result is the same as you get with <kbd>FISTP</kbd> for all rounding methods except
+truncation towards zero. The result is different from <kbd>FISTP</kbd> if the control word specifies
+truncation or in case of overflow. You may need a <kbd>WAIT</kbd> instruction for
+compatibility with the old 80287 processor, see chapter <a href="#26_6">26.6</a>.
+<p>
+This method is not faster than using <kbd>FISTP</kbd>, but it gives better
+scheduling opportunities on
+PPlain and PMMX because there is a 3 clock void between <kbd>FADD</kbd>
+ and <kbd>FSTP</kbd> which may be
+filled with other instrucions. You may multiply or divide the number by a
+power of 2 in the same operation by doing the opposite to the magic number.
+You may also add a constant by
+adding it to the magic number, which then has to be double precision.
+<p>
+<h3><a name="27_6">27.6 Using integer instructions to do floating point operations (all processors)</a></h3><p>
+Integer instructions are generally faster than floating point instructions, so it is often
+advantageous to use integer instructions for doing simple floating point operations. The
+most obvious example is moving data. Example:<br>
+<kbd> FLD QWORD PTR [ESI] / FSTP QWORD PTR [EDI]</kbd><br>
+Change to:<br>
+<kbd> MOV EAX,[ESI] / MOV EBX,[ESI+4] / MOV [EDI],EAX / MOV [EDI+4],EBX</kbd><br>
+<p>
+<h4>Testing if a floating point value is zero:</h4><p>
+The floating point value of zero is usually represented as 32 or 64 bits of zero, but there is a
+pitfall here: The sign bit may be set! Minus zero is regarded as a valid floating point number,
+and the processor may actually generate a zero with the sign bit set if for example
+multiplying a negative number with zero. So if you want to test if a floating point number is
+zero, you should not test the sign bit. Example:<br>
+<kbd> FLD DWORD PTR [EBX] / FTST / FNSTSW AX / AND AH,40H / JNZ IsZero</kbd><br>
+Use integer instructions instead, and shift out the sign bit:<br>
+<kbd> MOV EAX,[EBX] / ADD EAX,EAX / JZ IsZero</kbd><br>
+If the floating point number is double precision (QWORD) then you only have to
+test bit 32-62. If they are zero, then the lower half will also be zero if it is a normal floating point number.
+<p>
+<h4>Testing if negative:</h4><p>
+A floating point number is negative if the sign bit is set and at least one other bit is set.
+Example:<br>
+<kbd> MOV EAX,[NumberToTest] / CMP EAX,80000000H / JA IsNegative</kbd>
+<p>
+<h4>Manipulating the sign bit:</h4><p>
+You can change the sign of a floating point number simply by flipping the
+sign bit. Example:<br>
+<kbd> XOR BYTE PTR [a] + (TYPE a) - 1, 80H</kbd>
+<p>
+Likewise you may get the absolute value of a floating point number by simply ANDing out
+the sign bit.
+<p>
+<h4>Comparing numbers:</h4><p>
+Floating point numbers are stored in a unique format which allows you to use integer
+instructions for comparing floating point numbers, except for the sign bit. If you are certain
+that two floating point numbers both are normal and positive then you may simply compare
+them as integers. Example:<br>
+<kbd> FLD [a] / FCOMP [b] / FNSTSW AX / AND AH,1 / JNZ ASmallerThanB</kbd><br>
+Change to:<br>
+<kbd> MOV EAX,[a] / MOV EBX,[b] / CMP EAX,EBX / JB ASmallerThanB</kbd><br>
+This method only works if the two numbers have the same precision and you are certain
+that none of the numbers have the sign bit set.
+<p>
+If negative numbers are possible, then you have to convert the negative numbers to
+2-complement, and do a signed compare:
+<pre> MOV EAX, [a]
+ MOV EBX, [b]
+ MOV ECX, EAX
+ MOV EDX, EBX
+ SAR ECX, 31 ; copy sign bit
+ AND EAX, 7FFFFFFFH ; remove sign bit
+ SAR EDX, 31
+ AND EBX, 7FFFFFFFH
+ XOR EAX, ECX ; make 2-complement if sign bit was set
+ XOR EBX, EDX
+ SUB EAX, ECX
+ SUB EBX, EDX
+ CMP EAX, EBX
+ JL ASmallerThanB ; signed comparison</pre><p>
+This method works for all normal floating point numbers, including -0.
+<p>
+<h3><a name="27_7">27.7 Using floating point instructions to do integer operations (PPlain and PMMX)</a></h3><p>
+<h4>Integer multiplication (PPlain and PMMX)</h4><p>
+Floating point multiplication is faster than integer multiplication on the PPlain and PMMX,
+but the price for converting integer factors to float and converting the result back to integer
+is high, so floating point multiplication is only advantageous if the number of conversions
+needed is low compared with the number of multiplications. (It may be tempting to use
+denormal floating point operands to save some of the conversions here, but the handling of
+denormals is very slow, so this is not a good idea!)
+<p>
+On the PMMX, MMX multiplication instructions are faster than integer multiplication, and
+can be pipelined to a throughput of one multiplication per clock cycle, so this may be the
+best solution for doing fast multiplication on the PMMX, if you can live with 16 bit precision.
+<p>
+Integer multiplication is faster than floating point on PPro, PII and PIII.
+<p>
+<h4>Integer division (PPlain and PMMX)</h4><p>
+Floating point division is not faster than integer division, but you can do other integer
+operations (including integer division, but not integer multiplication) while the floating point
+unit is working on the division (See example <a href="#paralleldiv">above</a>).
+<p>
+<h4>Converting binary to decimal numbers (all processors)</h4><p>
+Using the <kbd>FBSTP</kbd> instruction is a simple and convenient way of converting a binary number
+to decimal, although not necessarily the fastest method.
+<p>
+<h3><a name="27_8">27.8 Moving blocks of data (all processors)</a></h3><p>
+There are several ways of moving blocks of data. The most common method is
+<kbd>REP MOVSD</kbd>, but under certain conditions other methods are faster.
+<p>
+On PPlain and PMMX it is faster to move 8 bytes at a time using floating
+point registers if the destination is not in the cache:
+<pre>TOP: FILD QWORD PTR [ESI]
+ FILD QWORD PTR [ESI+8]
+ FXCH
+ FISTP QWORD PTR [EDI]
+ FISTP QWORD PTR [EDI+8]
+ ADD ESI, 16
+ ADD EDI, 16
+ DEC ECX
+ JNZ TOP</pre>
+<p>
+The source and destination should of course be aligned by 8. The extra time used by the
+slow <kbd>FILD</kbd> and <kbd>FISTP</kbd> instructions is compensated for by the fact that you only have to do
+half as many write operations. Note that this method is only advantageous on the PPlain
+and PMMX and only if the destination is not in the level 1 cache. You cannot use
+<kbd>FLD</kbd> and <kbd>FSTP</kbd> (without <kbd>I</kbd>) on arbitrary bit patterns because denormal numbers
+are handled slowly and certain bit patterns are not preserved unchanged.
+<p>
+On the PMMX processor it is faster to use MMX instructions to move eight bytes
+at a time if the destination is not in the cache:
+<pre>TOP: MOVQ MM0,[ESI]
+ MOVQ [EDI],MM0
+ ADD ESI,8
+ ADD EDI,8
+ DEC ECX
+ JNZ TOP</pre>
+<p>
+There is no need to unroll this loop or optimize it further if cache misses are expected,
+because memory access is the bottleneck here, not instruction execution.
+<p>
+On PPro, PII and PIII processors the <kbd>REP MOVSD</kbd> instruction is particularly
+fast when the following conditions are met (see chapter <a href="#26_3">26.3</a>):
+<ul>
+<li>both source and destination must be aligned by 8
+<li>direction must be forward (direction flag cleared)
+<li>the count (<kbd>ECX</kbd>) must be greater than or equal to 64
+<li>the difference between <kbd>EDI</kbd> and <kbd>ESI</kbd> must be numerically greater than or equal to 32
+<li>the memory type for both source and destination must be either writeback or
+write-combining (you can normally assume this).
+</ul>
+<p>
+On the PII it is faster to use MMX registers if the above conditions are not met
+and the destination is likely to be in the level 1 cache. The loop may be rolled
+out by two, and the source and destination should of course be aligned by 8.
+<p>
+On the PIII the fastest way of moving data is to use the <kbd>MOVAPS</kbd>
+instruction if the above conditions are not met or if the destination is in
+the level 1 or level 2 cache:
+<pre> SUB EDI, ESI
+TOP: MOVAPS XMM0, [ESI]
+ MOVAPS [ESI+EDI], XMM0
+ ADD ESI, 16
+ DEC ECX
+ JNZ TOP</pre><p>
+Unlike <kbd>FLD</kbd>, <kbd>MOVAPS</kbd> can handle any bit pattern without
+problems. Remember that source and destination must be aligned by 16.
+<p>
+If the number of bytes to move is not divisible by 16 then you may round up
+to the nearest number divisible by 16 and put some extra space at the end of
+the destination buffer to receive the superfluous bytes. If this is not possible
+then you have to move the remaining bytes by other methods.
+<p>
+On the PIII you also have the option of writing directly to RAM memory without
+involving the cache by using the <kbd>MOVNTQ</kbd> or <kbd>MOVNTPS</kbd>
+instruction. This can be useful if you don't want the destination to go into
+a cache. <kbd>MOVNTPS</kbd> is only slightly faster than <kbd>MOVNTQ</kbd>.
+<p>
+<h3><a name="27_9">27.9 Self-modifying code (All processors)</a></h3><p>
+The penalty for executing a piece of code immediately after modifying it is approximately 19
+clocks for PPlain, 31 for PMMX, and 150-300 for PPro, PII and PIII. The 80486 and earlier
+processors require a jump between the modifying and the modified code in order to flush
+the code cache.
+<p>
+To get permission to modify code in a protected operating system you need to call special
+system functions: In 16-bit Windows call ChangeSelector, in 32-bit Windows call
+VirtualProtect and FlushInstructionCache (or put the code in a data segment).
+<p>
+Self-modifying code is not considered good programming practice, but it may be justified if
+the gain in speed is considerable.
+<p>
+<h3><a name="27_10">27.10 Detecting processor type (All processors)</a></h3><p>
+I think it is fairly obvious by now that what is optimal for one microprocessor may not be
+optimal for another. You may make the most critical parts of you program in different
+versions, each optimized for a specific microprocessor and selecting the desired version at
+run time after detecting which microprocessor the program is running on. If you are using
+instructions that are not supported by all microprocessors (i.e. conditional
+moves, <kbd>FCOMI</kbd>, MMX and XMM instructions) then you must first check if the program is running on a microprocessor
+that supports these instructions. The subroutine below checks the type of microprocessor
+and the features supported.
+<p>
+<pre>; define CPUID instruction if not known by assembler:
+CPUID MACRO
+ DB 0FH, 0A2H
+ENDM
+
+; C++ prototype:
+; extern "C" long int DetectProcessor (void);
+
+; return value:
+; bits 8-11 = family (5 for PPlain and PMMX, 6 for PPro, PII and PIII)
+; bit 0 = floating point instructions supported
+; bit 15 = conditional move and FCOMI instructions supported
+; bit 23 = MMX instructions supported
+; bit 25 = XMM instructions supported
+
+_DetectProcessor PROC NEAR
+PUBLIC _DetectProcessor
+ PUSH EBX
+ PUSH ESI
+ PUSH EDI
+ PUSH EBP
+ ; detect if CPUID instruction supported by microprocessor:
+ PUSHFD
+ POP EAX
+ MOV EBX, EAX
+ XOR EAX, 1 SHL 21 ; check if CPUID bit can toggle
+ PUSH EAX
+ POPFD
+ PUSHFD
+ POP EAX
+ XOR EAX, EBX
+ AND EAX, 1 SHL 21
+ JZ SHORT DPEND ; CPUID instruction not supported
+ XOR EAX, EAX
+ CPUID ; get number of CPUID functions
+ TEST EAX, EAX
+ JZ SHORT DPEND ; CPUID function 1 not supported
+ MOV EAX, 1
+ CPUID ; get family and features
+ AND EAX, 000000F00H ; family
+ AND EDX, 0FFFFF0FFH ; features flags
+ OR EAX, EDX ; combine bits
+DPEND: POP EBP
+ POP EDI
+ POP ESI
+ POP EBX
+ RET
+_DetectProcessor ENDP</pre>
+<p>
+Note that some operating systems do not allow XMM instructions.
+Information on how to check for operating system support of XMM instructions can
+be found in Intel's application note AP-900: "Identifying support for Streaming
+SIMD Extensions in the Processor and Operating System".
+More information on microprocessor identification can be found in Intel's
+application note AP-485: "Intel Processor Identification and the CPUID Instruction".
+<p>
+To code the conditional move, MMX, XMM instructions etc. on an assembler that doesn't have
+these instructions use the macros at <a href="http://www.agner.org/assem/macros.zip">www.agner.org/assem/macros.zip</a>
+<p>
+<h2><a name="28">28</a>. List of instruction timings for PPlain and PMMX</h2>
+<h3><a name="28_1">28.1 Integer instructions</a></h3><p>
+<b>Explanations:</b><br>
+<u>Operands:</u><br>
+r = register, m = memory, i = immediate data, sr = segment register<br>
+m32 = 32 bit memory operand, etc.
+<p>
+<u>Clock cycles:</u><br>
+The numbers are minimum values. Cache misses, misalignment, and exceptions may
+increase the clock counts considerably.
+<p>
+<u>Pairability:</u><br>
+u = pairable in u-pipe, v = pairable in v-pipe, uv = pairable in either pipe,
+np = not pairable.
+<p>
+
+<table border=1 cellpadding=4 cellspacing=1>
+<tr><td class="a3"> Instruction </td>
+<td class="a3"> Operands </td>
+<td class="a3"> Clock cycles </td>
+<td class="a3"> Pairability </td></tr>
+<tr><td>NOP</td><td> </td><td>1</td><td>uv</td></tr>
+<tr><td>MOV</td><td>r/m, r/m/i</td><td>1</td><td>uv</td></tr>
+<tr><td>MOV</td><td>r/m, sr</td><td>1</td><td>np</td></tr>
+<tr><td>MOV</td><td>sr , r/m</td><td>>= 2 b)</td><td>np</td></tr>
+<tr><td>MOV</td><td>m , accum</td><td>1</td><td>uv h)</td></tr>
+<tr><td>XCHG</td><td>(E)AX, r</td><td>2</td><td>np</td></tr>
+<tr><td>XCHG</td><td>r , r</td><td>3</td><td>np</td></tr>
+<tr><td>XCHG</td><td>r , m</td><td>>15</td><td>np</td></tr>
+<tr><td>XLAT</td><td> </td><td>4</td><td>np</td></tr>
+<tr><td>PUSH</td><td>r/i</td><td>1</td><td>uv</td></tr>
+<tr><td>POP</td><td>r</td><td>1</td><td>uv</td></tr>
+<tr><td>PUSH</td><td>m</td><td>2</td><td>np</td></tr>
+<tr><td>POP</td><td>m</td><td>3</td><td>np</td></tr>
+<tr><td>PUSH</td><td>sr</td><td>1 b)</td><td>np</td></tr>
+<tr><td>POP</td><td>sr</td><td>>= 3 b)</td><td>np</td></tr>
+<tr><td>PUSHF</td><td> </td><td>3-5</td><td>np</td></tr>
+<tr><td>POPF</td><td> </td><td>4-6</td><td>np</td></tr>
+<tr><td>PUSHA POPA</td><td> </td><td>5-9 i)</td><td>np</td></tr>
+<tr><td>PUSHAD POPAD</td><td> </td><td>5</td><td>np</td></tr>
+<tr><td>LAHF SAHF</td><td> </td><td>2</td><td>np</td></tr>
+<tr><td>MOVSX MOVZX</td><td>r , r/m</td><td>3 a)</td><td>np</td></tr>
+<tr><td>LEA</td><td>r , m</td><td>1</td><td>uv</td></tr>
+<tr><td>LDS LES LFS LGS LSS</td><td>m</td><td>4 c)</td><td>np</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>r , r/i</td><td>1</td><td>uv</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>r , m</td><td>2</td><td>uv</td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>m , r/i</td><td>3</td><td>uv</td></tr>
+<tr><td>ADC SBB</td><td>r , r/i</td><td>1</td><td>u</td></tr>
+<tr><td>ADC SBB</td><td>r , m</td><td>2</td><td>u</td></tr>
+<tr><td>ADC SBB</td><td>m , r/i</td><td>3</td><td>u</td></tr>
+<tr><td>CMP</td><td>r , r/i</td><td>1</td><td>uv</td></tr>
+<tr><td>CMP</td><td>m , r/i</td><td>2</td><td>uv</td></tr>
+<tr><td>TEST</td><td>r , r</td><td>1</td><td>uv</td></tr>
+<tr><td>TEST</td><td>m , r</td><td>2</td><td>uv</td></tr>
+<tr><td>TEST</td><td>r , i</td><td>1</td><td>f)</td></tr>
+<tr><td>TEST</td><td>m , i</td><td>2</td><td>np</td></tr>
+<tr><td>INC DEC</td><td>r</td><td>1</td><td>uv</td></tr>
+<tr><td>INC DEC</td><td>m</td><td>3</td><td>uv</td></tr>
+<tr><td>NEG NOT</td><td>r/m</td><td>1/3</td><td>np</td></tr>
+<tr><td>MUL IMUL</td><td>r8/r16/m8/m16</td><td>11</td><td>np</td></tr>
+<tr><td>MUL IMUL</td><td>all other versions</td><td>9 d)</td><td>np</td></tr>
+<tr><td>DIV</td><td>r8/m8</td><td>17</td><td>np</td></tr>
+<tr><td>DIV</td><td>r16/m16</td><td>25</td><td>np</td></tr>
+<tr><td>DIV</td><td>r32/m32</td><td>41</td><td>np</td></tr>
+<tr><td>IDIV</td><td>r8/m8</td><td>22</td><td>np</td></tr>
+<tr><td>IDIV</td><td>r16/m16</td><td>30</td><td>np</td></tr>
+<tr><td>IDIV</td><td>r32/m32</td><td>46</td><td>np</td></tr>
+<tr><td>CBW CWDE</td><td> </td><td>3</td><td>np</td></tr>
+<tr><td>CWD CDQ</td><td> </td><td>2</td><td>np</td></tr>
+<tr><td>SHR SHL SAR SAL</td><td>r , i</td><td>1</td><td>u</td></tr>
+<tr><td>SHR SHL SAR SAL</td><td>m , i</td><td>3</td><td>u</td></tr>
+<tr><td>SHR SHL SAR SAL</td><td>r/m, CL</td><td>4/5</td><td>np</td></tr>
+<tr><td>ROR ROL RCR RCL</td><td>r/m, 1</td><td>1/3</td><td>u</td></tr>
+<tr><td>ROR ROL</td><td>r/m, i(><1)</td><td>1/3</td><td>np</td></tr>
+<tr><td>ROR ROL</td><td>r/m, CL</td><td>4/5</td><td>np</td></tr>
+<tr><td>RCR RCL</td><td>r/m, i(><1)</td><td>8/10</td><td>np</td></tr>
+<tr><td>RCR RCL</td><td>r/m, CL</td><td>7/9</td><td>np</td></tr>
+<tr><td>SHLD SHRD</td><td>r, i/CL</td><td>4 a)</td><td>np</td></tr>
+<tr><td>SHLD SHRD</td><td>m, i/CL</td><td>5 a)</td><td>np</td></tr>
+<tr><td>BT</td><td>r, r/i</td><td>4 a)</td><td>np</td></tr>
+<tr><td>BT</td><td>m, i</td><td>4 a)</td><td>np</td></tr>
+<tr><td>BT</td><td>m, i</td><td>9 a)</td><td>np</td></tr>
+<tr><td>BTR BTS BTC</td><td>r, r/i</td><td>7 a)</td><td>np</td></tr>
+<tr><td>BTR BTS BTC</td><td>m, i</td><td>8 a)</td><td>np</td></tr>
+<tr><td>BTR BTS BTC</td><td>m, r</td><td>14 a)</td><td>np</td></tr>
+<tr><td>BSF BSR</td><td>r , r/m</td><td>7-73 a)</td><td>np</td></tr>
+<tr><td>SETcc</td><td>r/m</td><td>1/2 a)</td><td>np</td></tr>
+<tr><td>JMP CALL</td><td>short/near</td><td>1 e)</td><td>v</td></tr>
+<tr><td>JMP CALL</td><td>far</td><td>>= 3 e)</td><td>np</td></tr>
+<tr><td>conditional jump</td><td>short/near</td><td>1/4/5/6 e)</td><td>v</td></tr>
+<tr><td>CALL JMP</td><td>r/m</td><td>2/5 e</td><td>np</td></tr>
+<tr><td>RETN</td><td> </td><td>2/5 e</td><td>np</td></tr>
+<tr><td>RETN</td><td>i</td><td>3/6 e)</td><td>np</td></tr>
+<tr><td>RETF</td><td> </td><td>4/7 e)</td><td>np</td></tr>
+<tr><td>RETF</td><td>i</td><td>5/8 e)</td><td>np</td></tr>
+<tr><td>J(E)CXZ</td><td>short</td><td>4-11 e)</td><td>np</td></tr>
+<tr><td>LOOP</td><td>short</td><td>5-10 e)</td><td>np</td></tr>
+<tr><td>BOUND</td><td>r , m</td><td>8</td><td>np</td></tr>
+<tr><td>CLC STC CMC CLD STD</td><td> </td><td>2</td><td>np</td></tr>
+<tr><td>CLI STI</td><td> </td><td>6-9</td><td>np</td></tr>
+<tr><td>LODS</td><td> </td><td>2</td><td>np</td></tr>
+<tr><td>REP LODS</td><td> </td><td>7+3*n g)</td><td>np</td></tr>
+<tr><td>STOS</td><td> </td><td>3</td><td>np</td></tr>
+<tr><td>REP STOS</td><td> </td><td>10+n g)</td><td>np</td></tr>
+<tr><td>MOVS</td><td> </td><td>4</td><td>np</td></tr>
+<tr><td>REP MOVS</td><td> </td><td>12+n g)</td><td>np</td></tr>
+<tr><td>SCAS</td><td> </td><td>4</td><td>np</td></tr>
+<tr><td>REP(N)E SCAS</td><td> </td><td>9+4*n g)</td><td>np</td></tr>
+<tr><td>CMPS</td><td> </td><td>5</td><td>np</td></tr>
+<tr><td>REP(N)E CMPS</td><td> </td><td>8+4*n g)</td><td>np</td></tr>
+<tr><td>BSWAP</td><td> </td><td>1 a)</td><td>np</td></tr>
+<tr><td>CPUID</td><td> </td><td>13-16 a)</td><td>np</td></tr>
+<tr><td>RDTSC</td><td> </td><td>6-13 a) j)</td><td>np</td></tr>
+</table>
+<p>
+<b>Notes:</b><br>
+a) this instruction has a <kbd>0FH</kbd> prefix which takes one clock cycle extra to
+ decode on a PPlain unless preceded by a multicycle instruction (see
+ chapter <a href="#12">12</a>).<br>
+b) versions with <kbd>FS</kbd> and <kbd>GS</kbd> have a <kbd>0FH</kbd>
+ prefix. see note a.<br>
+c) versions with <kbd>SS, FS</kbd>, and <kbd>GS</kbd> have a <kbd>0FH</kbd> prefix. see note a.<br>
+d) versions with two operands and no immediate have a <kbd>0FH</kbd> prefix, see note a.<br>
+e) see chapter <a href="#22">22</a><br>
+f) only pairable if register is accumulator. see chapter <a href="#26_14">26.14</a>.<br>
+g) add one clock cycle for decoding the repeat prefix unless preceded by a
+ multicycle instruction (such as <kbd>CLD</kbd>. see chapter <a href="#12">12</a>).<br>
+h) pairs as if it were writing to the accumulator. see chapter <a href="#26_14">26.14</a>.<br>
+i) 9 if <kbd>SP</kbd> divisible by 4. <a href="#imperfectpush">See 10.2</a><br>
+j) on PPlain: 6 in priviledged or real mode, 11 in nonpriviledged, error in
+ virtual mode. On PMMX: 8 and 13 clocks respectively.<br>
+<p>
+<h3><a name="28_2">28.2 Floating point instructions</a></h3><p>
+<p>
+<b>Explanations:</b><br>
+<u>Operands:</u><br>
+r = register, m = memory, m32 = 32 bit memory operand, etc.
+<p>
+<u>Clock cycles:</u><br>
+The numbers are minimum values. Cache misses, misalignment, denormal operands, and
+exceptions may increase the clock counts considerably.
+<p>
+<u>Pairability:</u><br>
++ = pairable with <kbd>FXCH</kbd>, np = not pairable with <kbd>FXCH</kbd>.
+<p>
+<u>i-ov:</u><br>
+Overlap with integer instructions. i-ov = 4 means that the last four clock cycles can overlap
+with subsequent integer instructions.
+<p>
+<u>fp-ov:</u><br>
+Overlap with floating point instructions. fp-ov = 2 means that the last two clock cycles can
+overlap with subsequent floating point instructions.
+(<kbd>WAIT</kbd> is considered a floating point instruction here)<p>
+
+<table border=1 cellpadding=4 cellspacing=1>
+<tr><td class="a3"> Instruction </td>
+<td class="a3"> Operand </td>
+<td class="a3"> Clock cycles </td>
+<td class="a3"> Pairability </td>
+<td class="a3"> i-ov </td>
+<td class="a3"> fp-ov </td></tr>
+<tr><td>FLD</td><td>r/m32/m64</td><td>1</td><td>+</td><td>0</td><td>0</td></tr>
+<tr><td>FLD</td><td>m80</td><td>3</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FBLD</td><td>m80</td><td>48-58</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FST(P)</td><td>r</td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FST(P)</td><td>m32/m64</td><td>2 m)</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FST(P)</td><td>m80</td><td>3 m)</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FBSTP</td><td>m80</td><td>148-154</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FILD</td><td>m</td><td>3</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FIST(P)</td><td>m</td><td>6</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FLDZ FLD1</td><td> </td><td>2</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FLDPI FLDL2E etc.</td><td> </td><td>5 s)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FNSTSW</td><td>AX/m16</td><td>6 q)</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FLDCW</td><td>m16</td><td>8</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FNSTCW</td><td>m16</td><td>2</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FADD(P)</td><td>r/m</td><td>3</td><td>+</td><td>2</td><td>2</td></tr>
+<tr><td>FSUB(R)(P)</td><td>r/m</td><td>3</td><td>+</td><td>2</td><td>2</td></tr>
+<tr><td>FMUL(P)</td><td>r/m</td><td>3</td><td>+</td><td>2</td><td>2 n)</td></tr>
+<tr><td>FDIV(R)(P)</td><td>r/m</td><td>19/33/39 p)</td><td>+</td><td>38 o)</td><td>2</td></tr>
+<tr><td>FCHS FABS</td><td> </td><td>1</td><td>+</td><td>0</td><td>0</td></tr>
+<tr><td>FCOM(P)(P) FUCOM</td><td>r/m</td><td>1</td><td>+</td><td>0</td><td>0</td></tr>
+<tr><td>FIADD FISUB(R)</td><td>m</td><td>6</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FIMUL</td><td>m</td><td>6</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FIDIV(R)</td><td>m</td><td>22/36/42 p)</td><td>np</td><td>38 o)</td><td>2</td></tr>
+<tr><td>FICOM</td><td>m</td><td>4</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FTST</td><td> </td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FXAM</td><td> </td><td>17-21</td><td>np</td><td>4</td><td>0</td></tr>
+<tr><td>FPREM</td><td> </td><td>16-64</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FPREM1</td><td> </td><td>20-70</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FRNDINT</td><td> </td><td>9-20</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FSCALE</td><td> </td><td>20-32</td><td>np</td><td>5</td><td>0</td></tr>
+<tr><td>FXTRACT</td><td> </td><td>12-66</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FSQRT</td><td> </td><td>70</td><td>np</td><td>69 o)</td><td>2</td></tr>
+<tr><td>FSIN FCOS</td><td> </td><td>65-100 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FSINCOS</td><td> </td><td>89-112 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>F2XM1</td><td> </td><td>53-59 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FYL2X</td><td> </td><td>103 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FYL2XP1</td><td> </td><td>105 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FPTAN</td><td> </td><td>120-147 r)</td><td>np</td><td>36 o)</td><td>0</td></tr>
+<tr><td>FPATAN</td><td> </td><td>112-134 r)</td><td>np</td><td>2</td><td>2</td></tr>
+<tr><td>FNOP</td><td> </td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FXCH</td><td>r</td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FINCSTP FDECSTP</td><td> </td><td>2</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FFREE</td><td>r</td><td>2</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FNCLEX</td><td> </td><td>6-9</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FNINIT</td><td> </td><td>12-22</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FNSAVE</td><td>m</td><td>124-300</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>FRSTOR</td><td>m</td><td>70-95</td><td>np</td><td>0</td><td>0</td></tr>
+<tr><td>WAIT</td><td> </td><td>1</td><td>np</td><td>0</td><td>0</td></tr>
+</table>
+<p>
+<b>Notes:</b><br>
+m) The value to store is needed one clock cycle in advance.<br>
+n) 1 if the overlapping instruction is also an <kbd>FMUL</kbd>.<br>
+o) Cannot overlap integer multiplication instructions.<br>
+p) <kbd>FDIV</kbd> takes 19, 33, or 39 clock cycles for 24, 53, and 64 bit precision
+respectively. <kbd>FIDIV</kbd> takes 3 clocks more. The precision is defined by bit
+8-9 of the floating point control word.<br>
+q) The first 4 clock cycles can overlap with preceding integer instructions.
+See chapter <a href="#26_7">26.7</a>.<br>
+r) clock counts are typical. Trivial cases may be faster, extreme cases may
+be slower.<br>
+s) may be up to 3 clocks more when output needed for <kbd>FST</kbd>,
+<kbd>FCHS</kbd>, or <kbd>FABS</kbd>.
+<p>
+<h3><a name="28_3">28.3 MMX instructions (PMMX)</a></h3><p>
+<p>
+A list of MMX instruction timings is not needed because they all take one clock cycle,
+except the MMX multiply instructions which take 3. MMX multiply instructions can be
+overlapped and pipelined to yield a throughput of one multiplication per clock cycle.
+<p>
+The <kbd>EMMS</kbd> instruction takes only one clock cycle, but the first floating point instruction after
+an <kbd>EMMS</kbd> takes approximately 58 clocks extra, and the first MMX instruction after a floating
+point instruction takes approximately 38 clocks extra. There is no penalty for an MMX
+instruction after <kbd>EMMS</kbd> on the PMMX (but a possible small penalty on the PII and PIII).
+<p>
+There is no penalty for using a memory operand in an MMX instruction because the MMX
+arithmetic unit is one step later in the pipeline than the load unit. But the penalty comes
+when you store data from an MMX register to memory or to a 32 bit register: The data have
+to be ready one clock cycle in advance. This is analogous to the floating point store
+instructions.
+<p>
+All MMX instructions except <kbd>EMMS</kbd> are pairable in either pipe. Pairing rules for MMX
+instructions are described in chapter <a href="#10">10</a>.
+<p>
+<h2><a name="29">29</a>. List of instruction timings and micro-op breakdown for PPro, PII and PIII</h2><p>
+<b>Explanations:</b><br>
+<u>Operands:</u><br>
+r = register, m = memory, i = immediate data, sr = segment register,
+m32 = 32 bit memory operand, etc.
+<p>
+<u>Micro-ops:</u><br>
+The number of micro-ops that the instruction generates for each execution port.<br>
+p0: port 0: ALU, etc.<br>
+p1: port 1: ALU, jumps<br>
+p01: instructions that can go to either port 0 or 1, whichever is vacant first.<br>
+p2: port 2: load data, etc.<br>
+p3: port 3: address generation for store<br>
+p4: port 4: store data
+<p>
+<u>Delay:</u><br>
+This is the delay that the instruction generates in a dependency chain.
+(This is not the same as the time spent in the execution unit. Values may be
+inaccurate in situations where they cannot be measured exactly, especially with
+memory operands).
+The numbers are minimum values. Cache misses, misalignment, and exceptions
+may increase the clock counts considerably. Floating point operands are
+presumed to be normal numbers. Denormal numbers, NANs and infinity increase
+the delays by 50-150 clocks, except in XMM move, shuffle and boolean instructions.
+Floating point overflow, underflow, denormal or NAN results give a similar delay.
+<p>
+<u>Throughput:</u><br>
+The maximum throughput for several instructions of the same kind. For example, a
+throughput of 1/2 for <kbd>FMUL</kbd> means that a new <kbd>FMUL</kbd> instruction can start executing
+every 2 clock cycles.<p>
+
+<table border="1" cellpadding="4" cellspacing="1">
+<tr>
+<td colspan="10" class="a2"><a name="29_1">29.1 Integer instructions</a></td>
+</tr>
+<tr>
+<td class="a3">Instruction</td>
+<td class="a3">Operands</td>
+<td colspan="6" class="a3">micro-ops</td>
+<td class="a3">delay</td>
+<td class="a3">throughput</td>
+</tr>
+<tr><td> </td><td> </td><td class="a3">p0</td><td class="a3">p1</td>
+<td class="a3">p01</td><td class="a3">p2</td><td class="a3">p3</td><td class="a3">p4</td>
+<td> </td><td> </td></tr>
+<tr><td>NOP</td><td> </td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>MOV</td><td>r,r/i</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>MOV</td><td>r,m</td><td> </td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>MOV</td><td>m,r/i</td><td> </td><td> </td><td> </td>
+<td> </td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>MOV</td><td>r,sr</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>MOV</td><td>m,sr</td><td> </td><td> </td><td>1</td>
+<td> </td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>MOV</td><td>sr,r</td><td colspan="3">8</td>
+<td> </td><td> </td><td> </td><td>5</td><td> </td></tr>
+<tr><td>MOV</td><td>sr,m</td><td colspan="3">7</td>
+<td>1</td><td> </td><td> </td><td>8</td><td> </td></tr>
+<tr><td>MOVSX MOVZX</td><td>r,r</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>MOVSX MOVZX</td><td>r,m</td><td> </td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CMOVcc</td><td>r,r</td><td>1</td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CMOVcc</td><td>r,m</td><td>1</td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>XCHG</td><td>r,r</td><td> </td><td> </td><td>3</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>XCHG</td><td>r,m</td><td> </td><td> </td><td>4</td>
+<td>1</td><td>1</td><td>1</td><td>high b)</td><td> </td></tr>
+<tr><td>XLAT</td><td> </td><td> </td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>PUSH</td><td>r/i</td><td> </td><td> </td><td>1</td>
+<td> </td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>POP</td><td>r</td><td> </td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>POP</td><td>(E)SP</td><td> </td><td> </td><td>2</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>PUSH</td><td>m</td><td> </td><td> </td><td>1</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>POP</td><td>m</td><td> </td><td> </td><td>5</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>PUSH</td><td>sr</td><td> </td><td> </td><td>2</td>
+<td> </td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>POP</td><td>sr</td><td> </td><td> </td><td>8</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>PUSHF(D)</td><td> </td><td>3</td><td> </td><td>11</td>
+<td> </td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>POPF(D)</td><td> </td><td>10</td><td> </td><td>6</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>PUSHA(D)</td><td> </td><td> </td><td> </td><td>2</td>
+<td> </td><td>8</td><td>8</td><td> </td><td> </td></tr>
+<tr><td>POPA(D)</td><td> </td><td> </td><td> </td><td>2</td>
+<td>8</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>LAHF SAHF</td><td> </td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>LEA</td><td>r,m</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>1 c)</td><td> </td></tr>
+<tr><td>LDS LES LFS LGS LSS</td><td>m</td><td> </td><td> </td><td>8</td>
+<td>3</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>r,r/i</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>r,m</td><td> </td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>ADD SUB AND OR XOR</td><td>m,r/i</td><td> </td><td> </td><td>1</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>ADC SBB</td><td>r,r/i</td><td> </td><td> </td><td>2</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>ADC SBB</td><td>r,m</td><td> </td><td> </td><td>2</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>ADC SBB</td><td>m,r/i</td><td> </td><td> </td><td>3</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>CMP TEST</td><td>r,r/i</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CMP TEST</td><td>m,r/i</td><td> </td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>INC DEC NEG NOT</td><td>r</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>INC DEC NEG NOT</td><td>m</td><td> </td><td> </td><td>1</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>AAS DAA DAS</td><td> </td><td> </td><td>1</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>AAD</td><td> </td><td>1</td><td> </td><td>2</td>
+<td> </td><td> </td><td> </td><td>4</td><td> </td></tr>
+<tr><td>AAM</td><td> </td><td>1</td><td>1</td><td>2</td>
+<td> </td><td> </td><td> </td><td>15</td><td> </td></tr>
+<tr><td>MUL IMUL</td><td>r,(r),(i)</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>4</td><td>1/1</td></tr>
+<tr><td>MUL IMUL</td><td>(r),m</td><td>1</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>4</td><td>1/1</td></tr>
+<tr><td>DIV IDIV</td><td>r8</td><td>2</td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td>19</td><td>1/12</td></tr>
+<tr><td>DIV IDIV</td><td>r16</td><td>3</td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td>23</td><td>1/21</td></tr>
+<tr><td>DIV IDIV</td><td>r32</td><td>3</td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td>39</td><td>1/37</td></tr>
+<tr><td>DIV IDIV</td><td>m8</td><td>2</td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td>19</td><td>1/12</td></tr>
+<tr><td>DIV IDIV</td><td>m16</td><td>2</td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td>23</td><td>1/21</td></tr>
+<tr><td>DIV IDIV</td><td>m32</td><td>2</td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td>39</td><td>1/37</td></tr>
+<tr><td>CBW CWDE</td><td> </td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CWD CDQ</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>SHR SHL SAR ROR ROL</td><td>r,i/CL</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>SHR SHL SAR ROR ROL</td><td>m,i/CL</td><td>1</td><td> </td><td> </td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>RCR RCL</td><td>r,1</td><td>1</td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>RCR RCL</td><td>r8,i/CL</td><td>4</td><td> </td><td>4</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>RCR RCL</td><td>r16/32,i/CL</td><td>3</td><td> </td><td>3</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>RCR RCL</td><td>m,1</td><td>1</td><td> </td><td>2</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>RCR RCL</td><td>m8,i/CL</td><td>4</td><td> </td><td>3</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>RCR RCL</td><td>m16/32,i/CL</td><td>4</td><td> </td><td>2</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>SHLD SHRD</td><td>r,r,i/CL</td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>SHLD SHRD</td><td>m,r,i/CL</td><td>2</td><td> </td><td>1</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>BT</td><td>r,r/i</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>BT</td><td>m,r/i</td><td>1</td><td> </td><td>6</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>BTR BTS BTC</td><td>r,r/i</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>BTR BTS BTC</td><td>m,r/i</td><td>1</td><td> </td><td>6</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>BSF BSR</td><td>r,r</td><td> </td><td>1</td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>BSF BSR</td><td>r,m</td><td> </td><td>1</td><td>1</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>SETcc</td><td>r</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>SETcc</td><td>m</td><td> </td><td> </td><td>1</td>
+<td> </td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>JMP</td><td>short/near</td><td> </td><td>1</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td>1/2</td></tr>
+<tr><td>JMP</td><td>far</td><td colspan="3">21</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>JMP</td><td>r</td><td> </td><td>1</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td>1/2</td></tr>
+<tr><td>JMP</td><td>m(near)</td><td> </td><td>1</td><td> </td>
+<td>1</td><td> </td><td> </td><td> </td><td>1/2</td></tr>
+<tr><td>JMP</td><td>m(far)</td><td colspan="3">21</td>
+<td>2</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>conditional jump</td><td>short/near</td><td> </td><td>1</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td>1/2</td></tr>
+<tr><td>CALL</td><td>near</td><td> </td><td>1</td><td>1</td>
+<td> </td><td>1</td><td>1</td><td> </td><td>1/2</td></tr>
+<tr><td>CALL</td><td>far</td><td colspan="3">28</td>
+<td>1</td><td>2</td><td>2</td><td> </td><td> </td></tr>
+<tr><td>CALL</td><td>r</td><td> </td><td>1</td><td>2</td>
+<td> </td><td>1</td><td>1</td><td> </td><td>1/2</td></tr>
+<tr><td>CALL</td><td>m(near)</td><td> </td><td>1</td><td>4</td>
+<td>1</td><td>1</td><td>1</td><td> </td><td>1/2</td></tr>
+<tr><td>CALL</td><td>m (far)</td><td colspan="3">28</td>
+<td>2</td><td>2</td><td>2</td><td> </td><td> </td></tr>
+<tr><td>RETN</td><td> </td><td> </td><td>1</td><td>2</td>
+<td>1</td><td> </td><td> </td><td> </td><td>1/2</td></tr>
+<tr><td>RETN</td><td>i</td><td> </td><td>1</td><td>3</td>
+<td>1</td><td> </td><td> </td><td> </td><td>1/2</td></tr>
+<tr><td>RETF</td><td> </td><td colspan="3">23</td>
+<td>3</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>RETF</td><td>i</td><td colspan="3">23</td><td>3</td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>J(E)CXZ</td><td>short</td><td> </td><td>1</td><td>1</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>LOOP</td><td>short</td><td>2</td><td>1</td><td>8</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>LOOP(N)E</td><td>short</td><td>2</td><td>1</td><td>8</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>ENTER</td><td>i,0</td><td> </td><td> </td><td>12</td><td> </td>
+<td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>ENTER</td><td>a,b</td><td colspan="3">ca. 18+4b</td><td> </td>
+<td>b-1</td><td>2b</td><td> </td><td> </td></tr>
+<tr><td>LEAVE</td><td> </td><td> </td><td> </td><td>2</td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>BOUND</td><td>r,m</td><td>7</td><td> </td><td>6</td>
+<td>2</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CLC STC CMC</td><td> </td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CLD STD</td><td> </td><td> </td><td> </td><td>4</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CLI</td><td> </td><td colspan="3">9</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>STI</td><td> </td><td colspan="3">17</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>INTO</td><td> </td><td> </td><td> </td><td>5</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>LODS</td><td> </td><td> </td><td> </td><td> </td>
+<td>2</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>REP LODS</td><td> </td><td> </td><td> </td><td colspan="2">10+6n</td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>STOS</td><td> </td><td> </td><td> </td><td> </td>
+<td>1</td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>REP STOS</td><td> </td><td> </td><td> </td>
+<td colspan="4">ca. 5n a)</td><td> </td><td> </td></tr>
+<tr><td>MOVS</td><td> </td><td> </td><td> </td><td>1</td><td>3</td>
+<td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>REP MOVS</td><td> </td><td> </td><td> </td><td colspan="4">ca. 6n a)</td>
+<td> </td><td> </td></tr>
+<tr><td>SCAS</td><td> </td><td> </td><td> </td><td>1</td>
+<td>2</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>REP(N)E SCAS</td><td> </td><td> </td><td> </td><td colspan="2">12+7n</td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CMPS</td><td> </td><td> </td><td> </td><td>4</td>
+<td>2</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>REP(N)E CMPS</td><td> </td><td> </td><td> </td>
+<td colspan="2">12+9n</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>BSWAP</td><td> </td><td>1</td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>CPUID</td><td> </td><td colspan="3">23-48</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td></tr>
+<tr><td>RDTSC</td><td> </td><td colspan="3">31</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>IN</td><td> </td><td colspan="3">18</td>
+<td> </td><td> </td><td> </td><td>>300</td><td> </td></tr>
+<tr><td>OUT</td><td> </td><td colspan="3">18</td>
+<td> </td><td> </td><td> </td><td>>300</td><td> </td></tr>
+<tr><td>PREFETCHNTA d)</td><td>m</td><td> </td>
+<td> </td><td> </td><td> 1</td><td> </td><td>
+ </td><td> </td><td> </td></tr>
+<tr><td>PREFETCHT0 d)</td><td>m</td><td> </td><td> </td><td> </td><td> 1</td><td> </td>
+<td> </td><td> </td><td> </td></tr>
+<tr><td>PREFETCHT1 d)</td><td>m</td><td> </td><td> </td>
+<td> </td><td> 1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>PREFETCHT2 d)</td><td>m</td><td> </td><td> </td><td> </td><td> 1</td><td> </td><td>
+ </td><td> </td><td> </td></tr>
+<tr><td>SFENCE d)</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> 1</td><td>
+ 1</td><td> </td><td>1/6</td></tr>
+</TABLE><p>
+<b>Notes:</b><br>
+a) faster under certain conditions: see chapter <a href="#26_3">26.3</a>.<br>
+b) see chapter <a href="#26_1">26.1</a><br>
+c) 3 if constant without base or index register<br>
+d) PIII only.
+<p>
+
+<table border="1" cellpadding="4" cellspacing="1">
+<tr>
+<td colspan="10" class="a2"><a name="29_2">29.2 Floating point instructions</a></td>
+</tr>
+<tr>
+<td class="a3">Instruction</td>
+<td class="a3">Operands</td>
+<td colspan="6" align="center" class="a3">micro-ops</td>
+<td class="a3">delay</td>
+<td class="a3">throughput</td>
+</tr>
+<tr>
+<td> </td>
+<td> </td>
+<td class="a4">p0</td>
+<td class="a4">p1</td>
+<td class="a4">p01</td>
+<td class="a4">p2</td>
+<td class="a4">p3</td>
+<td class="a4">p4</td>
+<td> </td>
+<td> </td>
+</tr>
+<tr><td>FLD</td><td>r</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FLD</td><td>m32/64</td><td> </td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>1</td><td> </td></tr>
+<tr><td>FLD</td><td>m80</td><td>2</td><td> </td><td> </td>
+<td>2</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FBLD</td><td>m80</td><td>38</td><td> </td><td> </td>
+<td>2</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FST(P)</td><td>r</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FST(P)</td><td>m32/m64</td><td> </td><td> </td><td> </td>
+<td> </td><td>1</td><td>1</td><td>1</td><td> </td></tr>
+<tr><td>FSTP</td><td>m80</td><td>2</td><td> </td><td> </td>
+<td> </td><td>2</td><td>2</td><td> </td><td> </td></tr>
+<tr><td>FBSTP</td><td>m80</td><td>165</td><td> </td><td> </td>
+<td> </td><td>2</td><td>2</td><td> </td><td> </td></tr>
+<tr><td>FXCH</td><td>r</td><td> </td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>0</td><td>3/1 f)</td></tr>
+<tr><td>FILD</td><td>m</td><td>3</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>5</td><td> </td></tr>
+<tr><td>FIST(P)</td><td>m</td><td>2</td><td> </td><td> </td>
+<td> </td><td>1</td><td>1</td><td>5</td><td> </td></tr>
+<tr><td>FLDZ</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td colspan="2">FLD1 FLDPI FLDL2E etc.</td><td>2</td><td> </td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FCMOVcc</td><td>r</td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>2</td><td> </td></tr>
+<tr><td>FNSTSW</td><td>AX</td><td>3</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>7</td><td> </td></tr>
+<tr><td>FNSTSW</td><td>m16</td><td>1</td><td> </td><td> </td>
+<td> </td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>FLDCW</td><td>m16</td><td>1</td><td> </td><td>1</td>
+<td>1</td><td> </td><td> </td><td>10</td><td> </td></tr>
+<tr><td>FNSTCW</td><td>m16</td><td>1</td><td> </td><td> </td>
+<td> </td><td>1</td><td>1</td><td> </td><td> </td></tr>
+<tr><td>FADD(P) FSUB(R)(P)</td><td>r</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>FADD(P) FSUB(R)(P)</td><td>m</td><td>1</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>3-4</td><td>1/1</td></tr>
+<tr><td>FMUL(P)</td><td>r</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>5</td><td>1/2 g)</td></tr>
+<tr><td>FMUL(P)</td><td>m</td><td>1</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>5-6</td><td>1/2 g)</td></tr>
+<tr><td>FDIV(R)(P)</td><td>r</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>38 h)</td><td>1/37</td></tr>
+<tr><td>FDIV(R)(P)</td><td>m</td><td>1</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>38 h)</td><td>1/37</td></tr>
+<tr><td>FABS</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FCHS</td><td> </td><td>3</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>2</td><td> </td></tr>
+<tr><td>FCOM(P) FUCOM</td><td>r</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>1</td><td> </td></tr>
+<tr><td>FCOM(P) FUCOM</td><td>m</td><td>1</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>1</td><td> </td></tr>
+<tr><td>FCOMPP FUCOMPP</td><td> </td><td>1</td><td> </td><td>1</td>
+<td> </td><td> </td><td> </td><td>1</td><td> </td></tr>
+<tr><td>FCOMI(P) FUCOMI(P)</td><td>r</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>1</td><td> </td></tr>
+<tr><td>FCOMI(P) FUCOMI(P)</td><td>m</td><td>1</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>1</td><td> </td></tr>
+<tr><td>FIADD FISUB(R)</td><td>m</td><td>6</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FIMUL</td><td>m</td><td>6</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FIDIV(R)</td><td>m</td><td>6</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FICOM(P)</td><td>m</td><td>6</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FTST</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>1</td><td> </td></tr>
+<tr><td>FXAM</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>2</td><td> </td></tr>
+<tr><td>FPREM</td><td> </td><td>23</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FPREM1</td><td> </td><td>33</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FRNDINT</td><td> </td><td>30</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FSCALE</td><td> </td><td>56</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FXTRACT</td><td> </td><td>15</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FSQRT</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>69</td><td>e,i)</td></tr>
+<tr><td>FSIN FCOS</td><td> </td><td colspan="3">17-97</td><td> </td><td> </td>
+<td> </td><td>27-103</td><td>e)</td></tr>
+<tr><td>FSINCOS</td><td> </td><td colspan="3">18-110</td><td> </td><td> </td>
+<td> </td><td>29-130</td><td>e)</td></tr>
+<tr><td>F2XM1</td><td> </td><td colspan="3">17-48</td><td> </td><td> </td>
+<td> </td><td>66</td><td>e)</td></tr>
+<tr><td>FYL2X</td><td> </td><td colspan="3">36-54</td><td> </td>
+<td> </td><td> </td><td>103</td><td>e)</td></tr>
+<tr><td>FYL2XP1</td><td> </td><td colspan="3">31-53</td><td> </td>
+<td> </td><td> </td><td>98-107</td><td>e)</td></tr>
+<tr><td>FPTAN</td><td> </td><td colspan="3">21-102</td><td> </td>
+<td> </td><td> </td><td>13-143</td><td>e)</td></tr>
+<tr><td>FPATAN</td><td> </td><td colspan="3">25-86</td><td> </td>
+<td> </td><td> </td><td>44-143</td><td>e)</td></tr>
+<tr><td>FNOP</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FINCSTP FDECSTP</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FFREE</td><td>r</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FFREEP</td><td>r</td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FNCLEX</td><td> </td><td> </td><td> </td><td>3</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FNINIT</td><td> </td><td colspan="3">13</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FNSAVE</td><td> </td><td colspan="3">141</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>FRSTOR</td><td> </td><td colspan="3">72</td><td> </td>
+<td> </td><td> </td><td> </td><td> </td></tr>
+<tr><td>WAIT</td><td> </td><td> </td><td> </td><td>2</td>
+<td> </td><td> </td><td> </td><td> </td><td> </td></tr>
+</table>
+
+<p><b>Notes:</b><br>
+e) not pipelined<br>
+f) <kbd>FXCH</kbd> generates 1 micro-op that is resolved by register renaming without
+ going to any port.<br>
+g) <kbd>FMUL</kbd> uses the same circuitry as integer multiplication. Therefore, the
+ combined throughput of mixed floating point and integer multiplications is
+ 1 <kbd>FMUL</kbd> + 1 <kbd>IMUL</kbd> per 3 clock cycles.<br>
+h) <kbd>FDIV</kbd> delay depends on precision specified in control word:
+ precision 64 bits gives delay 38, precision 53 bits gives delay 32,
+ precision 24 bits gives delay 18. Division by a power of 2 takes 9 clocks.
+ Throughput is 1/(delay-1).<br>
+i) faster for lower precision.
+<p>
+
+<table border=1 cellpadding=4 cellspacing=1><tr>
+<td colspan="10" class="a2"><a name="29_3">29.3 MMX instructions (PII and PIII)</a></td></tr>
+<tr><td class="a3">Instruction</td>
+<td class="a3">Operands</td>
+<td colspan="6" align="center" class="a3">micro-ops</td>
+<td class="a3">delay</td>
+<td class="a3">throughput</td></tr>
+<tr><td> </td><td> </td>
+<td class="a4">p0</td><td class="a4">p1</td><td class="a4">p01</td>
+<td class="a4">p2</td><td class="a4">p3</td><td class="a4">p4</td>
+<td> </td><td> </td></tr>
+<tr><td>MOVD MOVQ</td><td>r,r</td>
+<td> </td><td> </td><td>1</td><td> </td><td>
+</td><td> </td><td> </td><td>2/1</td></tr>
+<tr><td>MOVD MOVQ</td><td>r64,m32/64</td>
+<td> </td><td> </td><td> </td><td>1</td><td>
+</td><td> </td><td> </td><td>1/1</td></tr>
+<tr><td>MOVD MOVQ</td><td>m32/64,r64</td><td>
+</td><td> </td><td> </td><td> </td><td>1</td><td>
+1</td><td> </td><td>1/1</td></tr>
+<tr><td>PADD PSUB PCMP</td><td>r64,r64</td>
+<td> </td><td> </td><td>1</td><td> </td><td>
+</td><td> </td><td> </td><td>1/1</td></tr>
+<tr><td>PADD PSUB PCMP</td><td>r64,m64</td>
+<td> </td><td> </td><td>1</td><td>1</td><td>
+</td><td> </td><td> </td><td>1/1</td></tr>
+<tr><td>PMUL PMADD</td><td>r64,r64</td>
+<td>1</td><td> </td><td> </td><td> </td><td>
+</td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>PMUL PMADD</td><td>r64,m64</td>
+<td>1</td><td> </td><td> </td><td>1</td><td>
+</td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>PAND PANDN POR <br>PXOR</td>
+<td>r64,r64</td><td> </td><td> </td><td>1</td><td>
+</td><td> </td><td> </td><td> </td><td>2/1</td></tr>
+<tr><td>PAND PANDN POR<br>PXOR</td><td>r64,m64</td>
+<td> </td><td> </td><td>1</td><td>1</td><td>
+</td><td> </td><td> </td><td>1/1</td></tr>
+<tr><td>PSRA PSRL PSLL</td><td>r64,r64/i</td>
+<td> </td><td>1</td><td> </td><td> </td><td>
+</td><td> </td><td> </td><td>1/1</td></tr>
+<tr><td>PSRA PSRL PSLL</td><td>r64,m64</td>
+<td> </td><td>1</td><td> </td><td>1</td><td>
+</td><td> </td><td> </td><td>1/1</td></tr>
+<tr><td>PACK PUNPCK</td><td>r64,r64</td>
+<td> </td><td>1</td><td> </td><td> </td><td>
+</td><td> </td><td> </td><td>1/1</td></tr>
+<tr><td>PACK PUNPCK</td><td>r64,m64</td>
+<td> </td><td>1</td><td> </td><td>1</td><td>
+</td><td> </td><td> </td><td>1/1</td></tr>
+<tr><td>EMMS</td><td> </td><td colspan="3">11</td><td> </td><td>
+</td><td> </td><td>6 k)</td><td> </td></tr>
+<tr><td>MASKMOVQ d)</td><td>r64,r64</td><td> </td><td> </td><td> 1</td><td> </td>
+<td> 1</td><td> 1</td><td>2-8</td><td>1/30-1/2</td></tr>
+<tr><td>PMOVMSKB d)</td><td>r32,r64</td><td> </td><td> 1</td><td> </td><td> </td>
+<td> </td><td> </td><td> 1</td><td> 1/1</td></tr>
+<tr><td>MOVNTQ d)</td><td>m64,r64</td><td> </td><td> </td><td> </td><td> </td>
+<td> 1</td><td> 1</td><td> </td><td>1/30-1/1</td></tr>
+<tr><td>PSHUFW d)</td><td>r64,r64,i</td><td> </td><td> 1</td><td> </td><td> </td>
+<td> </td><td> </td><td> 1</td><td> 1/1</td></tr>
+<tr><td>PSHUFW d)</td><td>r64,m64,i</td><td> </td><td> 1</td><td> </td><td> 1</td>
+<td> </td><td> </td><td> 2</td><td> 1/1</td></tr>
+<tr><td>PEXTRW d)</td><td>r32,r64,i</td><td> </td><td> 1</td><td> 1</td><td> </td>
+<td> </td><td> </td><td> 2</td><td> 1/1</td></tr>
+<tr><td>PISRW d)</td><td>r64,r32,i</td><td> </td><td> 1</td><td> </td><td> </td>
+<td> </td><td> </td><td> 1</td><td> 1/1</td></tr>
+<tr><td>PISRW d)</td><td>r64,m16,i</td><td> </td><td> 1</td><td> </td><td> 1</td>
+<td> </td><td> </td><td> 2</td><td> 1/1</td></tr>
+<tr><td>PAVGB PAVGW d)</td><td>r64,r64</td><td> </td><td> </td><td> 1</td><td> </td>
+<td> </td><td> </td><td> 1</td><td> 2/1</td></tr>
+<tr><td>PAVGB PAVGW d)</td><td>r64,m64</td><td> </td><td> </td><td> 1</td><td> 1</td>
+<td> </td><td> </td><td> 2</td><td> 1/1</td></tr>
+<tr><td>PMINUB PMAXUB PMINSW PMAXSW d)</td><td>r64,r64</td><td> </td><td> </td><td> 1</td><td> </td>
+<td> </td><td> </td><td> 1</td><td> 2/1</td></tr>
+<tr><td>PMINUB PMAXUB PMINSW PMAXSW d)</td><td>r64,m64</td><td> </td><td> </td><td> 1</td><td> 1</td>
+<td> </td><td> </td><td> 2</td><td> 1/1</td></tr>
+<tr><td>PMULHUW d)</td><td>r64,r64</td><td> 1</td><td> </td><td> </td><td> </td>
+<td> </td><td> </td><td> 3</td><td> 1/1</td></tr>
+<tr><td>PMULHUW d)</td><td>r64,m64</td><td> 1</td><td> </td><td> </td><td> 1</td>
+<td> </td><td> </td><td> 4</td><td> 1/1</td></tr>
+<tr><td>PSADBW d)</td><td>r64,r64</td><td> 2</td><td> </td><td> 1</td><td> </td>
+<td> </td><td> </td><td> 5</td><td> 1/2</td></tr>
+<tr><td>PSADBW d)</td><td>r64,m64</td><td> 2</td><td> </td><td> 1</td><td> 1</td>
+<td> </td><td> </td><td> 6</td><td> 1/2</td></tr>
+</table><p>
+<b>Notes:</b><br>
+d) PIII only.<br>
+k) you may hide the delay by inserting other instructions between <kbd>EMMS</kbd> and any
+subsequent floating point instruction.
+<p>
+<table border="1" callpadding="4" cellspacing="1"><tr>
+<td colspan="10" class="a2"><a name="29_4">29.4 XMM instructions (PIII)</a></td></tr>
+<tr><td class="a3">Instruction</td>
+<td class="a3">Operands</td>
+<td colspan="6" align="center" class="a3">micro-ops</td>
+<td class="a3">delay</td>
+<td class="a3">throughput</td></tr>
+<tr><td> </td><td> </td>
+<td class="a4"> p0 </td><td class="a4"> p1 </td>
+<td class="a4"> p01 </td><td class="a4"> p2 </td>
+<td class="a4"> p3 </td><td class="a4"> p4 </td>
+<td> </td><td> </td></tr>
+<tr><td>MOVAPS</td><td>r128,r128</td><td> </td><td> </td><td>2</td><td> </td><td>
+</td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVAPS</td><td>r128,m128</td>
+<td> </td><td> </td><td> </td><td>2</td><td>
+</td><td> </td><td>2</td><td>1/2</td></tr>
+<tr><td>MOVAPS</td><td>m128,r128</td><td> </td><td> </td><td> </td><td> </td>
+<td>2</td><td>2</td><td>3</td><td>1/2</td></tr>
+<tr><td>MOVUPS</td><td>r128,m128</td><td> </td><td> </td><td> </td><td>4</td>
+<td> </td><td> </td><td>2</td><td>1/4</td></tr>
+<tr><td>MOVUPS</td><td>m128,r128</td><td> </td><td>1</td><td> </td><td> </td><td>4</td>
+<td>4</td><td>3</td><td>1/4</td></tr>
+<tr><td>MOVSS</td><td>r128,r128</td><td> </td><td> </td><td>1</td><td> </td>
+<td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVSS</td><td>r128,m32</td><td> </td><td> </td><td>1</td><td>1</td>
+<td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVSS</td><td>m32,r128</td><td> </td><td> </td><td> </td><td> </td><td>1</td>
+<td>1</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVHPS MOVLPS</td><td>r128,m64</td><td> </td><td> </td><td>1</td><td> </td>
+<td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVHPS MOVLPS</td><td>m64,r128</td><td> </td><td> </td><td> </td><td> </td>
+<td>1</td><td>1</td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVLHPS MOVHLPS</td><td>r128,r128</td><td> </td><td> </td><td>1</td><td> </td>
+<td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVMSKPS</td><td>r32,r128</td><td>1</td><td> </td><td> </td><td> </td>
+<td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>MOVNTPS</td><td>m128,r128</td><td> </td><td> </td><td> </td>
+<td> </td><td> 2</td><td> 2</td><td> </td><td>1/15-1/2</td></tr>
+<tr><td>CVTPI2PS</td><td>r128,r64</td><td> </td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>CVTPI2PS</td><td>r128,m64</td><td> </td><td>2</td><td> </td><td>1</td>
+<td> </td><td> </td><td>4</td><td>1/2</td></tr>
+<tr><td>CVTPS2PI CVTTPS2PI</td><td>r64,r128</td><td> </td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>CVTPS2PI</td><td>r64,m128</td><td> </td><td>1</td><td> </td><td>2</td>
+<td> </td><td> </td><td>4</td><td>1/1</td></tr>
+<tr><td>CVTSI2SS</td><td>r128,r32</td><td> </td><td>2</td><td> </td><td>1</td>
+<td> </td><td> </td><td>4</td><td>1/2</td></tr>
+<tr><td>CVTSI2SS</td><td>r128,m32</td><td> </td><td>2</td><td> </td><td>2</td>
+<td> </td><td> </td><td>5</td><td>1/2</td></tr>
+<tr><td>CVTSS2SI CVTTSS2SI</td><td>r32,r128</td><td> </td><td>1</td><td> </td>
+<td>1</td><td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>CVTSS2SI</td><td>r32,m128</td><td> </td><td>1</td><td> </td>
+<td>2</td><td> </td><td> </td><td>4</td><td>1/2</td></tr>
+<tr><td>ADDPS SUBPS</td><td>r128,r128</td><td> </td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>ADDPS SUBPS</td><td>r128,m128</td><td> </td><td>2</td><td> </td><td>2</td>
+<td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>ADDSS SUBSS</td><td>r128,r128</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>ADDSS SUBSS</td><td>r128,m32</td><td> </td><td>1</td><td> </td><td>1</td>
+<td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>MULPS</td><td>r128,r128</td><td>2</td><td> </td><td> </td><td> </td>
+<td> </td><td> </td><td>4</td><td>1/2</td></tr>
+<tr><td>MULPS</td><td>r128,m128</td><td>2</td><td> </td><td> </td><td>2</td>
+<td> </td><td> </td><td>4</td><td>1/2</td></tr>
+<tr><td>MULSS</td><td>r128,r128</td><td>1</td><td> </td><td> </td><td> </td>
+<td> </td><td> </td><td>4</td><td>1/1</td></tr>
+<tr><td>MULSS</td><td>r128,m32</td><td>1</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td>4</td><td>1/1</td></tr>
+<tr><td>DIVPS</td><td>r128,r128</td><td>2</td><td> </td><td> </td><td> </td>
+<td> </td><td> </td><td>48</td><td>1/34</td></tr>
+<tr><td>DIVPS</td><td>r128,m128</td><td>2</td><td> </td><td> </td><td>2</td>
+<td> </td><td> </td><td>48</td><td>1/34</td></tr>
+<tr><td>DIVSS</td><td>r128,r128</td><td>1</td><td> </td><td> </td><td> </td>
+<td> </td><td> </td><td>18</td><td>1/17</td></tr>
+<tr><td>DIVSS</td><td>r128,m32</td><td>1</td><td> </td><td> </td><td>1</td>
+<td> </td><td> </td><td>18</td><td>1/17</td></tr>
+<tr><td>ANDPS ANDNPS ORPS XORPS</td><td>r128,r128</td><td> </td><td>2</td><td> </td>
+<td> </td><td> </td><td> </td><td>2</td><td>1/2</td></tr>
+<tr><td>ANDPS ANDNPS ORPS XORPS</td><td>r128,m128</td><td> </td><td>2</td><td> </td>
+<td>2</td><td> </td><td> </td><td>2</td><td>1/2</td></tr>
+<tr><td>MAXPS MINPS</td><td>r128,r128</td><td> </td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td>3</td><td>1/2</td> </tr>
+<tr><td>MAXPS MINPS</td><td>r128,m128</td><td> </td><td>2</td><td> </td><td>2</td>
+<td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>MAXSS MINSS</td><td>r128,r128</td><td> </td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>MAXSS MINSS</td><td>r128,m32</td><td> </td><td>1</td><td> </td><td>1</td>
+<td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>CMPccPS</td><td>r128,r128</td><td> </td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>CMPccPS</td><td>r128,m128</td><td> </td><td>2</td><td> </td><td>2</td>
+<td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>CMPccSS</td><td>r128,r128</td><td> </td><td>1</td><td> </td><td>1</td>
+<td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>CMPccSS</td><td>r128,m32</td><td> </td><td>1</td><td> </td>
+<td>1</td><td> </td><td> </td><td>3</td><td>1/1</td></tr>
+<tr><td>COMISS UCOMISS</td><td>r128,r128</td><td> </td><td>1</td><td> </td>
+<td> </td><td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>COMISS UCOMISS</td><td>r128,m32</td><td> </td><td>1</td>
+<td> </td><td>1</td><td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>SQRTPS</td><td>r128,r128</td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>56</td><td>1/56</td></tr>
+<tr><td>SQRTPS</td><td>r128,m128</td><td>2</td><td> </td><td> </td>
+<td>2</td><td> </td><td> </td><td>57</td><td>1/56</td></tr>
+<tr><td>SQRTSS</td><td>r128,r128</td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>30</td><td>1/28</td></tr>
+<tr><td>SQRTSS</td><td>r128,m32</td><td>2</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>31</td><td>1/28</td></tr>
+<tr><td>RSQRTPS</td><td>r128,r128</td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>2</td><td>1/2</td></tr>
+<tr><td>RSQRTPS</td><td>r128,m128</td><td>2</td><td> </td><td> </td>
+<td>2</td><td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>RSQRTSS</td><td>r128,r128</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>RSQRTSS</td><td>r128,m32</td><td>1</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>2</td><td>1/1</td></tr>
+<tr><td>RCPPS</td><td>r128,r128</td><td>2</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>2</td><td>1/2</td></tr>
+<tr><td>RCPPS</td><td>r128,m128</td><td>2</td><td> </td><td> </td>
+<td>2</td><td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>RCPSS</td><td>r128,r128</td><td>1</td><td> </td><td> </td>
+<td> </td><td> </td><td> </td><td>1</td><td>1/1</td></tr>
+<tr><td>RCPSS</td><td>r128,m32</td><td>1</td><td> </td><td> </td>
+<td>1</td><td> </td><td> </td><td>2</td><td>1/1</td></tr>
+<tr><td>SHUFPS</td><td>r128,r128,i</td><td> </td><td>2</td><td>1</td>
+<td> </td><td> </td><td> </td><td>2</td><td>1/2</td></tr>
+<tr><td>SHUFPS</td><td>r128,m128,i</td><td> </td><td>2</td><td> </td>
+<td>2</td><td> </td><td> </td><td>2</td><td>1/2</td></tr>
+<tr><td>UNPCKHPS UNPCKLPS</td><td>r128,r128</td><td> </td><td>2</td>
+<td>2</td><td> </td><td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>UNPCKHPS UNPCKLPS</td><td>r128,m128</td><td> </td><td>2</td>
+<td> </td><td>2</td><td> </td><td> </td><td>3</td><td>1/2</td></tr>
+<tr><td>LDMXCSR</td><td>m32</td><td colspan="3">11</td>
+<td> </td><td> </td><td> </td><td>15</td><td>1/15</td></tr>
+<tr><td>STMXCSR</td><td>m32</td><td colspan="3">6</td>
+<td> </td><td> </td><td> </td><td>7</td><td>1/9</td></tr>
+<tr><td>FXSAVE</td><td>m4096</td><td colspan="3">116</td>
+<td> </td><td> </td><td> </td><td>62</td><td> </td></tr>
+<tr><td>FXRSTOR</td><td>m4096</td><td colspan="3">89</td>
+<td> </td><td> </td><td> </td><td>68</td><td> </td></tr>
+</table>
+<p>
+<h2><a name="30">30</a>. Testing speed</h2><p>
+The Pentium family of processors have an internal 64 bit clock counter which can be read
+into <kbd>EDX:EAX</kbd> using the instruction <kbd>RDTSC</kbd>
+(read time stamp counter). This is very useful for
+testing exactly how many clock cycles a piece of code takes.
+<p>
+The program below is useful for measuring the number of clock cycles a piece of code
+takes. The program executes the code to test 10 times and stores the 10 clock counts.
+The program can be used in both 16 and 32 bit mode on the PPlain and PMMX:
+<pre>;************ Test program for PPlain and PMMX: ********************
+
+ITER EQU 10 ; number of iterations
+OVERHEAD EQU 15 ; 15 for PPlain, 17 for PMMX
+
+RDTSC MACRO ; define RDTSC instruction
+ DB 0FH,31H
+ENDM
+;************ Data segment: ********************
+.DATA ; data segment
+ALIGN 4
+COUNTER DD 0 ; loop counter
+TICS DD 0 ; temporary storage of clock
+RESULTLIST DD ITER DUP (0) ; list of test results
+;************ Code segment: ********************
+.CODE ; code segment
+BEGIN: MOV [COUNTER],0 ; reset loop counter
+TESTLOOP: ; test loop
+;************ Do any initializations here: ********************
+ FINIT
+;************ End of initializations ********************
+ RDTSC ; read clock counter
+ MOV [TICS],EAX ; save count
+ CLD ; non-pairable filler
+REPT 8
+ NOP ; eight NOP's to avoid shadowing effect
+ENDM
+
+;************ Put instructions to test here: ********************
+ FLDPI ; this is only an example
+ FSQRT
+ RCR EBX,10
+ FSTP ST
+;***************** End of instructions to test ********************
+
+ CLC ; non-pairable filler with shadow
+ RDTSC ; read counter again
+ SUB EAX,[TICS] ; compute difference
+ SUB EAX,OVERHEAD ; subtract clocks used by fillers etc.
+ MOV EDX,[COUNTER] ; loop counter
+ MOV [RESULTLIST][EDX],EAX ; store result in table
+ ADD EDX,TYPE RESULTLIST ; increment counter
+ MOV [COUNTER],EDX ; store counter
+ CMP EDX,ITER * (TYPE RESULTLIST)
+ JB TESTLOOP ; repeat ITER times
+
+; insert here code to read out the values in RESULTLIST</pre>
+<p>
+The 'filler' instructions before and after the piece of code to test are are
+included in order to get consistent results on the PPlain. The <kbd>CLD</kbd>
+is a non-pairable instruction which has been inserted to make sure the pairing
+is the same the first time as the subsequent times. The
+eight <kbd>NOP</kbd> instructions are inserted to prevent any prefixes in the
+code to test to be decoded in the shadow of the preceding instructions on
+the PPlain. Single byte instructions are used here to obtain the same pairing
+the first time as the subsequent times. The <kbd>CLC</kbd> after the
+code to test is a non-pairable instruction which has a shadow under which
+the <kbd>0FH</kbd> prefix of the <kbd>RDTSC</kbd> can be decoded so that
+it is independent of any shadowing effect from the code
+to test on the PPlain.
+<p>
+On The PMMX you may want to insert <kbd>XOR EAX,EAX / CPUID</kbd>
+before the instructions to test if you want the FIFO instruction buffer
+to be empty, or some time-consuming instruction
+(f.ex. <kbd>CLI</kbd> or <kbd>AAD</kbd>) if you want the FIFO buffer to
+be full (<kbd>CPUID</kbd> has no shadow under which
+prefixes of subsequent instructions can decode).
+<p>
+On the PPro, PII and PIII you have to insert <kbd>XOR EAX,EAX / CPUID</kbd>
+before and after each <kbd>RDTSC</kbd> to prevent it from executing
+in parallel with anything else, and remove the filler
+instructions. (<kbd>CPUID</kbd> is a serializing instruction which means
+that it flushes the pipeline and waits for all pending operations to
+finish before proceeding. This is useful for testing purposes.)
+<p>
+The <kbd>RDTSC</kbd> instruction cannot execute in virtual mode on the
+PPlain and PMMX, so if you are running DOS programs you must run
+in real mode. (Press F8 while booting and select
+"safe mode command prompt only" or "bypass startup files").
+<p>
+The complete test program is available from <a href="http://www.agner.org/assem/">www.agner.org/assem/</a>.
+<p>
+The Pentium processors have special performance monitor counters which can count
+events such as cache misses, misalignments, various stalls, etc. Details about how to use the
+performance monitor counters are not covered by this manual but can be found in
+"Intel Architecture Software Developer's Manual", vol. 3, Appendix A.
+<p>
+<h2><a name="31">31</a>. Comparison of the different microprocessors</h2><p>
+The following table summarizes some important differences between the microprocessors in
+the Pentium family:
+<p>
+
+<table border=1 cellpadding=4 cellspacing=1>
+<tr><td> </td>
+<td class="a3"> PPlain </td>
+<td class="a3"> PMMX </td>
+<td class="a3"> PPro </td>
+<td class="a3"> PII </td>
+<td class="a3"> PIII </td>
+</tr><tr>
+<td>code cache, kb</td>
+<td>8</td>
+<td>16</td>
+<td>8</td>
+<td>16</td>
+<td>16</td>
+</tr><tr>
+<td>data cache, kb</td>
+<td>8</td>
+<td>16</td>
+<td>8</td>
+<td>16</td>
+<td>16</td>
+</tr><tr>
+<td>built in level 2 cache, kb</td>
+<td>0</td>
+<td>0</td>
+<td>256</td>
+<td>512 *)</td>
+<td>512 *)</td></tr>
+<tr>
+<td>MMX instructions</td>
+<td>no</td>
+<td>yes</td>
+<td>no</td>
+<td>yes</td>
+<td>yes</td></tr>
+<tr>
+<td>XMM instructions</td>
+<td>no</td>
+<td>no</td>
+<td>no</td>
+<td>no</td>
+<td>yes</td></tr>
+<tr>
+<td>conditional move instructruct.</td>
+<td>no</td>
+<td>no</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+</tr><tr>
+<td>out of order execution</td>
+<td>no</td>
+<td>no</td>
+<td>yes</td>
+<td>yes</td>
+<td>yes</td>
+</tr><tr>
+<td>branch prediction</td>
+<td>poor</td>
+<td>good</td>
+<td>good</td>
+<td>good</td>
+<td>good</td>
+</tr><tr>
+<td>branch target buffer entries</td>
+<td>256</td>
+<td>256</td>
+<td>512</td>
+<td>512</td>
+<td>512</td>
+</tr><tr>
+<td>return stack buffer size</td>
+<td>0</td>
+<td>4</td>
+<td>16</td>
+<td>16</td>
+<td>16</td>
+</tr><tr>
+<td>branch misprediction penalty</td>
+<td>3-4</td>
+<td>4-5</td>
+<td>10-20</td>
+<td>10-20</td>
+<td>10-20</td>
+</tr><tr>
+<td>partial register stall</td>
+<td>0</td>
+<td>0</td>
+<td>5</td>
+<td>5</td>
+<td>5</td>
+</tr><tr>
+<td>FMUL latency</td>
+<td>3</td>
+<td>3</td>
+<td>5</td>
+<td>5</td>
+<td>5</td>
+</tr><tr>
+<td>FMUL throughput</td>
+<td>1/2</td>
+<td>1/2</td>
+<td>1/2</td>
+<td>1/2</td>
+<td>1/2</td>
+</tr><tr>
+<td>IMUL latency</td>
+<td>9</td>
+<td>9</td>
+<td>4</td>
+<td>4</td>
+<td>4</td>
+</tr><tr>
+<td>IMUL throughput</td>
+<td>1/9</td>
+<td>1/9</td>
+<td>1/1</td>
+<td>1/1</td>
+<td>1/1</td>
+</tr></table>
+<p>*) Celeron: 0-128, Xeon: 512 or more, many other variants available.
+On some versions the level 2 cache runs at half speed.
+<p>
+<u>Comments to the table:</u><br>
+Code cache size is important if the critical part of your program is not limited to a small
+memory space.
+<p>
+Data cache size is important for all programs that handle more than small amounts of data
+in the critical part.
+<p>
+MMX and XMM instructions are useful for programs that handle massively parallel
+data, such as sound and image processing. In other applications it may not be
+possible to take advantage of the MMX and XMM instructions.
+<p>
+Conditional move instructructions are useful for avoiding poorly predictable conditional
+jumps.
+<p>
+Out of order execution improves performance, especially on non-optimized code. It includes
+automatic instruction reordering and register renaming.
+<p>
+Processors with a good branch prediction method can predict simple repetitive patterns. A
+good branch prediction is most important if the branch misprediction penalty is high.
+<p>
+A return stack buffer improves prediction of return instructions when a subroutine is called
+alternatingly from different locations.
+<p>
+Partial register stalls make handling of mixed data sizes (8, 16, 32 bit) more difficult.
+<p>
+The latency of a multiplication instruction is the time it takes in a dependency chain. A
+throughput of 1/2 means that the execution can be pipelined so that a new multiplication
+can begin every second clock cycle. This defines the speed for handling parallel data.
+<p>
+Most of the optimizations described in this document have little or no negative effects on
+other microprocessors, including non-Intel processors, but there are some problems to be
+aware of.
+<p>
+Scheduling floating point code for the PPlain and PMMX often requires a lot of
+extra <kbd>FXCH</kbd> instructions. This will slow down execution on older microprocessors, but not on the
+Pentium family and advanced non-Intel processors.
+<p>
+Taking advantage of the MMX instructions in the PMMX, PII and PIII processors or the
+conditional moves in the PPro, PII and PIII will create problems if you want your code to be
+compatible with earlier microprocessors. The solution may be to write several versions of
+your code, each optimized for a particular processor. Your program should detect which
+processor it is running on and select the appropriate version of code
+(chapter <a href="#27_10">27.10</a>).
+<p>
+</body>
+</html>
+
diff --git a/programs/testsuites b/programs/testsuites new file mode 100644 index 0000000..dce0c2e --- /dev/null +++ b/programs/testsuites @@ -0,0 +1,2 @@ +http://www.fortunecity.de/wolkenkratzer/apple/28/chess.html + diff --git a/programs/uniacke.ps b/programs/uniacke.ps new file mode 100644 index 0000000..63abc46 --- /dev/null +++ b/programs/uniacke.ps @@ -0,0 +1,12175 @@ +%!PS-Adobe-2.0 +%%Creator: dvips 5.512 Copyright 1986, 1993 Radical Eye Software +%%Title: uniacke.dvi +%%CreationDate: Thu May 18 00:16:31 1995 +%%Pages: 238 +%%PageOrder: Ascend +%%BoundingBox: 0 0 596 842 +%%EndComments +%DVIPSCommandLine: dvips -o uniacke.ps uniacke +%DVIPSSource: TeX output 1995.05.18:0011 +%%BeginProcSet: tex.pro +/TeXDict 250 dict def TeXDict begin /N{def}def /B{bind def}N /S{exch}N /X{S N} +B /TR{translate}N /isls false N /vsize 11 72 mul N /@rigin{isls{[0 -1 1 0 0 0] +concat}if 72 Resolution div 72 VResolution div neg scale isls{Resolution hsize +-72 div mul 0 TR}if Resolution VResolution vsize -72 div 1 add mul TR matrix +currentmatrix dup dup 4 get round 4 exch put dup dup 5 get round 5 exch put +setmatrix}N /@landscape{/isls true N}B /@manualfeed{statusdict /manualfeed +true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N /FBB[0 0 0 0]N /nn 0 N +/IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin /FontType 3 N /FontMatrix +fntrx N /FontBBox FBB N string /base X array /BitMaps X /BuildChar{ +CharBuilder}N /Encoding IE N end dup{/foo setfont}2 array copy cvx N load 0 nn +put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail}B /dfs{div /sf X /fntrx[sf 0 +0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont setfont}B /ch-width{ch-data +dup length 5 sub get}B /ch-height{ch-data dup length 4 sub get}B /ch-xoff{128 +ch-data dup length 3 sub get sub}B /ch-yoff{ch-data dup length 2 sub get 127 +sub}B /ch-dx{ch-data dup length 1 sub get}B /ch-image{ch-data dup type +/stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 N /rw 0 N /rc 0 N /gp 0 N +/cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S dup /base get 2 index get +S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 ch-xoff ch-yoff ch-height +sub ch-xoff ch-width add ch-yoff setcachedevice ch-width ch-height true[1 0 0 +-1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image}imagemask restore}B /D{/cc X dup +type /stringtype ne{]}if nn /base get cc ctr put nn /BitMaps get S ctr S sf 1 +ne{dup dup length 1 sub dup 2 index S get sf div put}if put /ctr ctr 1 add N} +B /I{cc 1 add D}B /bop{userdict /bop-hook known{bop-hook}if /SI save N @rigin +0 0 moveto /V matrix currentmatrix dup 1 get dup mul exch 0 get dup mul add +.99 lt{/QV}{/RV}ifelse load def pop pop}N /eop{SI restore showpage userdict +/eop-hook known{eop-hook}if}N /@start{userdict /start-hook known{start-hook} +if pop /VResolution X /Resolution X 1000 div /DVImag X /IE 256 array N 0 1 255 +{IE S 1 string dup 0 3 index put cvn put}for 65781.76 div /vsize X 65781.76 +div /hsize X}N /p{show}N /RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N +/ruley 0 N /v{/ruley X /rulex X V}B /V{}B /RV statusdict begin /product where{ +pop product dup length 7 ge{0 7 getinterval dup(Display)eq exch 0 4 +getinterval(NeXT)eq or}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 +TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 +-.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /QV{ +gsave transform round exch round exch itransform moveto rulex 0 rlineto 0 +ruley neg rlineto rulex neg 0 rlineto fill grestore}B /a{moveto}B /delta 0 N +/tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{S p tail}B /c{-4 M} +B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B /j{3 M}B /k{4 M}B +/w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w}B /q{p 1 w}B /r{ +p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p a}B /bos{/SS save +N}B /eos{SS restore}B end +%%EndProcSet +TeXDict begin 39158280 55380996 1000 300 300 +(/home/a2/edf/jcw/uni/uniacke.dvi) @start /Fa 1 42 df<000000600000000000600000 +0000003000000000001800000000001800000000000C0000000000060000000000030000FFFFFF +FF8000FFFFFFFFC000000000007000000000001C00000000000F800000000003E0000000000780 +000000001E00000000003800000000006000FFFFFFFFC000FFFFFFFF8000000000070000000000 +0600000000000C0000000000180000000000300000000000300000000000600000000000600000 +2B1C7D9932>41 D E /Fb 2 13 df<07C0000C3040101040201880601880C00C80C00D00C00E00 +800E00800C00C01C00C02C0060C4803F0300120E7E8D17>11 D<000F0000308000C0C000804001 +00600200C00400C0040080040180083F00083E0008010008018010018010018010018010018030 +0300300300300600280C0044180043E000400000400000800000800000800000800000131D7F96 +14>I E /Fc 1 81 df<FFFFFFFFE0FFFFFFFFF07000001FF078000001F03C000000781C000000 +180E0000000C0F000000040700000004038000000203C000000001E000000000E0000000007000 +000000780000000038000000001C000000001E000000000F000000000700000000038000000003 +800000000300000000070000000006000000000C00000000180000000038000000003000000000 +6000000000C000000001C00000000180000002030000000406000000040E0000000C0C00000018 +180000007830000001F07000001FF07FFFFFFFF0FFFFFFFFE0272A7E7F2C>80 +D E /Fd 2 2 df<FFFFC0FFFFC012027D871A>0 D<40E04003037D880A>I +E /Fe 33 121 df<40E06020202040408003097D820A>59 D<00200060006000C000C000C00180 +01800180030003000300060006000C000C000C00180018001800300030003000600060006000C0 +00C000C0000B1D7E9511>61 D<07FFE000E03801C01801C01C01C01C01C01C0380380380700380 +E003FFC00700E00700700700300700380E00700E00700E00E00E00E01C0380FFFE0016147F9319 +>66 D<003F0800C0980300700600300C0030180030380020700000700000700000E00000E00000 +E00000E000406000806000803001003002000C1C0007E00015147E9318>I<07FFFC00E01C01C0 +0C01C00C01C00C01C00803820803820003820003FE000704000704000704000700000E00000E00 +000E00000E00001C0000FFC00016147F9315>70 D<07FC1FC000E0060001C0080001C0100001C0 +600001C080000381000003860000038E0000039E0000076700000787000007038000070380000E +01C0000E01C0000E00E0000E00E0001C00F000FF83FC001A147F931C>75 +D<07FE0000E00001C00001C00001C00001C0000380000380000380000380000700000700000700 +000700200E00400E00400E00800E01801C0780FFFF0013147F9317>I<003F0001C1C003006006 +00700C0030180038380038700038700038700038E00070E00070E00070E000E0E000C06001C070 +03803806001C1C0007E00015147E9319>79 D<07FFE000E07001C01801C01C01C01C01C01C0380 +380380380380700381C007FF000700000700000700000E00000E00000E00000E00001C0000FF80 +0016147F9315>I<07FFC000E07001C01801C01C01C01C01C01C0380380380700380C003FF0007 +03C00701C00700E00700E00E01C00E01C00E01C00E01C21C01C4FF807817147F9319>82 +D<00F8800305800603000401000C01000C01000C00000E00000FE00007F80001FC00001C00000E +00000E00400C00400C00400800601800D020008FC00011147E9314>I<1FFFF8381C1820381820 +380840380840381080701000700000700000700000E00000E00000E00000E00001C00001C00001 +C00001C0000380003FF8001514809314>I<FF1FE0FC3803803038038020380780403807804038 +0B8080380B818038138100383382003C2382001C43C4001C41CC001C81C8001D81D0001D01D000 +1E01E0001E01E0001C01C0001C018000180180001E147E931F>87 D<07B00C7010703060606060 +606060C0C0C0C8C0C841C862D03C700D0D7E8C12>97 D<7C000C00180018001800180030003700 +388030C060C060C060C060C0C180C180C1004300660038000A147E930F>I<07800C4010E031C0 +600060006000C000C0004020404021801E000B0D7E8C0F>I<007C000C00180018001800180030 +07B00C7010703060606060606060C0C0C0C8C0C841C862D03C700E147E9311>I<07800C401020 +304060407F8060004000C0004020604021801E000B0D7E8C10>I<0038006C007C004C00C000C0 +00C007F800C001800180018001800180030003000300030003000300060006006600E400C80070 +000E1A7F9310>I<01D8023804380C3018301830183030603060306010E019C00EC000C000C061 +80E180C3007C000D137F8C10>I<3E0006000C000C000C000C00180019E01E3018303830303030 +3030306060606460C460C4C0C8C0700E147E9313>I<06070600000000384C4C8C981818303262 +62643808147F930C>I<3E0006000C000C000C000C001800187018B819383230340038003E0063 +00631063106310C320C1C00D147E9312>107 D<7C0C181818183030303060606060C0D0D0D0D0 +6006147E930A>I<30F87C00590C86004E0D06009C0E0600980C0600180C0600180C060030180C +0030180C8030181880301818806030190060300E00190D7F8C1D>I<30F8590C4E0C9C0C980C18 +0C180C30183019303130316032601C100D7F8C15>I<03800C6018203030603060306030C060C0 +6040C0608023001E000C0D7E8C10>I<0C78168C130426062606060606060C0C0C0C0C080C101A +2019C018001800300030003000FC000F13818C11>I<072008E010E030C060C060C060C0C180C1 +80C180438067003B00030003000600060006003F800B137E8C0F>I<31E05A704C709C60980018 +0018003000300030003000600060000C0D7F8C0F>I<0700188019C0318038001E000F00038041 +80E180C10082007C000A0D7E8C10>I<02000600060006000C00FF800C000C0018001800180018 +00300031003100320032001C0009127F910D>I<0E3C13CE238E430C43000300030006000608C6 +08E610CA2071C00F0D7F8C13>120 D E /Ff 15 107 df<FFFFFF80FFFFFF8019027D8A20>0 +D<60F0F06004047C8B0C>I<000400000006000000060000000600000006000000060000000600 +00000600000006000000060000000600000006000000060000FFFFFFE0FFFFFFE0000600000006 +0000000600000006000000060000000600000006000000060000000600000006000000060000FF +FFFFE0FFFFFFE01B1C7E9A20>6 D<03C00FF01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFF7FFE7FFE +3FFC1FF80FF003C010107E9115>15 D<000001800000078000001E00000078000001E000000780 +00001E00000078000001E00000078000001E00000078000000E0000000780000001E0000000780 +000001E0000000780000001E0000000780000001E0000000780000001E00000007800000018000 +0000000000000000000000000000000000000000000000000000007FFFFF00FFFFFF8019227D99 +20>20 D<C0000000F00000003C0000000F00000003C0000000F00000003C0000000F00000003C0 +000000F00000003C0000000F000000038000000F0000003C000000F0000003C000000F0000003C +000000F0000003C000000F0000003C00000070000000C000000000000000000000000000000000 +0000000000000000000000000000007FFFFF00FFFFFF8019227D9920>I<07C000201FE000203F +F80020783C0060E01F00E0C00783C08003FF808000FF0080007C000000000007C000201FE00020 +3FF80020783C0060E01F00E0C00783C08003FF808000FF0080007C001B137E9320>25 +D<01000300030007800B4013206318830403000300030003000300030003000300030003000300 +0300030003000300030003000300030003000300030003000300030003000300030003000E257D +9C15>34 D<07E0003F000FF800F180183E018040200F03002040078400104003CC00108001D800 +088000F000088000F00008800078000880007800088000DC000840019E001040010F0010200607 +8020100C03E0C00C7800FF8007E0003F0025127E912A>49 D<007FF801FFF80780000E00001800 +00300000300000600000600000C00000C00000C00000FFFFF8FFFFF8C00000C00000C000006000 +006000003000003000001800000E000007800001FFF8007FF8151A7D961C>I<400004C0000C60 +00186000186000183000303000303000301800601800601FFFE00FFFC00C00C00C00C006018006 +018003030003030003030001860001860001860000CC0000CC0000CC0000780000780000780000 +3000003000161E809C17>56 D<400002C00006C00006C00006C00006C00006C00006C00006C000 +06C00006C00006C00006C00006C00006C00006C00006C00006C00006C0000660000C60000C3000 +181C00700F01E003FF8000FE00171A7E981C>91 D<003C00E001C0018003800380038003800380 +03800380038003800380038003800380030007001C00F0001C0007000300038003800380038003 +8003800380038003800380038003800380018001C000E0003C0E297D9E15>102 +D<F0001C00070003000380038003800380038003800380038003800380038003800380018001C0 +00E0003C00E001C001800380038003800380038003800380038003800380038003800380030007 +001C00F0000E297D9E15>I<C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +C0C0C0C0C0C0C0C0C0C0C0C0C0C002297B9E0C>106 D E /Fg 26 116 df<000101808053>48 +D<C000000000000000000000004020080402010040201000804010080402008040200100802010 +080401008040020100402010080201008004020080402010040201000804010080402008040200 +100802010080401008040020100402010080201008004020080402F90040201000004010080506 +0080402010008020100A0201008040200100402012020201008040020080402202040201008004 +01008042020804020100080201008202100804020010040201010420100804002008040201F840 +201008004010080402508040201000002010080489008040201000402010090601008040200080 +4020160302010080400100804028008402010080020100807000680402010004020100C0001008 +0402000804020180000C1008040010080402000002201008002010080400000140201000402010 +080000008040200000402010002000408040100080402000200021008020010080400020001201 +0040020100C0002000140200800402018000200008040100080402800020000808020010080480 +07FF00081004002010090000200004200800402011000020000440100000402100002000048020 +100080410000200005004020010081000020000600804002010100000000040100800402010000 +000004020100080401800000000804020010080280000000080804002010044000000010100800 +402008400000001020100000401020000000204020100080201007FF004080402001004028F800 +F88100804002008047000007020100800401008400000104020100080201040000010804020010 +04020400000110080400200804040000012010080040100808000000C02010000020100807FF00 +80402010004020187800F0808040200080402980000C8100804001008056000003420100800201 +0098000000C402010004020106000003080402000804020180000C10080400100804027800F020 +1008002010080407FF80402010004020100805050080402000004020100A020100804010008040 +201C018201008020010081C0F0007C0E01004002017E7F000007F3F2008004038000000000000E +0100080C0000002000000182001010000000D80000004400206000000306000000380040800003 +FE01FE00000800004007FC040201FF00101000A0382008040201E020200110C040100804021840 +400209008020100804048080040601004020100803010008040200804020100402001008040100 +804020080400201008020100804010080040201004020100802010000000000000000000000008 +555581D353>65 D<00000000F80000000000000001040000000000000002020000000000000002 +020000000000000002020000000000000002020000000000000002020000000000000001040000 +000000000000F80000000000000000500000000000000000880000000000000001040000000000 +000006030000000000000008008000000000000030006000000000000040001000000000000180 +000C00000000000200000200000000000400000100000000000800000080000000001000200040 +000000002000200020000000004000200010000000004000200010000000008000200008000000 +008000200008000000008007FF0008000000010000200004000000010000200004000000010000 +200004000000010000200004000000010000200004000000010000000004000000010000000004 +000000008000000008000000008000000008000000004000000010000000004000000010000000 +002000000020000000001007FF00400000000008F800F880000000000700000700000000000400 +000100000000000400000100000000000400000100000000000400000100000000000800000080 +000000000807FF008000000000087800F080000000000980000C80000000001600000340000000 +0018000000C0000000000600000300000000000180000C0000000000007800F000000000000007 +FF000000000000000104000000000000000202000000000000000C0180000000000180F000780C +0000007E7F000007F3F000038000000000000E000C000000200000018010000000D80000004060 +0000030600000030800003FC01FE0000084007FC000001FF001020380000000000E02010C00000 +0000001840090000000000000480060000000000000300454779CA53>I<C00000000000000000 +000000402008040201004020100080401008040200804020010080201018040100804002010040 +20300802010080040200804030100402010008040100807020080402001008020100B040100804 +00201004020FFF8020100800402008040FFF804020100000401008043200804020100080201008 +340100804020010040201038020100804002008040203004020100800401008040300804020100 +08020100807010080402001004020100B020100804002008040201F84020100800401008040304 +80402010000020100806030080402010004020100C010100804020008040201401020100804001 +00804028008402010080020100804800880402010004020100880090080402000807FE010800A0 +11FE0400100C03820800C02E018800202000640800807000300040400018080080C00010000080 +000408008100000810018000030401060000042001000000940108000004400300000064011000 +00048006000000240120000003000A00000012024000000200120000000A028000000200220000 +000603000000020042000000070500000002000200000003060000000210010000000104000000 +042001000000018C00000004400280000000880000000880048000000088000000090008400000 +008800000012001020000000500000002400202000000050000000280040300000005000000050 +00004800000070000000A010008400000070000001402001040000002000000180400202000000 +2000000300800401000000200000060100080300007FFFF0000402001004803F80000FE0080400 +200887C00000001F0808004010780000000000F010000020400000000000102010004040000000 +000010402000804000000000001080400100C00000000000110080020120003FFFE00022010004 +02200FC0001F80240200080420F000000078280400100827000000000730080020103800000000 +00E010004020200000000000202000004020001FFFC00020401000806007E0003F002080200100 +A078000000F0210040020143800000000E12008004025C0000000001D401000804600000000000 +380200100830000000000070040020100C0000000001A00800402013C00000001E401000004020 +3E000003E080201000804021FFFFFE010040200100804010080402008040020100802010080401 +008004020100402010080201000804020080402010040200100804010080402008040020100802 +0100804010080040201004020100802010000000000000000000000008555581D353>74 +D<00000000040000000000000000000C0000000000000000000C0000000000000000000C000000 +0000000000000C000000000000000003FFE00000000000000003FFE000000000000000000C0000 +000000000000000C0000000000000000000C0000000000000000000C0000000000000000000C00 +00000000000000000C0000000000000000000C0000000000000000003E00000000000000000045 +000000000000000000808000000000000000010040000000000000000100400000000000000002 +002000000000000000020020000000000000000200200000000000FF00020020007F80000300E0 +020020038060000800180200200C00080010000602002030000400200001020020400002004000 +00C100418000010040000021004200000100400000110044000001008000000900480000008080 +0000048090000000808000000280A0000000808000000180C00000008080000001414000000080 +80000000C180000000804000000041000000010040000000630000000100200000002200000002 +002000000022000000020010000000220000000400080000001400000008000800000014000000 +080004000000140000001000020000001C0000002000010000001C000000400001000000080000 +00400000800000080000008000004000000800000100000040001FFFFC0001000000200FE00003 +F80200000021F000000007C20000001E00000000003C0000001000000000000400000010000000 +000004000000100000000000040000001000000000000400000008000FFFF800080000000803F0 +0007E008000000083C0000001E0800000009C000000001C80000000E0000000000380000000800 +0000000008000000080007FFF000080000000801F8000FC008000000081E0000003C0800000010 +E00000000384000000170000000000740000001800000000000C0000000C000000000018000000 +0300000000006000000000F00000000780000000000F800000F80000000000007FFFFF00000000 +494A7BD053>I<C000000000000000000000004020080402010040201000804010080402008040 +200100802010F8040100804002010040210408020100800402008042021004020100080407C082 +02201F040200100808210202402088040020101012020280405008004020101402030040601000 +00401018050600C04020100080301008FC0140404020010050101058024040804007C090102050 +0440411F800821082040500820822080101207C08050101F044040101403410088201408404030 +18052201884024104040501009240288806420404010101128048900A440405008202110088A01 +448060A007C04110108C0245009F400140811021040446011480032101084104088402250004A2 +010881041084042A000894020901042082084C00109806060104410210480020880A0401048102 +20880040881204020301024088000084220206020202810810008442020A020203010820018482 +02120206020108400243020122020C02021080044202014202140206110008410201840124020C +1200104106008401480214140020408A0084018802281800404092008401080248100000406200 +4401100290101000C0420048009003101020012022003800A002202040022022002800A0022020 +80042012002820A0024021000820140018D8C00140220010200C181B06C0C180240020200C27FC +01FF21802800402005C00000001D0030000061FE0000000003FC20100092000000000000024020 +011C00000000000001C04002100000000000000040800408000000000000008100080800000000 +0000008200100400003FFFE000010400200A0007C0001F0002080040110078000000F004100000 +2083800000000E0820100040980000000000C8402000806000000000003080400100C000000000 +001100800201200000000000220100040220001FFFC00024020008041003E0003E004804001008 +103C000001E0500800201009C00000001CA0100040201E0000000003C020000040280000000000 +80401000804800000000008080200100900000000000410040020110003FFFE000420080040220 +1FC0001FC0240100080421E00000003C28020010082E0000000003B00400201070000000000070 +0800402030000000000060100000402E0000000003802010008041E00000003D0040200100805F +FFFFFFC20080400201008020100804010080040201004020100802010008040200804020100402 +001008040100804020080400201008020100804010080040201004020100802010000000000000 +000000000008555581D353>I<C000000000000000000000004020080402010040201000804010 +080402008040200100802010080401008040020100402010080201008004020080402010040201 +0008040100824020080402001008060106804010080400201005820900802010080040200C4411 +01004020100000401238208200804020100080220C408401008040200100420240880201008040 +0200820180500402010080040102060060080402010008020238003FF008040200100402C00000 +0E1008040020080700000001A010080040100A0000000060201000002014000000001840201000 +4028000000000480402000805000000000030080400100A0000000000101008002014000000000 +008201000402800000000000440200080500E000000000280400100901C0000000003008002011 +03C0000000001010004021038000000000102000004107000000000008401000810E0000000000 +088020010108000000000005004002010000000400000600800402000000020000020100080600 +0000040000020200100A0000000400000104002014000000040000010800402400000004000001 +1000004800000008000000A010009000000008000000C020011000000010000000804002200000 +006000000040800440000000E0000000410008400000036000000042001080000004A000000044 +00208000001920000000280041000000E220000000300001000003042000000020100118000408 +200000002020023C001810200000001040027C0020204000000010800678004040400000001100 +0A700080804000000012001240008100C000000014002100010201800000000800410041040280 +00000008000080420805000000000810004084100A00000000082000B104201200000000084001 +0E08402400000000088002011080480000000005000402E1009000000000060008040201200000 +000004001008040240000000000400201008048000000000040040201009000000000004000040 +201200000000000410008040240000000000042001008048000000000004400201008800000000 +000480040201100000000000050008040210000000000002001008042000000000000200201008 +200000000000020040201020000000000002000040202000000000000210008040200000000000 +02200100807FFFFFFFFFFFFE400201008020100804010080040201004020100802010008040200 +804020100402001008040100804020080400201008020100804010080040201004020100802010 +000000000000000000000008555581D353>I<0000000080000000000000018001800000000000 +000160024000000000000001100440000000000000008C08200000000000000083102000000000 +0000008090200000000000000080601000000000000000818010000000000000008E000FFC0000 +00000000B0000003800000000000C0000000600000000000800000001800000000010000000006 +000000000200000000010000000004000000000080000000080000000000400000001000000000 +002000000020000000000010000000403800000000080000004070000000000800000040F00000 +00000400000040E0000000000400000041C0000000000200000043800000000002000000420000 +000000010000004000000100000100000080000000800000800000800000010000008000008000 +000100000040000100000001000000400001000000010000004000020000000200000020000400 +000002000000200004000000040000002000080000001800000010001000000038000000100010 +000000C80000001000200000010800000010002000000608000000080040000038080000000800 +400000C0080000000800460001000800000008008F0006000800000004009F0008001000000004 +009E0010001000000004009C002000100000000400900020001000000004004000400020000000 +02004010400020000000020020108000400000000200102100008000000002000C410000800000 +000200038200010000000002000044000200000000010000380004000000000100000000080000 +000001000000001000000000010000000020000000000100000000400000000001000000008000 +000000010000000100000000000100000002000000000001000000020000000000010000000400 +000000000100000004000000000000800000080000000000008000000800000000000080000008 +00000000000080000008000000000000800000080000000000008000000FFFFFFFFFFFFF804948 +7BCD53>I<C0000000000000000000000040200804020100402010008040100804020080402001 +008020100804010080400201004020100802010080040200804020100402010008040100804020 +08040200100802010080401008040020100402010080201008004020080403FD00402010000040 +100806030080402010008020100800810080402001004020100042010080400200804030004402 +010080040100806000280402010008020100A00030080402001004020120002010080400200804 +022000202010080040100804200020402010000020100810004080402010004020101000410080 +402000804020180082010080400100804024010402010080020100804F07880402010004020100 +B000700804020008040201C0001810080400100804030000042010080020100806000002402010 +004020100C00000180402000004020140000010080401000804028000000810080200100804800 +000082010040020100900000004402008004020110000000480401000804021000000050080200 +100804100000006010040020100810000000402008004020101000000040401000004020080000 +008080201000804018000000810040200100802400000102008040020100440000010401008004 +02008200000208020100080401010000041004020010080201C000182008040020100402200020 +4010080040200804C00018802010000040100B0000070040201000802014000001008040200100 +4038000000C10080400200806000000022010080040100C0000000140201000802018000000008 +0402001004030000000004080400200806000000000210080040100A0000000002201000002014 +000000000140201000402800000000008040200080480000000000808040010090000000000041 +008002011000000000004201000402200000000000240200080420000000000028040010082000 +000000003008002010200000000000201000402040000000000010200000404000000000001040 +1000804000000000001080200100C0000000000011004002014000000000001200800402400000 +000000140100080440000000000018020010084000000000001004002010400000000000100800 +402040000000000010100000403FFFFFFFFFFFE020100080402008040201004020010080401008 +040200804002010080201008040100800402010040201008020100080402008040201004020010 +080401008040200804002010080201008040100800402010040201008020100000000000000000 +00000008555581D353>I<000003F800000000000C060000000000100100000000002000800000 +000020008000000000400040000000004000400000000040004000000000400040000000004000 +4000000000200080000000002000800000000010010000000000080200000000001E0F00000000 +006000C00000000180003000000002000008000000040000040000000800000200000008000002 +000000100000010000001000000100000020000000800000200000008000002000000080000020 +000000800000200000008000002000000080000010000001000000100000010000000800000200 +000008000002000000040000040000000200000800000001800030000000004000400000000180 +00300000000600000C000000080000020000003000000180000040000000400000800000002000 +010000000010000200000000080004000000000400040000000004000800000000020010000000 +000100100000000001002000000000008020000000000080400000000000404000000000004040 +000000000040400000000000408000000000002080000000000020800000000000208000000000 +002080000000000020800000000000208000000000002080000000000020800000000000208000 +00000000207FFFFFFFFFFFC0334370CA53>I<0000000007C00000000000000000082000000000 +0000000010100000000000003E00101000F8000000004100101001040000000080801010020200 +0000008080101002020000000080800820020200000000808007C0020200000000808002800202 +00003E0080800280020200F84100410002800104010480803E00028000F8020280800A00044000 +A00202808009000440012002028080090004400120020280800900044001200202410008800440 +022001043E0008800440022000F80A0008800820022000A0090008400820042001200500084008 +200420014004801040082004100240048010200820081002400440102008200810044004401020 +101008100440042010101010101008400420101010101010084004201010101010100840021010 +081010201010800210100810102010108002081008200820102080020810042008401020800204 +100420084010408002041004200840104080020210022008801080800202100240048010808001 +01100140050011010001011001400500110100010090014105001201000100A000C6C6000A0100 +010060C0D836060C01000100613FE00FF90C010001002E00000000E80100010FF0000000001FE1 +000090000000000000120000E00000000000000E00008000000000000002000040000000000000 +04000040000000000000040000200001FFFF000008000010003E0000F8001000000803C0000007 +80200000041C000000007040000004C00000000006400000030000000000018000000200000000 +000080000001000000000001000000010000FFFE000100000000801F0001F0020000000081E000 +000F02000000004E00000000E40000000070000000001C00000000400000000004000000004000 +0000000400000000800000000002000000008001FFFF00020000000100FE0000FE01000000010F +00000001E10000000170000000001D000000038000000000038000000180000000000300000000 +70000000001C000000000F00000001E00000000000FFFFFFFE0000004F4B7ED053>I<1FF807FF +C03FF010080400402010100804004020101008040040201010080400402010100FFC007FE01010 +000000000010100000000000101000000000001010000000000010100000000000101FFFFFFFFF +FFF008000000000020040000000000400300000000018000800000000200004000000004000030 +0000001800001FFFFFFFF000001000000010000010000000100000100000001000001000000010 +000010000000100000100000001000001000000010000010000000100000100000001000001000 +000010000010000000100000100000001000001000000010000010000000100000100000001000 +001000000010000010000000100000100000001000001000000010000010000000100000100000 +0010000010000000100000100000001000001FFFFFFFF000002000000008000040000000080000 +800000000400008000000002000100000000010002000000000080040000000000400FFFFFFFFF +FFE008000000000020080000000000200800000000002008000000000020080000000000200800 +0000000020FFFFFFFFFFFFFE800000000000028000000000000280000000000002800000000000 +0280000000000002FFFFFFFFFFFFFE374072C753>I<C000000000000000000000004020080402 +010040201000804010080402008040200100802010080401008040020100402010080201008004 +020080402010040201000804010080402008040200100802010080401008040020100402010080 +201008004020080402010040201000004010080402008040201000802010080401008040200100 +7FF01FFF827FE080400200A0102800844021008004012010480088402201000802201088009040 +240200100420110800A0402804002008201FF800FFC03008004010200000000000201000002020 +0000000000202010004020000000000020402000806000000000002080400100A0000000000021 +008002013FFFFFFFFFFFE201000402100000000000440200080408000000000088040010080600 +000000031008002010090000000004201000402010800000000840200000402060000000308040 +100080403FFFFFFFE10080200100806000000022010040020100A0000000240200800402012000 +000028040100080402200000003008020010080420000000201004002010082000000020200800 +402010200000002040100000402020000000208020100080402000000021004020010080200000 +00220080400201006000000024010080040200A000000028020100080401200000003004020010 +080220000000200804002010042000000020100800402008200000002020100000401020000000 +204020100080202000000020804020010040200000002100804002008060000000220100800401 +00A000000024020100080201200000002804020010040220000000300804002008043FFFFFFFE0 +100800401008400000001020100000201080000000104020100040210000000008804020008041 +000000000500804001008200000000020100800201040000000001020100040208000000000084 +020008041FFFFFFFFFFFC804001008100000000000500800201010000000000060100040201000 +000000004020000040300000000000404010008050000000000040802001009000000000004100 +400201FFFFFFFFFFFFFE0080040300000000000004010008050000000000000402001009000000 +000000040400201100000000000004080040210000000000000410000041FFFFFFFFFFFFFC2010 +008040200804020100402001008040100804020080400201008020100804010080040201004020 +100802010008040200804020100402001008040100804020080400201008020100804010080040 +201004020100802010000000000000000000000008555581D353>I<C000000000000000000000 +004020080402010040201000804010080402008040200100802010080401008040020100402010 +080201008004020080402010040201000804010080402008040200100802010080401008040020 +100402010080201008004020080402010040201000004010080402008040201000802010080401 +008040200100402010080201008040020080402010040201008004010080402008040201000802 +010080401008040200100402010080201008040020080402010040201008004010080402008040 +201000002010080401008040201000402010080201008040200080402010040201008040010080 +402008040201008002010080401008040201000402010080201008040200080402010040201008 +040010080402008040201008002010080401008040201000402010080201008040200000402010 +040201008040100080402008040201008020010080401008040201004002010080201008040200 +800402010040201008040100080402008040201008020010080401008040201004002010080201 +008040200800402010040201008040100000402008040201008020100080401008040201004020 +010080201008040200804002010040201008040100800402008040201008020100080401008040 +201004020010080201008040200804002010040201008040100800402008040201008020100000 +401008040201004020100080201008040200804020010040201008040100804002008040201008 +020100800401008040201004020100080201008040200804020010040201008040100804002008 +040201008020100800401008040201004020100000201008040200804020100040201008040100 +804020008040201008020100804001008040201004020100800201008040200804020100040201 +008040100804020008040201008020100804001008040201004020100800201008040200804020 +100040201008040100804020000040201008020100804010008040201004020100802001008040 +200804020100400201008040100804020080040201008020100804010008040201004020100802 +001008040200804020100400201008040100804020080040201008020100804010000040201004 +020100802010008040200804020100402001008040100804020080400201008020100804010080 +040201004020100802010008040200804020100402001008040100804020080400201008020100 +804010080040201004020100802010000000000000000000000008555581D353>90 +D<C000000000000000000000004020080402010040201000804010080402008040200100802010 +080401008040020100402010080201008004020080402010040201000804010080402008040200 +100802010080401008040020100402010080201008004020080402F900402010000040100805FE +0080402010008020100BFE01008040200100402013FE02010080400200804023FE040201008004 +01008043FE08040201000802010083FE10080402001004020101FC20100804002008040201F840 +2010080040100804022080402010000020100804F900804020100040201009FE01008040200080 +402013FE0201008040010080402FFF8402010080020100805FFFC80402010004020100FFFFF008 +04020008040201FFFFF81008040010080403FFFFFE2010080020100807FFFFFF40201000402010 +0FFFFFFF804020000040201FFFFFFFC08040100080403FFFCFFFE10080200100807FFFCFFFF201 +0040020100FFFFCFFFF4020080040201FFFFCFFFF8040100080402FFF800FFF8080200100804FF +F800FFF8100400201009FFFFCFFFFC200800402011FFFFCFFFFC401000004021FFFFCFFFFC8020 +10008041FFFFCFFFFD004020010081FFFFFFFFFE008040020101FFFFFFFFFC010080040201FFFF +FFFFFC020100080401FFFFFFFFF8040200100802FFFFFFFFF80804002010047FFFFFFFF0100800 +4020087FFFFFFFF02010000040103FFC01FFE04020100080201FC0001FC08040200100402F01FC +0781008040020080471FFFC70201008004010083FFFFFE0402010008020103FFFFFE0804020010 +040207FFFFFF1008040020080407FFFFFF2010080040100807FFFFFF402010000020100FF800FF +804020100040201FC0001F808040200080402F03FE07810080400100804C1FFFC1820100800201 +008C7FFFF18402010004020105FFFFFD0804020008040201FFFFFC10080400100804027FFFF020 +1008002010080407FF80402010004020100804F900804020000040201009FE0100804010008040 +2017FF0201008020010080403FFFC40201004002011FFFFFFFFFFFC200800403FFFFFFFFFFFFFC +01000807FFFFFFFFFFFFFF0200100FFFFFFF8FFFFFFF8400203FFFFFFF03FFFFFFE800407FFFFF +F2017FFFFFF000007FFE1004020103FFF01000BFE020080402013FE020011F8040100804020FC0 +40020F008020100804038080040601004020100803010008040200804020100402001008040100 +804020080400201008020100804010080040201004020100802010000000000000000000000008 +555581D353>97 D<00000001F00000000000000003F80000000000000007FC0000000000000007 +FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000003F80000 +000000000001F00000000000000000400000000000000001F00000000000000003F80000000000 +000007FC000000000000001FFF000000000000003FFF80000000000000FFFFE0000000000001FF +FFF0000000000007FFFFFC00000000000FFFFFFE00000000001FFFFFFF00000000003FFFFFFF80 +000000007FFF9FFFC000000000FFFF9FFFE000000000FFFF9FFFE000000001FFFF9FFFF0000000 +01FFF001FFF000000001FFF001FFF000000003FFFF9FFFF800000003FFFF9FFFF800000003FFFF +9FFFF800000003FFFF9FFFF800000003FFFFFFFFF800000003FFFFFFFFF800000003FFFFFFFFF8 +00000001FFFFFFFFF000000001FFFFFFFFF000000000FFFFFFFFE000000000FFFFFFFFE0000000 +007FF803FFC0000000003F80003F80000000001E03F80F00000000000E3FFF8E000000000007FF +FFFC000000000007FFFFFC00000000000FFFFFFE00000000000FFFFFFE00000000000FFFFFFE00 +000000000FF001FE00000000001F80003F00000000001E07FC0F0000000000183FFF8300000000 +0018FFFFE300000000000BFFFFFA000000000003FFFFF8000000000000FFFFE00000000000000F +FE0000000000000001F00000000000000003F8000000000000000FFE000000000000003FFF8000 +0000003FFFFFFFFFFF800003FFFFFFFFFFFFF8000FFFFFFFFFFFFFFE001FFFFFFF1FFFFFFF007F +FFFFFC07FFFFFFC0FFFFFFE000FFFFFFE0FFFC0000000007FFE07FC000000000007FC03F000000 +0000001F801C0000000000000700080000000000000200434778CA53>I<C00000000000000000 +000000402008040201004020100080401008040200804020010080201018040100804002010040 +20300802010080040200804030100402010008040100807020080402001008020100B040100804 +00201004020FFF8020100800402008040FFF804020100000401008043200804020100080201008 +340100804020010040201038020100804002008040203004020100800401008040300804020100 +08020100807010080402001004020100B020100804002008040201F84020100800401008040304 +80402010000020100806030080402010004020100CF901008040200080402015FD020100804001 +00804029FC8402010080020100804BFE8804020100040201008BFE90080402000807FE010BFEA0 +11FE0400100C03820BFEC02E0188002023F8640BFE8070FE3000404FFE180BFE80C3FF9000009F +FF840BFE810FFFC81001BFFFE305FD063FFFE420013FFFF095FD087FFFE440037FFFFC65FD11FF +FFF480067FFFFE25FD23FFFFF3000A7FFFFF12FA47FFFFF200127FFFFF8AFA8FFFFFF200227FFF +FFC6FB1FFFFFF200427FFFFFE7753FFFFFF200027FFFFFF3767FFFFFF210013FFFFFF1747FFFFF +E420013FFFFFF9ACFFFFFFE440029FFFFFFCA9FFFFFFC880049FFFFFFC89FFFFFFC900084FFFFF +FE8BFFFFFF92001027FFFFFE53FFFFFF24002027FFFFFE53FFFFFF28004033FFFFFF57FFFFFE50 +000049FFFFFF77FFFFFCA0100084FFFFFF77FFFFF940200104FFFFFF27FFFFF9804002027FFFFF +27FFFFF3008004013FFC000001FFE6010008033F800000000FE40200100498001FFFC000C80400 +20088007FFFFFF000808004010607FFFFFFFF0301000002027FFFFFFFFFF20201000403FFFFFFF +FFFFE0402000807FFFFFFFFFFFE080400100BFFFFFFFFFFFE1008002013FFFC0001FFFE2010004 +023FF00000007FE4020008043F001FFFC007E8040010083807FFFFFF00F008002010307FFFFFFF +F0601000402033FFFFFFFFFE60200000403FFFC0001FFFE0401000807FF8000000FFE080200100 +BF801FFFC00FE1004002013C03FFFFFE01E200800402303FFFFFFFE0640100080421FFFFFFFFFC +280200100807FFFFFFFFFF10040020100BFFFFFFFFFE2008004020103FFFFFFFE0401000004020 +11FFFFFD0080201000804020080402010040200100804010080402008040020100802010080401 +008004020100402010080201000804020080402010040200100804010080402008040020100802 +0100804010080040201004020100802010000000000000000000000008555581D353>106 +D<00000000040000000000000000000C0000000000000000000C0000000000000000000C000000 +0000000000000C000000000000000003FFE00000000000000003FFE000000000000000000C0000 +000000000000000C0000000000000000000C0000000000000000000C0000000000000000000C00 +00000000000000000C0000000000000000000C0000000000000000003E00000000000000000045 +000000000000000000808000000000000000013E4000000000000000017F400000000000000002 +7F200000000000000002FFA00000000000000002FFA00000000000FF0002FFA0007F80000300E0 +02FFA00380600008FE1802FFA00C3F880013FF8602FFA030FFE40027FFE102FFA043FFF2004FFF +F8C17F418FFFF9004FFFFC217F421FFFF9005FFFFF117F447FFFFD009FFFFF897F48FFFFFC809F +FFFFC4BE91FFFFFC809FFFFFE2BEA3FFFFFC809FFFFFF1BEC7FFFFFC809FFFFFF95D4FFFFFFC80 +9FFFFFFCDD9FFFFFFC804FFFFFFC5D1FFFFFF9004FFFFFFE6B3FFFFFF90027FFFFFF2A7FFFFFF2 +0027FFFFFF227FFFFFF20013FFFFFFA2FFFFFFE40009FFFFFF94FFFFFFC80009FFFFFF94FFFFFF +C80004FFFFFFD5FFFFFF9000027FFFFFDDFFFFFF2000013FFFFFDDFFFFFE4000013FFFFFC9FFFF +FE4000009FFFFFC9FFFFFC8000004FFF0000007FF90000004FE000000003F9000000260007FFF0 +00320000002001FFFFFFC002000000181FFFFFFFFC0C00000009FFFFFFFFFFC80000000FFFFFFF +FFFFF80000000FFFFFFFFFFFF80000000FFFFFFFFFFFF80000000FFFF00007FFF80000000FFC00 +00001FF80000000FC007FFF001F80000000E01FFFFFFC0380000000C1FFFFFFFFC180000000CFF +FFFFFFFF980000000FFFF00007FFF80000000FFE0000003FF80000000FE007FFF003F80000000F +00FFFFFF80780000000C0FFFFFFFF818000000087FFFFFFFFF0800000001FFFFFFFFFFC0000000 +00FFFFFFFFFF80000000000FFFFFFFF80000000000007FFFFF0000000049497BD053>I<C00000 +0000000000000000004020080402010040201000804010080402008040200100802010F8040100 +80400201004021FC08020100800402008043FE10040201000804010083FE2008040200100803C1 +03FE401E080400201007E203FE803F10080040200FF403FF007FA0100000401FF805FE00FFC020 +1000802FF008FC017F80402001004FF01028027F808040078087E02070043F010F800FC103C040 +70081E021F801FE2018080701008043FC01FE402C100F02018083FC03FE805C20170403C103FC0 +5FF009C40270805C203FC01FE011E804F900BC403FD00FC021F008FA013C805FA0078041E010FC +023D008F4001C081F020F8047E01188002C101F040F8087C02190004E201F080F8107C043A0008 +E403F901FC20FC083C0010F805FA01FC40FC10780020F009FC01FC81FC207800407811FC03FD01 +FC40F000007821FC05FE01FC80F01000F841FE09FC03FD00F020017C81FE13FE07FE01F040027D +01FE23FE0BFC03F080047E01FF43FE17FC07F100087E03FF83FE27FE0BF200107F07FF03FE47FE +17F400203F0BFF87FF8FFE27E800403F93FF87FF0FFE4FF000007FA3FF87FF0FFE8FE01000BFC3 +FFCFFF1FFF1FE020013FC3FFD7FF1FFE1FE040023FE3FFE7FF1FFE3FE080043FE3FFEFFFBFFE3F +E100083FF3FFEFFFBFFE7FE200101FF3FFEFFFFFFE7FC400201FFFFFFFFFFFFEFFC800403FFBFF +FFFFFFFEFFD000005FFFFFFFFFFFFFFFE010009FFFFFFFFFFFFFFFC020011FFFFFFFFFFFFFFFC0 +40021FFFFFFFFFFFFFFFC080040FFFFFFFFFFFFFFF81000807FFFFFFFFFFFFFF02001007FFFFC0 +001FFFFF0400200BFFF8000000FFFE08004011FF801FFFC00FFC10000020FC03FFFFFE01F82010 +0040603FFFFFFFE0304020008061FFFFFFFFFC3080400100BFFFFFFFFFFFE1008002013FFFF000 +7FFFE2010004021FFE000003FFC4020008041FF007FF007FC8040010080FC0FFFFF81F90080020 +100F07FFFFFF07A010004020141FFFFFFFC14020000040247FFFFFFFF180401000804FFFFFFFFF +FF80802001008FFFC0001FFF81004002010FF8000000FF82008004021F801FFFC00FC401000804 +1C03FFFFFE01C802001008303FFFFFFFE0700400201021FFFFFFFFFC200800402027FFFFFFFFFF +20100000402FFFFFFFFFFF802010008041FFFFFFFFFD0040200100805FFFFFFFC2008040020100 +802010080401008004020100402010080201000804020080402010040200100804010080402008 +0400201008020100804010080040201004020100802010000000000000000000000008555581D3 +53>I<C00000000000000000000000402008040201004020100080401008040200804020010080 +201008040100804002010040201008020100800402008040201004020100080401008040200804 +02001008020102804010080400201007020700802010080040200BC40F010040201000004013E8 +1F020080402010008023F83F040100804020010043FE7F880201008040020083FFFF9004020100 +80040103FFFFE00804020100080203FFFFC01008040200100403FFFFFFF810080400200805FFFF +C00F2010080040100BFFFFC000C0201000002013FFFFFFE020402010004027FFFFFFFE18804020 +00804FFFFFFFFF8500804001009FFFFFFFFFC201008002013FFFFFFFFFF102010004027FFFFFFF +FFF88402000804FF1FFFFFFFFC4804001008FE3FFFFFFFFE1008002010FC3FFFFFFFFF20100040 +20FC7FFFFFFFFF1020000040F8FFFFFFFFFF9040100080F1FFFFFFFFFF8880200100F7FFFFFFFF +FFC900400201FFFFFFFFFFFFC600800403FFFFFFFFFFFFE401000805FFFFFFFFFFFFE00200100B +FFFFFFFFFFFFF204002013FFFFFFFFFFFFF208004027FFFFFFFFFFFFF110000047FFFFFFFFFFFF +F92010008FFFFFFFFFFFFFF94020011FFFFFFFFFFFFFF88040023FFFFFFFFFFFFFFC8080043FFF +FFFF3FFFFFFC8100087FFFFFFE7FFFFFFC820010FFFFFFF8BFFFFFFC440020FFFFFFF13FFFFFFE +480041FFFFFFC23FFFFFFE500001FFFFFF043FFFFFFE601001E7FFFC083FFFFFFE202003C3FFF0 +103FFFFFFF20400383FFE0207FFFFFFF20800787FFC0407FFFFFFF21000B8FFF80807FFFFFFF32 +0013BFFF0100FFFFFFFF140021FFFF0201FFFFFFFF980041FFFE0402FFFFFFFF900000FFFE0805 +FFFFFFFF9010007FFC100BFFFFFFFF9020009FFC2013FFFFFFFF98400101F84027FFFFFFFF9880 +0201F0804FFFFFFFFF89000402E1009FFFFFFFFFCA00080402013FFFFFFFFFCC00100804027FFF +FFFFFFC80020100804FFFFFFFFFFC80040201009FFFFFFFFFFCC0000402013FFFFFFFFFFCC1000 +804027FFFFFFFFFFCC200100804FFFFFFFFFFFCC400201008FFFFFFFFFFFC4800402011FFFFFFF +FFFFE5000804021FFFFFFFFFFFE6001008043FFFFFFFFFFFE4002010083FFFFFFFFFFFE4004020 +103FFFFFFFFFFFE4000040203FFFFFFFFFFFE4100080403FFFFFFFFFFFFC200100807FFFFFFFFF +FFFC40020100802010080401008004020100402010080201000804020080402010040200100804 +010080402008040020100802010080401008004020100402010080201000000000000000000000 +0008555581D353>I<0000000080000000000000C00180000000000000F003C0000000000000F8 +07C0000000000000FE0FC0000000000000FF9FE0000000000000FFFFE0000000000000FFFFF000 +0000000000FFFFF0000000000000FFFFFFFE00000000007FFFF003C000000000FFFFF000300000 +0000FFFFFFF80800000001FFFFFFFF8600000003FFFFFFFFE100000007FFFFFFFFF08000000FFF +FFFFFFFC4000001FFFFFFFFFFE2000003FC7FFFFFFFF1000003F8FFFFFFFFF8000003F0FFFFFFF +FFC800003F1FFFFFFFFFC400003E3FFFFFFFFFE400003C7FFFFFFFFFE200003DFFFFFFFFFFF200 +003FFFFFFFFFFFF100007FFFFFFFFFFFF900007FFFFFFFFFFFF80000FFFFFFFFFFFFFC8000FFFF +FFFFFFFFFC8001FFFFFFFFFFFFFC4001FFFFFFFFFFFFFE4003FFFFFFFFFFFFFE4007FFFFFFFFFF +FFFE200FFFFFFFFFFFFFFF200FFFFFFFCFFFFFFF201FFFFFFF8FFFFFFF203FFFFFFE0FFFFFFF10 +3FFFFFFC0FFFFFFF907FFFFFF00FFFFFFF907FFFFFC00FFFFFFF9079FFFF000FFFFFFF88F0FFFC +000FFFFFFFC8E0FFF8001FFFFFFFC8E1FFF0001FFFFFFFC8E3FFE0001FFFFFFFCCEFFFC0001FFF +FFFFC47FFFC0003FFFFFFFE47FFF80003FFFFFFFE43FFF80007FFFFFFFE41FFF0000FFFFFFFFE4 +07FF0000FFFFFFFFE6007E0001FFFFFFFFE6007C0003FFFFFFFFE200380007FFFFFFFFF2000000 +0FFFFFFFFFF20000001FFFFFFFFFF20000003FFFFFFFFFF20000007FFFFFFFFFF3000000FFFFFF +FFFFF3000001FFFFFFFFFFF3000003FFFFFFFFFFF3000003FFFFFFFFFFF1000007FFFFFFFFFFF9 +000007FFFFFFFFFFF900000FFFFFFFFFFFF900000FFFFFFFFFFFF900000FFFFFFFFFFFF900000F +FFFFFFFFFFF900000FFFFFFFFFFFFF00000FFFFFFFFFFFFF48477BCC53>I<C000000000000000 +000000004020080402010040201000804010080402008040200100802010080401008040020100 +402010080201008004020080402010040201000804010080402008040200100802010080401008 +040020100402010080201008004020080403FD00402010000040100807FF008040201000802010 +0FFF8100804020010040201FFFC201008040020080403FFFC402010080040100807FFFE8040201 +0008020100BFFFF008040200100402013FFFE010080400200804023FFFE020100800401008043F +FFE040201000002010081FFFC080402010004020101FFFC100804020008040201FFF8201008040 +0100804027FF04020100800201008047FF080402010004020100BFFFF00804020008040201FFFF +F81008040010080403FFFFFC2010080020100807FFFFFE402010004020100BFFFFFE8040200000 +402017FFFFFF0080401000804027FFFFFF010080200100804FFFFFFF820100400201008FFFFFFF +840200800402010FFFFFFF880401000804020FFFFFFF900802001008040FFFFFFFA01004002010 +080FFFFFFFC02008004020100FFFFFFF804010000040200FFFFFFF8080201000804017FFFFFF01 +00402001008027FFFFFF0200804002010043FFFFFE0401008004020083FFFFFE08020100080401 +01FFFFFC1004020010080201FFFFF820080400201004023FFFE040100800402008047FFFF08020 +100000401009FFFFFD0040201000802017FFFFFF008040200100403FFFFFFFC10080400200807F +FFFFFFE2010080040100FFFFFFFFF4020100080201FFFFFFFFF8040200100403FFFFFFFFFC0804 +00200807FFFFFFFFFE10080040100BFFFFFFFFFE201000002017FFFFFFFFFF40201000402FFFFF +FFFFFF80402000804FFFFFFFFFFF80804001009FFFFFFFFFFFC1008002011FFFFFFFFFFFC20100 +04021FFFFFFFFFFFC4020008043FFFFFFFFFFFE8040010083FFFFFFFFFFFF0080020103FFFFFFF +FFFFE0100040207FFFFFFFFFFFF0200000407FFFFFFFFFFFF0401000807FFFFFFFFFFFF0802001 +00FFFFFFFFFFFFF1004002017FFFFFFFFFFFF2008004027FFFFFFFFFFFF4010008047FFFFFFFFF +FFF8020010087FFFFFFFFFFFF0040020107FFFFFFFFFFFF0080040207FFFFFFFFFFFF010000040 +7FFFFFFFFFFFF02010008040200804020100402001008040100804020080400201008020100804 +010080040201004020100802010008040200804020100402001008040100804020080400201008 +020100804010080040201004020100802010000000000000000000000008555581D353>I<0000 +03F800000000000FFE00000000001FFF00000000003FFF80000000003FFF80000000007FFFC000 +0000007FFFC0000000007FFFC0000000007FFFC0000000007FFFC0000000003FFF80000000003F +FF80000000001FFF00000000000FFE00000000000FFE00000000007FFFC000000001FFFFF00000 +0003FFFFF800000007FFFFFC00000007FFFFFC0000000FFFFFFE0000000FFFFFFE0000001FFFFF +FF0000001FFFFFFF0000001FFFFFFF0000001FFFFFFF0000001FFFFFFF0000001FFFFFFF000000 +1FFFFFFF0000001FFFFFFF0000000FFFFFFE0000000FFFFFFE00000007FFFFFC00000007FFFFFC +00000003FFFFF800000001FFFFF0000000007FFFC000000000FFFFE000000003FFFFF80000000F +FFFFFE0000003FFFFFFF8000007FFFFFFFC00000FFFFFFFFE00001FFFFFFFFF00003FFFFFFFFF8 +0007FFFFFFFFFC0007FFFFFFFFFC000FFFFFFFFFFE001FFFFFFFFFFF001FFFFFFFFFFF003FFFFF +FFFFFF803FFFFFFFFFFF803FFFFFFFFFFF807FFFFFFFFFFFC07FFFFFFFFFFFC07FFFFFFFFFFFC0 +FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFF +FFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE0FFFFFFFFFFFFE033 +4370CA53>I<0000000007C000000000000000000FE000000000000000001FF000000000000000 +001FF00000000000001E001FF000F0000000003F001FF001F8000000007F801FF003FC00000000 +7F800FE003FC000000007F8007C003FC000000007F80010003FC00003C003F00038001F800787E +001E00038000F000FCFF0004000380004001FEFF000600038000C001FEFF000E00038000E001FE +FF000E00038000E001FEFF000F0007C001E001FE7E000F0007C001E000FC3C000F0007C001E000 +7806000F8007C003E000C006000F8007C003E000C007000F8007C003E001C007000FC00FE007E0 +01C007800FC00FE007E003C007800FE00FE00FE003C003C00FE00FE00FE0078003C00FE00FE00F +E0078003C00FF00FE01FE0078003E00FF01FF01FE00F8003E00FF01FF01FE00F8003F00FF81FF0 +3FE01F8003F01FF81FF03FF01F8003F81FF81FF03FF03F8001F81FFC3FF87FF03F0001FC1FFC3F +F87FF07F0001FC1FFC3FF87FF07F0001FE1FFE3FF8FFF0FF0001FE1FFE3FF8FFF0FF0001FF1FFE +3FF8FFF1FF0001FF1FFF7FFDFFF1FF0001FF9FFF7FFDFFF3FF0000FF9FFF7FFDFFF3FE0000FFDF +FFFFFFFFF7FE0000FFDFFFFFFFFFF7FE0000FFFFFFFFFFFFFFFE0000FFFFFFFFFFFFFFFE0000FF +FFFFFFFFFFFFFE0000FFFFFFFFFFFFFFFE00007FFFFFFFFFFFFFFC00003FFFFFFFFFFFFFF80000 +3FFFFE0000FFFFF800001FFFC0000007FFF000000FFC00FFFE007FE0000007E01FFFFFF00FC000 +000301FFFFFFFF01800000030FFFFFFFFFE180000001FFFFFFFFFFFF00000001FFFF8003FFFF00 +000000FFF000001FFE00000000FF803FF803FE000000007E07FFFFC0FC00000000783FFFFFF83C +0000000020FFFFFFFE080000000023FFFFFFFF88000000007FFFFFFFFFFC000000007FFE0000FF +FC000000007FC0000007FC00000000FC00FFFE007E00000000E01FFFFFF00E0000000181FFFFFF +FF03000000010FFFFFFFFFE1000000013FFFFFFFFFF9000000007FFFFFFFFFFC000000000FFFFF +FFFFE00000000000FFFFFFFE0000004F4B7ED053>I<3FF007FF007FE03FF007FF007FE03FF007 +FF007FE03FF007FF007FE03FF007FF007FE03FFFFFFFFFFFE03FFFFFFFFFFFE03FFFFFFFFFFFE0 +3FFFFFFFFFFFE03FFFFFFFFFFFE030000000000060300000000000400FFFFFFFFFFF8007FFFFFF +FFFE0001FFFFFFFFFC0000FFFFFFFFF0000030000000600000100000004000001FFFFFFFC00000 +1FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFF +C000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001F +FFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC0 +00001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001FFFFFFFC000001000 +0000400000100000006000003FFFFFFFF000007FFFFFFFF80000FFFFFFFFFC0001FFFFFFFFFE00 +03FFFFFFFFFF0000000000000000080000000000800FFFFFFFFFFF800FFFFFFFFFFF800FFFFFFF +FFFF800FFFFFFFFFFF800FFFFFFFFFFF8008000000000080080000000000F8FFFFFFFFFFFFF8FF +FFFFFFFFFFF8FFFFFFFFFFFFF8FFFFFFFFFFFFF8FFFFFFFFFFFFF8FFFFFFFFFFFFF8353F71C653 +>I<C0000000000000000000000040200804020100402010008040100804020080402001008020 +100804010080400201004020100802010080040200804020100402010008040100804020080402 +001008020100804010080400201004020100802010080040200804020100402010000040100804 +020080402010008020100804010080402001004020100802010080400200BFF027FF047FE10080 +04013FF047FF087FE2010008023FF087FF107FE4020010043FF107FF207FE8040020083FF207FF +407FF0080040103FFFFFFFFFFFE0100000203FFFFFFFFFFFE0201000403FFFFFFFFFFFE0402000 +807FFFFFFFFFFFE080400100BFFFFFFFFFFFE10080020130000000000062010004023000000000 +0044020008040FFFFFFFFFFF880400100807FFFFFFFFFE100800201009FFFFFFFFFC2010004020 +10FFFFFFFFF0402000004020300000006080401000804030000000410080200100805FFFFFFFC2 +0100400201009FFFFFFFC40200800402011FFFFFFFC80401000804021FFFFFFFD0080200100804 +1FFFFFFFE01004002010081FFFFFFFC02008004020101FFFFFFFC04010000040201FFFFFFFC080 +20100080401FFFFFFFC10040200100803FFFFFFFC20080400201005FFFFFFFC40100800402009F +FFFFFFC80201000804011FFFFFFFD00402001008021FFFFFFFE00804002010041FFFFFFFC01008 +004020081FFFFFFFC02010000040101FFFFFFFC04020100080201FFFFFFFC08040200100403FFF +FFFFC10080400200805FFFFFFFC20100800401009FFFFFFFC40201000802011FFFFFFFC8040200 +1004021FFFFFFFD0080400200804100000006010080040100810000000602010000020103FFFFF +FFF04020100040207FFFFFFFF8804020008040FFFFFFFFFD008040010081FFFFFFFFFE01008002 +0103FFFFFFFFFF0201000402000000000000040200080408000000000088040010080FFFFFFFFF +FF90080020100FFFFFFFFFFFA0100040201FFFFFFFFFFFC0200000402FFFFFFFFFFF8040100080 +4FFFFFFFFFFF80802001008800000000008100400201080000000000FA00800402FFFFFFFFFFFF +FC01000804FFFFFFFFFFFFF802001008FFFFFFFFFFFFF804002010FFFFFFFFFFFFF808004020FF +FFFFFFFFFFF810000040FFFFFFFFFFFFF820100080402008040201004020010080401008040200 +804002010080201008040100800402010040201008020100080402008040201004020010080401 +008040200804002010080201008040100800402010040201008020100000000000000000000000 +08555581D353>I E /Fh 49 122 df<00F000030C000E06041C07043807083007087007907007 +90E003A0E003A0E003C0E00380E00380E00380600780601B883061900F80E016127E911B>11 +D<0001F000061800080C00100C00200E00400E00800E00801C01001C010018010038020FF00210 +C0020FE00200300400300400300400380400380800700800700800700800E01800E01800C01401 +80140300230E0020F80020000020000040000040000040000040000080000080000017257F9C17 +>I<60F0F06004047C830C>58 D<60F0F0701010101020204080040C7C830C>I<0000038000000F +0000003C000000F0000003C000000F0000003C000000F0000003C000000F0000003C000000F000 +0000F00000003C0000000F00000003C0000000F00000003C0000000F00000003C0000000F00000 +003C0000000F000000038019187D9520>I<00010003000600060006000C000C000C0018001800 +180030003000300060006000C000C000C0018001800180030003000300060006000C000C000C00 +180018001800300030003000600060006000C000C00010297E9E15>I<E0000000780000001E00 +00000780000001E0000000780000001E0000000780000001E0000000780000001E000000078000 +00078000001E00000078000001E00000078000001E00000078000001E00000078000001E000000 +78000000E000000019187D9520>I<00000C0000000C0000001C0000001C0000003C0000007C00 +00005C0000009C0000008E0000010E0000010E0000020E0000040E0000040E0000080E0000080E +0000100E0000200E00003FFE000040070000400700008007000100070001000700020007000200 +0700060007001E000700FF807FF01C1D7F9C1F>65 D<01FFFF00003C01C0003800E0003800F000 +3800700038007000700070007000F0007000F0007001E000E003C000E0078000E01F0000FFFC00 +01C00F0001C0078001C003C001C003C0038003C0038003C0038003C0038003C007000780070007 +0007000E0007001C000E007800FFFFC0001C1C7E9B1F>I<0001F808000E061800380138006000 +F001C0007003800070070000300F0000200E0000201C0000203C0000203C000000780000007800 +000078000000F0000000F0000000F0000000F0000000F0000100F0000100F00001007000020070 +00020030000400380008001C0010000E0060000701800000FE00001D1E7E9C1E>I<01FFFF8000 +3C01E000380070003800380038001C0038001C0070001C0070001E0070001E0070001E00E0001E +00E0001E00E0001E00E0001E01C0003C01C0003C01C0003C01C000380380007803800070038000 +F0038000E0070001C0070003800700070007001C000E007800FFFFC0001F1C7E9B22>I<01FFFF +F8003C0078003800180038001000380010003800100070001000700010007010100070100000E0 +200000E0200000E0600000FFE00001C0400001C0400001C0400001C04000038080400380004003 +80008003800080070001000700010007000300070006000E003E00FFFFFC001D1C7E9B1F>I<01 +FFFFF0003C00F00038003000380020003800200038002000700020007000200070102000701000 +00E0200000E0200000E0600000FFE00001C0400001C0400001C0400001C0400003808000038000 +000380000003800000070000000700000007000000070000000F000000FFF000001C1C7E9B1B> +I<01FFC3FF80003C0078000038007000003800700000380070000038007000007000E000007000 +E000007000E000007000E00000E001C00000E001C00000E001C00000FFFFC00001C003800001C0 +03800001C003800001C0038000038007000003800700000380070000038007000007000E000007 +000E000007000E000007000E00000F001E0000FFE1FFC000211C7E9B23>72 +D<03FFC0003C0000380000380000380000380000700000700000700000700000E00000E00000E0 +0000E00001C00001C00001C00001C0000380000380000380000380000700000700000700000700 +000F0000FFF000121C7E9B12>I<01FFC07F80003C001E00003800180000380020000038004000 +0038008000007002000000700400000070080000007010000000E040000000E0C0000000E1E000 +0000E2E0000001C470000001D070000001E038000001C0380000038038000003801C000003801C +000003800E000007000E000007000E0000070007000007000700000F00078000FFE03FF000211C +7E9B23>75 D<01FFE0003C0000380000380000380000380000700000700000700000700000E000 +00E00000E00000E00001C00001C00001C00001C00003800203800203800203800407000407000C +0700180700380E00F0FFFFF0171C7E9B1C>I<01FE0000FF003E0000F0002E0001E0002E0002E0 +002E0002E0002E0004E0004E0009C0004E0009C000470011C000470011C0008700238000870043 +800087004380008700838001070107000107010700010382070001038207000203840E00020388 +0E000203880E000203900E000403A01C000403A01C000401C01C000C01C01C001C01803C00FF81 +03FF80281C7E9B28>I<01FC00FF80001C001C00002E001800002E001000002E00100000270010 +0000470020000043002000004380200000438020000081C040000081C040000081C040000080E0 +40000100E080000100708000010070800001007080000200390000020039000002003900000200 +1D000004001E000004000E000004000E00000C000E00001C00040000FF80040000211C7E9B21> +I<0003F800000E0E000038038000E001C001C001C0038000E0070000E00F0000F01E0000F01C00 +00F03C0000F03C0000F0780000F0780000F0780000F0F00001E0F00001E0F00001E0F00003C0F0 +0003C0F0000780F0000780F0000F0070000E0070001C00380038003C0070001C01C00007078000 +01FC00001C1E7E9C20>I<01FFFF00003C03C0003800E0003800F00038007000380070007000F0 +007000F0007000F0007000E000E001E000E003C000E0078000E01E0001FFF00001C0000001C000 +0001C0000003800000038000000380000003800000070000000700000007000000070000000F00 +0000FFE000001C1C7E9B1B>I<0003F800000E0E000038038000E001C001C001C0038000E00700 +00E00F0000F01E0000F01C0000F03C0000F03C0000F0780000F0780000F0780000F0F00001E0F0 +0001E0F00001E0F00003C0F00003C0F0000380F0000780F0000F00703C0E0070421C0038823800 +388370001C83C0000787810001FF8100000383000003820000038E000003FC000003F8000001F8 +000001E0001C257E9C21>I<01FFFE00003C03C0003800E0003800F00038007000380070007000 +F0007000F0007000F0007001E000E001C000E0078000E01E0000FFF00001C0300001C0180001C0 +1C0001C01C0003801C0003801C0003801C0003801C0007003C0007003C0807003C0807003C100F +001E10FFE00E20000007C01D1D7E9B20>I<000FC100303300400F008006018006030006030006 +06000406000407000007000007800003F00001FF0000FFC0003FE00003E00000F0000070000030 +0000302000302000306000606000606000C0600080F00300CC060083F800181E7E9C19>I<1FFF +FFF01C03807030070030200700206007002040070020400E0020800E0020800E0020000E000000 +1C0000001C0000001C0000001C0000003800000038000000380000003800000070000000700000 +007000000070000000E0000000E0000000E0000000E0000001E000007FFF00001C1C7F9B18>I< +7FF03FE00F0007000E0006000E0004000E0004000E0004001C0008001C0008001C0008001C0008 +003800100038001000380010003800100070002000700020007000200070002000E0004000E000 +4000E0004000E0008000E0008000E00100006002000060040000300800001830000007C000001B +1D7D9B1C>I<FFC00FF01E0003801C0003001C0002001C0004001E0004000E0008000E0008000E +0010000E0020000E0020000E0040000E0080000E0080000F010000070100000702000007040000 +0704000007080000071800000710000007A0000003A0000003C000000380000003800000030000 +00030000001C1D7D9B18>I<FFC1FFC1FF1C003C003C1C001C00101C001C00201C003C00201C00 +7C00401C005C00401C009C00801C009C00801C011C01001C011C01001C021C02001C021C04001C +041C04001C081C08001E081C08000E101C10000E101C10000E200E20000E200E60000E400E4000 +0E400E80000E800E80000F000F00000F000F00000E000E00000E000E00000C000C00000C000800 +00281D7D9B27>I<00800080208020802080208020802080208020E027E03FE0FF80FC80E08020 +802080208020802080208020802080208020802080208020E027E03FE0FF80FC80E08020802080 +20802080200020000B277E9D10>93 D<01E3000717000C0F00180F00380E00300E00700E00700E +00E01C00E01C00E01C00E01C00E03880E03880E038806078803199001E0E0011127E9116>97 +D<01F0030C0E0C1C1E383C301870007000E000E000E000E000E000E0046008601030601F800F12 +7E9112>99 D<0007E00000E00000E00001C00001C00001C00001C0000380000380000380000380 +01E7000717000C0F00180F00380E00300E00700E00700E00E01C00E01C00E01C00E01C00E03880 +E03880E038806078803199001E0E00131D7E9C16>I<01F007080C0818043808300870307FC0E0 +00E000E000E000E000E0046008601030600F800E127E9113>I<0001E0000630000E78000CF000 +1C60001C00001C00001C00003C0000380000380003FFC000380000380000700000700000700000 +700000700000E00000E00000E00000E00000E00001C00001C00001C00001C00001C00001800003 +8000038000630000F30000F60000E4000078000015257E9C14>I<007180018B80030780060780 +0E07000C07001C07001C0700380E00380E00380E00380E00381C00381C00381C00183C0008F800 +073800003800003800007000607000F06000F0E000E180007E0000111A7F9114>I<0FC00001C0 +0001C0000380000380000380000380000700000700000700000700000E3E000EC3000F03800E03 +801E03801C03801C03801C0380380700380700380700380E00700E20700E20701C20701C40E00C +80600700131D7E9C18>I<01C003C003C001800000000000000000000000001C00270047004700 +870087000E000E001C001C001C003800388038807080710032001C000A1C7E9B0E>I<0FC00001 +C00001C0000380000380000380000380000700000700000700000700000E07000E18800E21C00E +23C01C47801C83001D00001E00003F800039C00038E00038E00070E10070E10070E10070E200E0 +6200603C00121D7E9C16>107 D<1F800380038007000700070007000E000E000E000E001C001C +001C001C0038003800380038007000700070007000E400E400E400E40064003800091D7E9C0C> +I<381F004E61804681C04701C08F01C08E01C00E01C00E01C01C03801C03801C03801C07003807 +10380710380E10380E2070064030038014127E9119>110 D<00F800030C000E06001C03001803 +00300300700380700380E00700E00700E00700E00E00E00E00E01C0060180060300030E0000F80 +0011127E9114>I<07078009C86008D03008E03011C03011C03801C03801C03803807003807003 +80700380600700E00700C00701800783000E86000E78000E00000E00001C00001C00001C00001C +00003C0000FF8000151A819115>I<01C206260C1E181E381C301C701C701CE038E038E038E038 +E070E070E07060F023E01CE000E000E001C001C001C001C003C01FF80F1A7E9113>I<383C4E42 +4687470F8E1E8E0C0E000E001C001C001C001C0038003800380038007000300010127E9113>I< +01F0060C04040C0E180C1C001F000FE00FF003F80038201C7018F018F010803060601F800F127E +9113>I<00C001C001C001C00380038003800380FFF00700070007000E000E000E000E001C001C +001C001C00382038203840384018800F000C1A80990F>I<1C00C02701C04701C04701C0870380 +8703800E03800E03801C07001C07001C07001C0700180E20180E20180E201C1E200C264007C380 +13127E9118>I<1C02270747074703870187010E010E011C021C021C021C041804180818081C10 +0C2007C010127E9114>I<1C00C02701C04701C04701C08703808703800E03800E03801C07001C +07001C07001C0700180E00180E00180E001C1E000C3C0007DC00001C00001800603800F03000F0 +6000E0C0004180003E0000121A7E9114>121 D E /Fi 48 123 df<00FCF807839C0E079C1C07 +081C07001C07001C07001C07001C0700FFFFE01C07001C07001C07001C07001C07001C07001C07 +001C07001C07001C07001C07001C0700FF1FE01617809615>11 D<00FC000782000E07001C0700 +1C02001C00001C00001C00001C0000FFFF001C07001C07001C07001C07001C07001C07001C0700 +1C07001C07001C07001C07001C0700FF1FE01317809614>I<60F0F070101020204040040A7D96 +0A>39 D<60F0F070101020204040040A7D830A>44 D<60F0F06004047D830A>46 +D<07C018303018701C600C600CE00EE00EE00EE00EE00EE00EE00EE00EE00E600C600C701C3018 +1C7007C00F157F9412>48 D<0F8030E040708030C038E0384038003800700070006000C0018003 +0006000C08080810183FF07FF0FFF00D157E9412>50 D<00300030007000F001F0017002700470 +08701870107020704070C070FFFE0070007000700070007003FE0F157F9412>52 +D<01F00608080C181C301C70006000E000E3E0EC30F018F00CE00EE00EE00E600E600E300C3018 +183007C00F157F9412>54 D<FFFE001C03801C00E01C00601C00701C00701C00701C00701C00E0 +1C01C01FFF801FFFC01C00E01C00701C00301C00381C00381C00381C00381C00701C00E01C01C0 +FFFF0015177F9619>66 D<00FC100383300E00B01C0070380030300030700010600010E00010E0 +0000E00000E00000E00000E00000E000106000107000103000203800201C00400E008003830000 +FC0014177E9619>I<FFFFE01C00E01C00601C00201C00101C00101C00101C04001C04001C0400 +1C0C001FFC001C0C001C04001C04081C04081C00081C00181C00101C00101C00301C00F0FFFFF0 +15177F9618>69 D<FFFFE01C00E01C00601C00201C00101C00101C00101C04001C04001C04001C +0C001FFC001C0C001C04001C04001C04001C00001C00001C00001C00001C00001C0000FFC00014 +177F9617>I<007E080381980600580C0038180018300018700008700008E00008E00000E00000 +E00000E00000E003FEE000387000387000383000381800380C00380600380380D8007F0817177E +961C>I<FFE00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E +000E000E000E000E00FFE00B177F960D>73 D<FFC0001C00001C00001C00001C00001C00001C00 +001C00001C00001C00001C00001C00001C00001C00001C00201C00201C00201C00601C00601C00 +401C00C01C03C0FFFFC013177F9616>76 D<FC00FE1E00381F001017001013801011C01011C010 +10E010107010103810103810101C10100E10100F101007101003901001D01001D01000F0100070 +100030380030FE001017177F961A>78 D<00FC000303000E01C01C00E038007030003070003860 +0018E0001CE0001CE0001CE0001CE0001CE0001CE0001C7000387000383000303800701C00E00E +01C003030000FC0016177E961B>I<0FC4302C601C400CC004C004C004E00070007F003FE00FF8 +01FC001C000E0006800680068006C004E008D81087E00F177E9614>83 D<7FFFF8603818403808 +403808803804803804803804003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380007FFC016177F9619>I<FF80FE1C00381C00101C00 +101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00101C00 +101C00100E0020060020030040018180007E0017177F961A>I<FF83FC1F01E00E008007008007 +810003820001C20001E40000E800007800007800003800007C00005E00008E0001870001078002 +03800601C00401E00C00E01C00F0FF03FE17177F961A>88 D<1FC0386038301038003803F81E38 +30387038E039E039E07970FF1F1E100E7F8D12>97 D<FC00001C00001C00001C00001C00001C00 +001C00001C00001C00001CF8001F06001C03001C03801C01801C01C01C01C01C01C01C01C01C01 +801C03801C03001B0E0010F8001217809614>I<07F01838303870106000E000E000E000E00060 +0070083008183007C00D0E7F8D10>I<007E00000E00000E00000E00000E00000E00000E00000E +00000E0007CE001C3E00300E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E +00182E0007CFC012177F9614>I<0FC0186030307038E018FFF8E000E000E00060007008301018 +3007C00D0E7F8D10>I<03E006700E701C201C001C001C001C001C00FF801C001C001C001C001C +001C001C001C001C001C001C001C00FF800C1780960B>I<0F9E18E33060707070707070306018 +C02F80200060003FE03FF83FFC600EC006C006C006600C38380FE010157F8D12>I<FC00001C00 +001C00001C00001C00001C00001C00001C00001C00001C7C001D8E001E07001C07001C07001C07 +001C07001C07001C07001C07001C07001C07001C0700FF9FE01317809614>I<183C3C18000000 +00007C1C1C1C1C1C1C1C1C1C1C1C1CFF081780960A>I<03000780078003000000000000000000 +00001F800380038003800380038003800380038003800380038003800380038003804380E300E7 +007C00091D82960B>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C3F +801C1C001C18001C20001C40001CC0001FE0001CF0001C70001C78001C3C001C1E001C1E00FF3F +C01217809613>I<FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C +001C001C001C001C001C001C00FF80091780960A>I<FC7C1F001D8E63801E0781C01C0701C01C +0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C01C0701C0FF9FE7F8 +1D0E808D1E>I<FC7C001D8E001E07001C07001C07001C07001C07001C07001C07001C07001C07 +001C07001C0700FF9FE0130E808D14>I<07C018303018600C600CE00EE00EE00EE00EE00E701C +3018183007C00F0E7F8D12>I<FCF8001F0E001C03001C03801C01801C01C01C01C01C01C01C01 +C01C01801C03801C07001F0E001CF8001C00001C00001C00001C00001C0000FF80001214808D14 +>I<07C2001C2600381E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E001C +2E0007CE00000E00000E00000E00000E00000E00007FC012147F8D13>I<FCF01D381E381C101C +001C001C001C001C001C001C001C001C00FF800D0E808D0E>I<1F4060C0C040C040E000FF007F +801FC001E080608060C060E0C09F000B0E7F8D0E>I<080008000800180018003800FF80380038 +003800380038003800380038403840384038401C800F000A147F930E>I<FC3F001C07001C0700 +1C07001C07001C07001C07001C07001C07001C07001C07001C0F000E170003E7E0130E808D14> +I<FE1F3C0E3C0C1C081C080E100E100720072003C003C003C001800180100E7F8D13>I<FCFE7C +3838383838101C3C201C3C201C4C200E4E400E4E400E8640078780078780070380030300030300 +160E7F8D19>I<FE3F3C181C100E20074007C0038001C002E004F008701838383CFC7F100E7F8D +13>I<FE1F3C0E3C0C1C081C080E100E100720072003C003C003C00180018001000100E200E200 +A400780010147F8D13>I<FFF0C0E080E081C08380878007000E001E081C08381870107030FFF0 +0D0E7F8D10>I E /Fj 5 54 df<0C003C00CC000C000C000C000C000C000C000C000C000C000C +000C000C00FF8009107E8F0F>49 D<1F00618040C08060C0600060006000C00180030006000C00 +102020207FC0FFC00B107F8F0F>I<1F00218060C060C000C0008001800F00008000400060C060 +C060804060801F000B107F8F0F>I<0300030007000F000B001300330023004300C300FFE00300 +0300030003001FE00B107F8F0F>I<20803F002C002000200020002F0030802040006000600060 +C06080C061801F000B107F8F0F>I E /Fk 10 62 df<01020408103020606040C0C0C0C0C0C0C0 +C0C0C040606020301008040201081E7E950D>40 D<80402010080C040606020303030303030303 +0303020606040C0810204080081E7E950D>I<0060000060000060000060000060000060000060 +00006000006000006000FFFFF0FFFFF00060000060000060000060000060000060000060000060 +0000600000600014167E9119>43 D<0C001C00EC000C000C000C000C000C000C000C000C000C00 +0C000C000C000C000C000C00FFC00A137D9211>49 D<1F0060C06060F070F03060300070007000 +6000C001C00180020004000810101020207FE0FFE00C137E9211>I<0FC0307070387038703800 +38003000E00FC0007000380018001C601CF01CF018E03860701FC00E137F9211>I<006000E000 +E00160026006600C600860106020606060C060FFFC0060006000600060006003FC0E137F9211> +I<60607FC07F8044004000400040004F0070C040E0006000700070E070E070E06040E021C01F00 +0C137E9211>I<07C00C201070207060006000C000CF00D0C0E060C020C030C030C03040306020 +206010C00F000C137E9211>I<7FFFE0FFFFF0000000000000000000000000000000000000FFFF +F07FFFE0140A7E8B19>61 D E /Fl 69 124 df<003FE3F801F03F1C03C03E3E07C07C3E0F807C +3E0F807C1C0F807C000F807C000F807C000F807C000F807C00FFFFFFC0FFFFFFC00F807C000F80 +7C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F +807C000F807C000F807C007FE1FFC07FE1FFC01F1D809C1C>11 D<003FC00001F0300003C03800 +07C07C000F807C000F807C000F8038000F8000000F8000000F8000000F800000FFFFFC00FFFFFC +000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F807C000F80 +7C000F807C000F807C000F807C000F807C007FE1FF807FE1FF80191D809C1B>I<002000400180 +0380030006000E001C001C003C0038003800780078007800F800F000F000F000F000F000F000F0 +00F000F000F800780078007800380038003C001C001C000E000600030003800180004000200B29 +7C9E13>40 D<800040003000380018000C000E000700070007800380038003C003C003C003E001 +E001E001E001E001E001E001E001E001E003E003C003C003C0038003800780070007000E000C00 +180038003000400080000B297D9E13>I<00038000000380000003800000038000000380000003 +80000003800000038000000380000003800000038000000380000003800000038000FFFFFFFCFF +FFFFFCFFFFFFFC0003800000038000000380000003800000038000000380000003800000038000 +0003800000038000000380000003800000038000000380001E1F7D9925>43 +D<78FCFCFEFE7A0202040408083040070E7D850D>I<FFE0FFE0FFE0FFE00B047F8A10>I<78FCFC +FCFC7806067D850D>I<000180000380000380000700000700000700000E00000E00001C00001C +00001C0000380000380000380000700000700000E00000E00000E00001C00001C00001C0000380 +000380000380000700000700000E00000E00000E00001C00001C00001C00003800003800007000 +00700000700000E00000E00000C0000011297D9E18>I<03F8000F1E001C07003C078038038078 +03C07803C07803C0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F803E0F8 +03E0F803E07803C07803C03803803C07801C07000F1E0003F800131B7E9A18>I<00600001E000 +0FE000FFE000F3E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 +03E00003E00003E00003E00003E00003E00003E00003E00003E00003E0007FFF807FFF80111B7D +9A18>I<07F8001FFE00383F80780FC0FC07C0FC07E0FC03E0FC03E07803E00007E00007C00007 +C0000F80001F00001E0000380000700000E0000180600300600600600800E01FFFC03FFFC07FFF +C0FFFFC0FFFFC0131B7E9A18>I<03F8001FFE003C1F003C0F807C07C07E07C07C07C03807C000 +0F80000F80001E00003C0003F800001E00000F800007C00007C00007E03007E07807E0FC07E0FC +07E0FC07C0780F80781F001FFE0007F800131B7E9A18>I<000180000380000780000F80001F80 +003F80006F8000CF80008F80018F80030F80060F800C0F80180F80300F80600F80C00F80FFFFF8 +FFFFF8000F80000F80000F80000F80000F80000F8001FFF801FFF8151B7F9A18>I<1801801FFF +001FFE001FFC001FF8001FC00018000018000018000018000019F8001E0E00180F801007800007 +C00007E00007E00007E07807E0F807E0F807E0F807C0F007C0600F80381F001FFE0007F000131B +7E9A18>I<007E0003FF000781800F03C01E07C03C07C03C0380780000780000F80000F8F800FB +0E00FA0780FC0380FC03C0F803E0F803E0F803E0F803E07803E07803E07803C03C03C03C07801E +0F0007FE0003F800131B7E9A18>I<6000007FFFE07FFFE07FFFC07FFF807FFF80E00300C00600 +C00C00C0180000300000300000600000E00000E00001E00001C00003C00003C00003C00003C000 +07C00007C00007C00007C00007C00007C000038000131C7D9B18>I<03F8000FFE001E0F803807 +803803C07803C07803C07E03C07F83807FC7003FFE001FFC000FFE0007FF801DFF80387FC0781F +E0F007E0F003E0F001E0F001E0F001E07801C07803803E07801FFE0003F800131B7E9A18>I<03 +F8000FFE001E0F003C07807807807803C0F803C0F803C0F803E0F803E0F803E0F803E07807E038 +07E03C0BE00E1BE003E3E00003E00003C00003C03807C07C07807C0700780F00383C001FF8000F +E000131B7E9A18>I<78FCFCFCFC7800000000000078FCFCFCFC7806127D910D>I<000380000003 +80000007C0000007C0000007C000000FE000000FE000001FF000001BF000001BF0000031F80000 +31F8000061FC000060FC0000E0FE0000C07E0000C07E0001803F0001FFFF0003FFFF8003001F80 +03001F8006000FC006000FC00E000FE00C0007E0FFC07FFEFFC07FFE1F1C7E9B24>65 +D<FFFFF800FFFFFF000FC01F800FC00FC00FC007C00FC007E00FC007E00FC007E00FC007E00FC0 +07E00FC007C00FC00F800FC03F000FFFFE000FC00F800FC007C00FC007E00FC003E00FC003F00F +C003F00FC003F00FC003F00FC003F00FC007E00FC007E00FC01FC0FFFFFF00FFFFFC001C1C7E9B +22>I<001FE02000FFF8E003F80FE007C003E00F8001E01F0000E03E0000E03E0000607E000060 +7C000060FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0000007C0000 +607E0000603E0000603E0000C01F0000C00F80018007C0030003F80E0000FFFC00001FE0001B1C +7D9B22>I<FFFFF800FFFFFF000FC01FC00FC007E00FC001F00FC001F80FC000F80FC000FC0FC0 +007C0FC0007C0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0FC0007E0F +C0007C0FC0007C0FC0007C0FC000F80FC000F80FC001F00FC007E00FC01FC0FFFFFF00FFFFF800 +1F1C7E9B25>I<FFFFFF00FFFFFF000FC01F000FC007000FC003000FC003800FC003800FC18180 +0FC181800FC181800FC180000FC380000FFF80000FFF80000FC380000FC180000FC180000FC180 +600FC180600FC000E00FC000C00FC000C00FC001C00FC001C00FC003C00FC00F80FFFFFF80FFFF +FF801B1C7E9B1F>I<FFFFFF00FFFFFF000FC01F000FC007000FC003000FC003800FC003800FC0 +01800FC181800FC181800FC180000FC180000FC380000FFF80000FFF80000FC380000FC180000F +C180000FC180000FC180000FC000000FC000000FC000000FC000000FC000000FC00000FFFF0000 +FFFF0000191C7E9B1E>I<000FF008007FFE3801FC07F807E001F80F8000781F0000783F000038 +3E0000387E0000187C000018FC000000FC000000FC000000FC000000FC000000FC000000FC007F +FFFC007FFF7C0001F87E0001F83E0001F83F0001F81F0001F80F8001F807E001F801FC07F8007F +FE78000FF818201C7D9B26>I<FFFC3FFFFFFC3FFF0FC003F00FC003F00FC003F00FC003F00FC0 +03F00FC003F00FC003F00FC003F00FC003F00FC003F00FFFFFF00FFFFFF00FC003F00FC003F00F +C003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F00FC003F0 +FFFC3FFFFFFC3FFF201C7E9B25>I<FFFFFFFF07E007E007E007E007E007E007E007E007E007E0 +07E007E007E007E007E007E007E007E007E007E007E007E007E007E0FFFFFFFF101C7F9B12>I< +FFFC07FFFFFC07FF0FC000E00FC001C00FC003800FC006000FC00C000FC038000FC070000FC0E0 +000FC1C0000FC3C0000FC7E0000FCFE0000FFBF0000FF3F8000FE1F8000FC0FC000FC0FE000FC0 +7E000FC03F000FC01F800FC01FC00FC00FC00FC007E00FC007F0FFFC3FFFFFFC3FFF201C7E9B25 +>75 D<FFFF00FFFF000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC0000FC000 +0FC0000FC0000FC0000FC0000FC0000FC0030FC0030FC0030FC0070FC0070FC0060FC00E0FC01E +0FC07EFFFFFEFFFFFE181C7E9B1D>I<FFC00003FFFFE00007FF0FE00007F00DF0000DF00DF000 +0DF00DF0000DF00CF80019F00CF80019F00C7C0031F00C7C0031F00C3E0061F00C3E0061F00C1F +00C1F00C1F00C1F00C1F00C1F00C0F8181F00C0F8181F00C07C301F00C07C301F00C03E601F00C +03E601F00C01FC01F00C01FC01F00C01FC01F00C00F801F00C00F801F0FFC0701FFFFFC0701FFF +281C7E9B2D>I<FFE003FFFFE003FF0FF000300FF800300DFC00300CFE00300C7E00300C3F0030 +0C1F80300C1FC0300C0FE0300C07F0300C03F0300C01F8300C01FC300C00FE300C007F300C003F +300C001FB00C001FF00C000FF00C0007F00C0003F00C0001F00C0000F00C0000F0FFC00070FFC0 +0030201C7E9B25>I<003FE00001F07C0003C01E000F800F801F0007C01E0003C03E0003E07E00 +03F07C0001F07C0001F0FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC +0001F87C0001F07E0003F07E0003F03E0003E03F0007E01F0007C00F800F8003C01E0001F07C00 +003FE0001D1C7D9B24>I<FFFFF800FFFFFE000FC03F800FC00F800FC007C00FC007E00FC007E0 +0FC007E00FC007E00FC007E00FC007C00FC007C00FC00F800FC03F000FFFFC000FC000000FC000 +000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00000FFFC +0000FFFC00001B1C7E9B21>I<003FE00001F07C0003C01E000F800F801F0007C01F0007C03E00 +03E07E0003F07C0001F07C0001F0FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC +0001F8FC0001F87C0001F07C0001F07E0003F03E0003E03E0703E01F08C7C00F906F8003D07E00 +01F87C00003FF8080000380800003C1800003FF800001FF800001FF000000FF0000007E0000003 +C01D247D9B24>I<FFFFF00000FFFFFE00000FC03F00000FC00F80000FC007C0000FC007E0000F +C007E0000FC007E0000FC007E0000FC007E0000FC007C0000FC00F80000FC03E00000FFFF00000 +0FC07C00000FC03E00000FC03F00000FC01F80000FC01F80000FC01F80000FC01F80000FC01F80 +000FC01F80000FC01F81800FC01F81800FC00FC180FFFC07C300FFFC01FE00211C7E9B24>I<07 +F8201FFEE03C07E07801E07000E0F000E0F00060F00060F80000FE0000FFE0007FFE003FFF003F +FF800FFFC007FFE0007FE00003F00001F00000F0C000F0C000F0C000E0E000E0F001C0FC03C0EF +FF0083FC00141C7D9B1B>I<7FFFFFE07FFFFFE0781F81E0701F80E0601F8060E01F8070C01F80 +30C01F8030C01F8030C01F8030001F8000001F8000001F8000001F8000001F8000001F8000001F +8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800007 +FFFE0007FFFE001C1C7E9B21>I<FFFC03FFFFFC03FF0FC000300FC000300FC000300FC000300F +C000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC000300FC00030 +0FC000300FC000300FC000300FC000300FC0003007C0003007C0006003E000E001F001C000FC07 +80007FFE00000FF800201C7E9B25>I<FFFC01FF80FFFC01FF800FC000180007E000300007E000 +300007F000700003F000600003F800E00001F800C00001FC00C00000FC01800000FC018000007E +030000007E030000007F070000003F060000003F8E0000001F8C0000001FCC0000000FD8000000 +0FD800000007F000000007F000000007F000000003E000000003E000000001C000000001C00000 +211C7F9B24>I<FFFC7FFE0FFCFFFC7FFE0FFC0FC007E000C00FC007F000C00FE003F001C007E0 +03F0018007E007F8018003F007F8030003F007F8030003F80CFC070001F80CFC060001F81CFE06 +0001FC187E0E0000FC187E0C0000FC387F0C00007E303F1800007E303F1800007F601FB800003F +601FB000003FE01FF000003FC00FF000001FC00FE000001FC00FE000000F8007C000000F8007C0 +00000F0003C0000007000380000007000380002E1C7F9B31>I<0FF8001C1E003E0F803E07803E +07C01C07C00007C0007FC007E7C01F07C03C07C07C07C0F807C0F807C0F807C0780BC03E13F80F +E1F815127F9117>97 D<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00 +001F00001F3F801FE1E01F80701F00781F003C1F003C1F003E1F003E1F003E1F003E1F003E1F00 +3E1F003C1F003C1F00781F80701EC1E01C3F00171D7F9C1B>I<03FC000E0E001C1F003C1F0078 +1F00780E00F80000F80000F80000F80000F80000F800007800007801803C01801C03000E0E0003 +F80011127E9115>I<000FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F0 +0001F001F9F00F07F01C03F03C01F07801F07801F0F801F0F801F0F801F0F801F0F801F0F801F0 +7801F07801F03C01F01C03F00F0FFE03F9FE171D7E9C1B>I<01FC000F07001C03803C01C07801 +C07801E0F801E0F801E0FFFFE0F80000F80000F800007800007C00603C00601E00C00F038001FC +0013127F9116>I<007F0001E38003C7C00787C00F87C00F83800F80000F80000F80000F80000F +8000FFF800FFF8000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F +80000F80000F80000F80007FF8007FF800121D809C0F>I<03F8F00E0F381E0F381C07303C0780 +3C07803C07803C07801C07001E0F000E0E001BF8001000001800001800001FFF001FFFC00FFFE0 +1FFFF07801F8F00078F00078F000787000707800F01E03C007FF00151B7F9118>I<FF0000FF00 +001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0FC01F31E01F40F01F80 +F81F80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8FFE7 +FFFFE7FF181D7F9C1B>I<1E003F003F003F003F001E00000000000000000000000000FF00FF00 +1F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B1E7F9D0E>I< +007800FC00FC00FC00FC007800000000000000000000000003FC03FC007C007C007C007C007C00 +7C007C007C007C007C007C007C007C007C007C007C007C007C707CF87CF878F8F070E01F800E26 +839D0F>I<FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F +0FF81F0FF81F03801F07001F0C001F18001F70001FF8001FFC001FBC001F3E001F1F001F0F001F +0F801F07C01F03E0FFC7FCFFC7FC161D7F9C19>I<FF00FF001F001F001F001F001F001F001F00 +1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FF +E00B1D7F9C0E>I<FF0FC07E00FF31E18F001F40F207801F80FC07C01F80FC07C01F00F807C01F +00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C01F00F807C0 +1F00F807C01F00F807C0FFE7FF3FF8FFE7FF3FF825127F9128>I<FF0FC0FF31E01F40F01F80F8 +1F80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F8FFE7FF +FFE7FF18127F911B>I<01FC000F07801C01C03C01E07800F07800F0F800F8F800F8F800F8F800 +F8F800F8F800F87800F07800F03C01E01E03C00F078001FC0015127F9118>I<FF3F80FFE1E01F +80F01F00781F007C1F003C1F003E1F003E1F003E1F003E1F003E1F003E1F003C1F007C1F00781F +80F01FC1E01F3F001F00001F00001F00001F00001F00001F0000FFE000FFE000171A7F911B>I< +03F0600F0CE01E07E03C03E07C03E07803E0F803E0F803E0F803E0F803E0F803E0F803E07803E0 +7C03E03C03E01C07E00E0FE003F3E00003E00003E00003E00003E00003E00003E0001FFC001FFC +161A7E9119>I<FE3E00FE47001E8F801E8F801E8F801F07001F00001F00001F00001F00001F00 +001F00001F00001F00001F00001F0000FFF000FFF00011127F9114>I<1FD830786018E018E018 +F000FF807FE07FF01FF807FC007CC01CC01CE01CE018F830CFC00E127E9113>I<030003000300 +0300070007000F000F003FFCFFFC1F001F001F001F001F001F001F001F001F001F0C1F0C1F0C1F +0C0F08079803F00E1A7F9913>I<FF07F8FF07F81F00F81F00F81F00F81F00F81F00F81F00F81F +00F81F00F81F00F81F00F81F00F81F00F81F01F80F01F80786FF01F8FF18127F911B>I<FFC1FC +FFC1FC1F00601F80E00F80C00FC0C007C18007C18003E30003E30001F60001F60001FE0000FC00 +00FC0000780000780000300016127F9119>I<FF8FF8FEFF8FF8FE1F03E0301F03E0301F83E070 +0F83F0600F86F06007C6F0C007CEF8C007EC79C003EC7D8003F83D8001F83F0001F83F0001F01F +0000F01E0000E00E0000E00E001F127F9122>I<FFC7FCFFC7FC1F81800F838007C70003EE0001 +FC0001F80000F800007C0000FE0001DF00039F00070F800607C00C03E0FF07FCFF07FC16127F91 +19>I<FFC1FCFFC1FC1F00601F80E00F80C00FC0C007C18007C18003E30003E30001F70001F600 +00FE0000FC0000FC00007800007800003000003000007000706000F86000F8C000F98000730000 +3E0000161A7F9119>I<3FFF803C1F00303F00303E00607C0060FC0060F80001F00003F00007E0 +0007C1800F81801F81801F03803E03007E07007C0F00FFFF0011127F9115>I<FFFFFE1701808B +18>I E /Fm 78 124 df<0001FC3C00060E67000C0EC7001C0DC6001C01C0003801C000380380 +0038038000380380003803800070038007FFFFF800700700007007000070070000E0070000E00E +0000E00E0000E00E0000E00E0001C00E0001C01C0001C01C0001C01C0001C01C0003801C000380 +3800038038000380380003003800070030000700700006006000C6606000E470C000C861800070 +3E00002025819C19>11 D<0001FC000703000C03001C07001C0300180000380000380000380000 +380000700007FFFC00701C00701C00701C00E03800E03800E03800E03800E07001C07001C07001 +C07001C0E201C0E201C0E20380E4038064038038038000030000070000060000C60000E40000CC +00007000001825819C17>I<0001FDC000070FC0000C0FC0001C0F80001C038000380380003803 +800038070000380700003807000070070007FFFE0000700E0000700E0000700E0000E01C0000E0 +1C0000E01C0000E01C0000E0380001C0380001C0380001C0380001C0710001C071000380710003 +8072000380320003801C0003800000030000000700000006000000C6000000E4000000CC000000 +700000001A25819C18>I<00E000100190003003080060060C01C00E0B8F800C0871801C080300 +1C0806001C080C00381018003810300038106000382060003820C0001841800018830000070607 +00000C0C800018184000183040003070400060604000C0E0400180E0400300E0400601C0800C01 +C0800C01C0801801C1003001C1006000C200C000C400800038001C217A9E22>37 +D<183C3C3C0404080810204080060C779C0D>39 D<00030006000800180030006000C000C00180 +03000300060006000C000C001C0018001800380030003000700070006000600060006000E000E0 +00E000E000E0006000600060006000600020003000100008000800102A7B9E11>I<0010001000 +08000C000400060006000600060006000700070007000700070006000600060006000E000E000C +000C001C001800180038003000300060006000C000C001800300030006000C00180010006000C0 +00102A809E11>I<0030000060000060000060001841803C47000ECE0007B80001E00003C0000E +F00039B800711E00C10C000300000300000300000600001112799E15>I<183878380808101020 +404080050C7D830D>44 D<FFC0FFC0FFC00A037D890F>I<3078F06005047C830D>I<0000020000 +0600000600000C00000C0000180000300000300000600000600000C00000C00001800001800003 +00000600000600000C00000C0000180000180000300000300000600000C00000C0000180000180 +000300000300000600000C00000C0000180000180000300000300000600000600000C000008000 +0017297F9E15>I<003C0000C6000183000303000603000603800E03800C03801C03801C030038 +0700380700380700380700700E00700E00700E00700E00E01C00E01C00E01C00E03800E03800E0 +3000C06000E0600060C0007180001E0000111D7B9B15>I<00020006000C001C007C039C003800 +3800380038007000700070007000E000E000E000E001C001C001C001C003800380038003800780 +FFF00F1C7C9B15>I<003C0000C3000101800201800201C00441C00441C00841C00841C00841C0 +1083801083801107000E0600000C0000180000300000C000010000060000080000100100100200 +2002004006007E0C00C7F80083F80080E000121D7C9B15>I<003E0000C1800101800200C00400 +C00440C00841C00841C00841C0088380070380000700000E0001F800003800000C00000C00000E +00000E00000E00000E00700E00E01C00801C0080380080300040600021C0001F0000121D7C9B15 +>I<0001800001C0000380000380000380000300000700000700000600000E00000C00001C0000 +180000180000300000300000600000400000C600018E00010E00020E00061C000C1C00181C003F +1C0040F800803F0000380000380000700000700000700000700000E00000600012247E9B15>I< +00C06000FFC001FF8001FE00010000010000020000020000020000020000047800058C00060600 +040600080600000700000700000600000E00000E00700E00700C00E01C00801800803800403000 +40600021C0001F0000131D7C9B15>I<000F0000308000C0800183800383800300000600000E00 +000C00001C00001CF0003B18003C0C00380C00780C00700E00700E00700E00601C00E01C00E01C +00E01C00E03800E03800E0700060600060C0002180001E0000111D7B9B15>I<09C04017E0801F +E0803C6100302700601A00400600400400800C0080080000180000100000300000600000600000 +600000C00000C00001C0000180000380000380000300000700000700000700000E00000E00000C +0000121D799B15>I<001E000061000081800180800300C00300C0060180060180060180070300 +07860003CC0003F00001F000037800063C00081E00180E00300E00600600600600600600C00C00 +C00C00C0180060100060200030C0000F0000121D7C9B15>I<003C0000C6000183000303000603 +000E03000C03801C03801C03001C0300380700380700380700380F00380E00181E00181E000C6C +00079C00001C00001800003800003000006000E0C000E0C0008180008600007C0000111D7B9B15 +>I<060F0F06000000000000000000003078F06008127C910D>I<03000780078003000000000000 +000000000000000000000000000000180038007800380008000800100010002000400040008000 +091A7D910D>I<0FFFFFE01FFFFFF0000000000000000000000000000000000000000000000000 +0000000000000000FFFFFF807FFFFF001C0C7C8F20>61 D<01E006180808100C100C200C400C40 +1C8018E038E070C1E003C007800F001C0038003080308031001E00000000000000000000003000 +7800F00060000E1E789D15>63 D<00001800000018000000380000003800000078000000780000 +00B8000001B800000138000002380000023C0000041C0000041C0000081C0000181C0000101C00 +00201C0000201C00007FFC0000401C0000801C0001801C0001001C0002001C0002001C0004000E +000C000E001C001E00FF00FFC01A1D7E9C1F>65 D<01FFFE00003C0780003803C0003801C00038 +01C0003801C0007001C0007003C0007003C00070078000E0070000E00E0000E03C0000FFF80001 +C01C0001C00E0001C00F0001C00F0003800F0003800F0003800F0003800F0007001E0007001C00 +07003C00070078000E01E000FFFF80001A1C7D9B1D>I<0003F020001E0C60003002E000E003C0 +01C001C0038001C0070000C00E0000801E0000801C0000803C0000803C00000078000000780000 +0078000000F0000000F0000000F0000000F0000000F0000400F0000400F0000400F00008007000 +08007000100038002000180040000C0180000706000001F800001B1E7A9C1E>I<01FFFE00003C +0780003801C0003801C0003800E0003800E0007000F00070007000700070007000F000E000F000 +E000F000E000F000E000F001C001E001C001E001C001E001C001C0038003C00380038003800780 +0380070007000E0007001C0007003800070070000E01C000FFFF00001C1C7D9B1F>I<01FFFFE0 +003C00E0003800600038004000380040003800400070004000700040007020400070200000E040 +0000E0400000E0C00000FFC00001C0800001C0800001C0800001C0800003810100038001000380 +020003800200070004000700040007000C00070018000E007800FFFFF0001B1C7D9B1C>I<01FF +FFC0003C01C0003800C00038008000380080003800800070008000700080007020800070200000 +E0400000E0400000E0C00000FFC00001C0800001C0800001C0800001C080000381000003800000 +0380000003800000070000000700000007000000070000000F000000FFF000001A1C7D9B1B>I< +0003F020001E0C60003002E000E003C001C001C0038001C0070000C00E0000801E0000801C0000 +803C0000803C000000780000007800000078000000F0000000F0000000F001FFC0F0001E00F000 +1C00F0001C00F0001C00F0001C00700038007000380038003800180078000C0090000707100001 +F800001B1E7A9C20>I<01FFCFFE003C01E0003801C0003801C0003801C0003801C00070038000 +700380007003800070038000E0070000E0070000E0070000FFFF0001C00E0001C00E0001C00E00 +01C00E0003801C0003801C0003801C0003801C00070038000700380007003800070038000F0078 +00FFE7FF001F1C7D9B1F>I<01FFC0003C00003800003800003800003800007000007000007000 +00700000E00000E00000E00000E00001C00001C00001C00001C000038000038000038000038000 +0700000700000700000700000F0000FFE000121C7E9B10>I<007FF00007800007000007000007 +00000700000E00000E00000E00000E00001C00001C00001C00001C000038000038000038000038 +0000700000700000700000700060E000E0E000C0C00081C0008380004700003C0000141D7B9B16 +>I<01FFC0FF003C003C0038003000380040003800800038010000700200007004000070100000 +70200000E0400000E0C00000E1C00000E5C00001C8E00001D0E00001E0E00001C0700003807000 +0380700003803800038038000700380007001C0007001C0007001C000F001E00FFE0FF80201C7D +9B20>I<01FFE0003C0000380000380000380000380000700000700000700000700000E00000E0 +0000E00000E00001C00001C00001C00001C0000380080380080380080380100700100700300700 +600700E00E03C0FFFFC0151C7D9B1A>I<01FE0007F8003E000780002E000F00002E001700002E +001700002E002700004E002E00004E004E00004E004E00004E008E00008E011C00008E011C0000 +8E021C00008E021C00010704380001070438000107083800010710380002071070000207207000 +02072070000207407000040740E000040780E000040700E0000C0700E0001C0601E000FF861FFC +00251C7D9B25>I<01FC03FE001C0070003C0060002E0040002E0040002E004000470080004700 +8000470080004380800083810000838100008181000081C1000101C2000101C2000100E2000100 +E2000200E4000200740002007400020074000400380004003800040038000C0018001C001000FF +8010001F1C7D9B1F>I<0007F000001C1C0000700E0000E0070001C0038003800380070003800E +0003C01E0003C01C0003C03C0003C03C0003C0780003C0780003C0780003C0F0000780F0000780 +F0000780F0000F00F0000F00F0000E00F0001E00F0003C0070003800700070007800E0003801C0 +001C0380000E0E000003F800001A1E7A9C20>I<01FFFC00003C070000380380003801C0003801 +C0003801C0007003C0007003C0007003C00070038000E0078000E0070000E00E0000E0380001FF +E00001C0000001C0000001C0000003800000038000000380000003800000070000000700000007 +000000070000000F000000FFE000001A1C7D9B1C>I<0007F000001C1C0000700E0000E0070001 +C0078003800380070003800E0003C01E0003C01C0003C03C0003C03C0003C0780003C0780003C0 +780003C0F0000780F0000780F0000780F0000F00F0000F00F0000E00F0001E00F0001C00707838 +00708070007104E0003905C0001D0780000F0E040003FE040000060C0000060800000E1800000F +F0000007F0000007E000000380001A257A9C20>I<01FFF800003C0E0000380700003803800038 +03800038038000700780007007800070078000700F0000E00E0000E01C0000E0700000FFC00001 +C0C00001C0600001C0700001C07000038070000380700003807000038070000700F0000700F040 +0700F0400700F0800F007880FFE0790000001E001A1D7D9B1E>I<000F8400304C00403C008018 +01001803001803001806001006001006000007000007000003E00003FC0001FF00007F800007C0 +0001C00001C00000C00000C02000C02000C0600180600180600300600200F00400CC180083E000 +161E7D9C17>I<1FFFFFC01C0701C0300E00C0200E0080600E0080400E0080401C0080801C0080 +801C0080001C000000380000003800000038000000380000007000000070000000700000007000 +0000E0000000E0000000E0000000E0000001C0000001C0000001C0000001C0000003C000007FFE +00001A1C799B1E>I<7FF0FF800F001C000E0018000E0010000E0010000E0010001C0020001C00 +20001C0020001C0020003800400038004000380040003800400070008000700080007000800070 +008000E0010000E0010000E0010000E0020000E0020000E0040000E00400006008000030300000 +104000000F800000191D779B1F>I<FF803FC01C000F001C0004001C0008001C0008001C001000 +1C0010001C0020001C0040001C0040001E0080000E0080000E0100000E0200000E0200000E0400 +000E0400000E0800000E1800000E1000000E200000072000000740000007C00000078000000700 +00000700000006000000060000001A1D779B1F>I<FF83FF0FF03C007001C038007001803800F0 +01003800F0020038017002003801700400380270040038027008001C047008001C047010001C08 +7010001C087020001C107020001C107040001C207040001C207080001C407180001C407100001C +807200001D807200001D007400001E007400001E007800001C007800001C007000001800700000 +18006000001000600000241D779B29>I<01FF81FE001E00F0001C0060001E0080000E0180000E +0100000F02000007040000070800000790000003A0000003C0000001C0000001C0000001E00000 +02E0000004E0000008F0000010700000207000006038000040380000803C0001001C0002001C00 +06001E001E001E00FF80FFC01F1C7E9B1F>I<FFC00FE00E0007800E0006000F00040007000800 +0700180007801000038020000380400003C0800001C1800001C1000001E2000000E4000000EC00 +0000F80000007000000070000000E0000000E0000000E0000000E0000001C0000001C0000001C0 +000001C00000038000003FF800001B1C789B1F>I<03CC063C0C3C181C3838303870387038E070 +E070E070E070E0E2C0E2C0E261E462643C380F127B9115>97 D<3F00070007000E000E000E000E +001C001C001C001C0039C03E60383038307038703870387038E070E070E070E060E0E0C0C0C1C0 +618063003C000D1D7B9C13>I<01F007080C08181C3838300070007000E000E000E000E000E000 +E008E010602030C01F000E127B9113>I<001F8000038000038000070000070000070000070000 +0E00000E00000E00000E0003DC00063C000C3C00181C00383800303800703800703800E07000E0 +7000E07000E07000E0E200C0E200C0E20061E4006264003C3800111D7B9C15>I<01E007100C10 +18083810701070607F80E000E000E000E000E000E0086010602030C01F000D127B9113>I<0003 +C0000670000C70001C60001C00001C0000380000380000380000380000380003FF800070000070 +0000700000700000700000E00000E00000E00000E00000E00001C00001C00001C00001C00001C0 +00038000038000038000030000030000070000C60000E60000CC00007800001425819C0D>I<00 +F3018F030F06070E0E0C0E1C0E1C0E381C381C381C381C383830383038187818F00F7000700070 +00E000E0C0C0E1C0C3007E00101A7D9113>I<0FC00001C00001C0000380000380000380000380 +000700000700000700000700000E78000E8C000F0E000E0E001C0E001C0E001C0E001C0E00381C +00381C00381C00383800703880703880707080707100E03200601C00111D7D9C15>I<01800380 +010000000000000000000000000000001C002600470047008E008E000E001C001C001C00380038 +00710071007100720072003C00091C7C9B0D>I<0006000E000600000000000000000000000000 +0000F00118021802180438043800380038007000700070007000E000E000E000E001C001C001C0 +01C003800380C300E700CE0078000F24819B0D>I<0FC00001C00001C000038000038000038000 +0380000700000700000700000700000E0F000E11000E23800E43801C83001C80001D00001E0000 +3F800039C00038E00038E00070E20070E20070E20070E400E06400603800111D7D9C13>I<1F80 +0380038007000700070007000E000E000E000E001C001C001C001C003800380038003800700070 +0070007000E400E400E400E40068003800091D7C9C0B>I<3C1E0780266318C04683A0E04703C0 +E08E0380E08E0380E00E0380E00E0380E01C0701C01C0701C01C0701C01C070380380E0388380E +0388380E0708380E0710701C0320300C01C01D127C9122>I<3C3C002646004687004707008E07 +008E07000E07000E07001C0E001C0E001C0E001C1C00381C40381C40383840383880701900300E +0012127C9117>I<01E007180C0C180C380C300E700E700EE01CE01CE01CE018E038E030E06060 +C031801E000F127B9115>I<07870004D98008E0C008E0C011C0E011C0E001C0E001C0E00381C0 +0381C00381C00381800703800703000707000706000E8C000E70000E00000E00001C00001C0000 +1C00001C00003C0000FF8000131A7F9115>I<03C4062C0C3C181C3838303870387038E070E070 +E070E070E0E0C0E0C0E061E063C03DC001C001C0038003800380038007803FF00E1A7B9113>I< +3C3C26C2468747078E068E000E000E001C001C001C001C0038003800380038007000300010127C +9112>I<01F006080C080C1C18181C001F001FC00FF007F0007800386030E030C030806060C01F +000E127D9111>I<00C001C001C001C00380038003800380FFE00700070007000E000E000E000E +001C001C001C001C00384038403840388019000E000B1A7D990E>I<1E03002707004707004707 +00870E00870E000E0E000E0E001C1C001C1C001C1C001C1C003838803838801838801839001C59 +00078E0011127C9116>I<1E06270E470E4706870287020E020E021C041C041C041C0818083808 +181018200C4007800F127C9113>I<1E01832703874703874703838707018707010E07010E0701 +1C0E021C0E021C0E021C0E04180C04181C04181C081C1C100C263007C3C018127C911C>I<070E +0019910010E38020E38041C30041C00001C00001C0000380000380000380000380000702006702 +00E70400CB04008B080070F00011127D9113>I<1E03270747074707870E870E0E0E0E0E1C1C1C +1C1C1C1C1C38383838183818381C7007F00070007000E0E0C0E1C0818047003C00101A7C9114> +I<038207C20FEC08381008001000200040008001000200040008081008383067F043E081C00F12 +7D9111>I<FFFFC012017C8B15>I E /Fn 23 121 df<00001E000000003E00000000FE00000003 +FE0000003FFE0000FFFFFE0000FFFFFE0000FFFFFE0000FFCFFE0000000FFE0000000FFE000000 +0FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000 +000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE00 +00000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE +0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000F +FE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE0000000FFE000000 +0FFE0000000FFE00007FFFFFFFC07FFFFFFFC07FFFFFFFC07FFFFFFFC0223879B731>49 +D<0007FE0000007FFFE00001FFFFF80003FFFFFE0007F01FFF000F8007FF801F0001FFC03E0000 +FFE07F8000FFF07FC0007FF0FFE0007FF8FFF0003FF8FFF0003FFCFFF0003FFCFFF0003FFCFFF0 +003FFC7FE0003FFC3FC0003FFC1F80003FFC0000003FFC0000003FF80000007FF80000007FF000 +00007FF0000000FFE0000000FFC0000001FF80000001FF00000003FE00000007FC00000007F800 +00000FF00000001FC00000003F800000007F00000000FC00000001F800000001F0003C0003E000 +3C0007C0003C000F000078001E000078003C00007800780000F800F00000F801FFFFFFF803FFFF +FFF007FFFFFFF00FFFFFFFF01FFFFFFFF03FFFFFFFF07FFFFFFFF0FFFFFFFFF0FFFFFFFFE0FFFF +FFFFE0FFFFFFFFE026387BB731>I<0003FF8000001FFFF000007FFFFE0000FE03FF0001F000FF +8003C000FFC00780007FE00FF0007FF00FF8007FF01FFC007FF81FFE007FF81FFE007FF81FFE00 +7FF81FFE007FF81FFE007FF80FFC007FF007F8007FF003F0007FF0000000FFE0000000FFC00000 +01FF80000001FF00000003FE00000007FC0000001FF000000FFFC000000FFF8000000FFFF80000 +0003FE00000000FF800000007FE00000003FF00000003FF80000003FFC0000001FFC0000001FFE +0000001FFE0200001FFF1FC0001FFF3FE0001FFF7FF0001FFF7FF0001FFFFFF8001FFFFFF8001F +FFFFF8001FFEFFF8001FFEFFF0001FFE7FF0003FFC7FE0003FFC3FC0003FF81F80007FF01FE000 +FFE007FC03FFC003FFFFFF0001FFFFFE00003FFFF0000007FF800028397CB731>I<00000007C0 +000000000FC0000000000FC0000000001FC0000000003FC0000000007FC000000000FFC0000000 +00FFC000000001FFC000000003FFC000000007FFC00000000FFFC00000000FFFC00000001EFFC0 +0000003CFFC00000007CFFC0000000F8FFC0000000F0FFC0000001E0FFC0000003C0FFC0000007 +C0FFC000000F80FFC000000F00FFC000001E00FFC000003C00FFC000007C00FFC00000F800FFC0 +0000F000FFC00001E000FFC00003C000FFC00007C000FFC0000F8000FFC0000F0000FFC0001E00 +00FFC0003C0000FFC0007C0000FFC000F80000FFC000FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFF +C0FFFFFFFFFFC0000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000000 +01FFC000000001FFC000000001FFC000000001FFC000000001FFC0000007FFFFFFC00007FFFFFF +C00007FFFFFFC00007FFFFFFC02A377DB631>I<04000000C00F800007C00FF8007FC00FFFFFFF +800FFFFFFF000FFFFFFE000FFFFFFC000FFFFFF8000FFFFFF0000FFFFFE0000FFFFF80000FFFFE +00000FFFF800000F800000000F800000000F800000000F800000000F800000000F800000000F80 +0000000F800000000F81FF00000F8FFFE0000FBFFFF8000FFE03FE000FF000FF000FC000FF800F +80007FC00F00007FE00700007FF00000003FF00000003FF80000003FF80000003FF80000003FFC +0000003FFC0600003FFC1F80003FFC3FC0003FFC7FE0003FFCFFE0003FFCFFF0003FFCFFF0003F +FCFFF0003FF8FFE0003FF8FFE0003FF87FC0007FF07F00007FF03C00007FE03E0000FFC01F0000 +FF800FC003FF0007F00FFE0003FFFFFC0001FFFFF000007FFFC000000FFC000026397BB731>I< +00000FF80000007FFF000003FFFF80000FFC07C0001FE001E0003FC001F0007F0007F000FF000F +F001FE001FF803FC003FF807FC003FF80FFC003FF80FF8003FF81FF8001FF01FF8000FE03FF800 +07C03FF00000003FF00000007FF00000007FF00000007FF00000007FF07FF000FFF0FFFE00FFF1 +F7FF00FFF3807F80FFF6003FE0FFFE001FF0FFFC001FF0FFFC000FF8FFF8000FFCFFF8000FFCFF +F8000FFEFFF8000FFEFFF0000FFEFFF0000FFFFFF0000FFFFFF0000FFF7FF0000FFF7FF0000FFF +7FF0000FFF7FF0000FFF7FF0000FFF3FF0000FFF3FF0000FFE3FF0000FFE1FF0000FFE1FF8000F +FC0FF8000FFC0FF8001FF807FC001FF003FC001FF001FE003FE000FF80FFC0007FFFFF00001FFF +FE000007FFF8000000FFC00028397CB731>I<1E00000000001F00000000001FF0000000001FFF +FFFFFFC01FFFFFFFFFC01FFFFFFFFFC03FFFFFFFFFC03FFFFFFFFF803FFFFFFFFF003FFFFFFFFE +003FFFFFFFFC003FFFFFFFF8003FFFFFFFF0007FFFFFFFF0007C000007E0007C00000FC0007800 +001F80007800001F00007800003E0000F000007E0000F00000FC0000F00001F80000000003F000 +00000003E00000000007E0000000000FC0000000000F80000000001F80000000003F8000000000 +3F00000000007F00000000007F0000000000FF0000000000FE0000000001FE0000000001FE0000 +000003FE0000000003FE0000000003FE0000000007FC0000000007FC0000000007FC000000000F +FC000000000FFC000000000FFC000000000FFC000000000FFC000000001FFC000000001FFC0000 +00001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001F +FC000000000FF80000000007F00000000003E00000002A3B7BB931>I<0001FF8000000FFFF800 +003FFFFE00007F00FF0000F8003F8001F0000FC003E0000FE007C00007F007C00007F00FC00003 +F80FC00003F81FC00003F81FC00003F81FE00003F81FF00003F81FF80003F81FFC0007F01FFF00 +07F01FFFC007E00FFFF00FE00FFFFC1FC007FFFE3F8007FFFFFF0003FFFFFC0001FFFFF80000FF +FFFE00007FFFFF00003FFFFF80003FFFFFE000FFFFFFF001FDFFFFF007F07FFFF80FE01FFFFC1F +C007FFFC3F8001FFFE3F8000FFFE7F00003FFF7F00000FFFFE000003FFFE000001FFFE000000FF +FE000000FFFE0000007FFE0000007FFE0000007EFE0000007E7F0000007E7F000000FC3F800000 +FC3FC00001F81FE00003F00FF00007E007FE007FC003FFFFFF8000FFFFFE00003FFFF8000003FF +800028397CB731>I<00000001F80000000000000001F80000000000000003FC00000000000000 +03FC0000000000000007FE0000000000000007FE0000000000000007FE000000000000000FFF00 +0000000000000FFF000000000000001FFF800000000000001FFF800000000000001FFF80000000 +0000003FFFC00000000000003FFFC00000000000007FFFE00000000000007DFFE0000000000000 +7DFFE0000000000000FDFFF0000000000000F8FFF0000000000001F8FFF8000000000001F07FF8 +000000000001F07FF8000000000003F07FFC000000000003E03FFC000000000007E03FFE000000 +000007C01FFE00000000000FC01FFF00000000000F801FFF00000000000F800FFF00000000001F +800FFF80000000001F0007FF80000000003F0007FFC0000000003E0003FFC0000000003E0003FF +C0000000007E0003FFE0000000007C0001FFE000000000FC0001FFF000000000F80000FFF00000 +0000F80000FFF000000001FFFFFFFFF800000001FFFFFFFFF800000003FFFFFFFFFC00000003FF +FFFFFFFC00000003E000003FFC00000007E000003FFE00000007C000001FFE0000000FC000001F +FF0000000F8000000FFF0000001F8000000FFF8000001F0000000FFF8000001F00000007FF8000 +003F00000007FFC000003E00000003FFC000007E00000003FFE00000FF00000001FFE000FFFFFC +0001FFFFFFF0FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0FFFFFC0001FFFFFFF0443B7DBA4B> +65 D<FFFFFFFFFFC00000FFFFFFFFFFFC0000FFFFFFFFFFFF0000FFFFFFFFFFFFC000007FF000 +01FFF000007FF000007FF800007FF000003FFC00007FF000001FFE00007FF000001FFE00007FF0 +00000FFF00007FF000000FFF00007FF0000007FF80007FF0000007FF80007FF0000007FF80007F +F0000007FF80007FF0000007FF80007FF0000007FF80007FF0000007FF80007FF0000007FF0000 +7FF000000FFF00007FF000000FFF00007FF000001FFE00007FF000001FFC00007FF000003FF800 +007FF000007FF000007FF00001FFE000007FF0000FFF8000007FFFFFFFFE0000007FFFFFFFFE00 +00007FFFFFFFFFC000007FF000007FF000007FF000001FFC00007FF000000FFE00007FF0000007 +FF00007FF0000007FF80007FF0000003FFC0007FF0000003FFC0007FF0000001FFE0007FF00000 +01FFE0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF000 +0001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFF0007FF0000001FFE0007FF0 +000003FFE0007FF0000003FFC0007FF0000007FFC0007FF000000FFF80007FF000001FFF00007F +F000003FFE00007FF00001FFFC00FFFFFFFFFFFFF800FFFFFFFFFFFFE000FFFFFFFFFFFF8000FF +FFFFFFFFF800003C3B7CBA46>I<0000001FFF000030000001FFFFE000F000000FFFFFFC01F000 +007FFFFFFE03F00001FFFE007F87F00003FFE0000FCFF0000FFF000003FFF0001FFC000001FFF0 +003FF80000007FF0007FF00000003FF000FFC00000003FF001FFC00000001FF003FF800000000F +F007FF000000000FF00FFF0000000007F00FFE0000000007F01FFE0000000003F01FFE00000000 +03F03FFC0000000003F03FFC0000000001F03FFC0000000001F07FFC0000000001F07FF8000000 +0001F07FF80000000000007FF8000000000000FFF8000000000000FFF8000000000000FFF80000 +00000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800 +0000000000FFF8000000000000FFF8000000000000FFF80000000000007FF80000000000007FF8 +0000000000007FF80000000000007FFC0000000000F03FFC0000000000F03FFC0000000000F03F +FC0000000000F01FFE0000000000F01FFE0000000001E00FFE0000000001E00FFF0000000001E0 +07FF0000000003C003FF8000000003C001FFC0000000078000FFE00000000F00007FF00000001F +00003FF80000003E00001FFC0000007C00000FFF000001F8000003FFE00007F0000001FFFE003F +C00000007FFFFFFF000000000FFFFFFC0000000001FFFFF000000000001FFF0000003C3D7BBB47 +>I<FFFFFFFFFFC0000000FFFFFFFFFFFC000000FFFFFFFFFFFF800000FFFFFFFFFFFFE0000000 +7FF80003FFF80000007FF800003FFE0000007FF800000FFF0000007FF8000003FF8000007FF800 +0001FFC000007FF8000000FFE000007FF80000007FF000007FF80000003FF800007FF80000003F +F800007FF80000001FFC00007FF80000001FFC00007FF80000000FFE00007FF80000000FFE0000 +7FF80000000FFF00007FF800000007FF00007FF800000007FF00007FF800000007FF80007FF800 +000007FF80007FF800000007FF80007FF800000007FF80007FF800000007FFC0007FF800000007 +FFC0007FF800000007FFC0007FF800000007FFC0007FF800000007FFC0007FF800000007FFC000 +7FF800000007FFC0007FF800000007FFC0007FF800000007FFC0007FF800000007FFC0007FF800 +000007FFC0007FF800000007FFC0007FF800000007FF80007FF800000007FF80007FF800000007 +FF80007FF800000007FF80007FF800000007FF00007FF80000000FFF00007FF80000000FFF0000 +7FF80000000FFE00007FF80000001FFE00007FF80000001FFC00007FF80000003FFC00007FF800 +00003FF800007FF80000007FF000007FF8000000FFE000007FF8000001FFC000007FF8000003FF +8000007FF800000FFF0000007FF800003FFE0000007FF80003FFF80000FFFFFFFFFFFFF00000FF +FFFFFFFFFF800000FFFFFFFFFFFE000000FFFFFFFFFFC0000000423B7CBA4C>I<FFFFFFFFFFFF +F000FFFFFFFFFFFFF000FFFFFFFFFFFFF000FFFFFFFFFFFFF000007FF80001FFF800007FF80000 +1FF800007FF8000007F800007FF8000003F800007FF8000001F800007FF8000000F800007FF800 +0000F800007FF80000007C00007FF80000007C00007FF80000007C00007FF80000003C00007FF8 +0000003C00007FF8003C003C00007FF8003C003C00007FF8003C001E00007FF8003C001E00007F +F8003C001E00007FF8003C000000007FF8007C000000007FF8007C000000007FF800FC00000000 +7FF803FC000000007FFFFFFC000000007FFFFFFC000000007FFFFFFC000000007FFFFFFC000000 +007FF803FC000000007FF800FC000000007FF8007C000000007FF8007C000000007FF8003C0000 +00007FF8003C000780007FF8003C000780007FF8003C000780007FF8003C000F00007FF8003C00 +0F00007FF80000000F00007FF80000000F00007FF80000001F00007FF80000001F00007FF80000 +001E00007FF80000003E00007FF80000003E00007FF80000003E00007FF80000007E00007FF800 +0000FE00007FF8000001FC00007FF8000003FC00007FF8000007FC00007FF800001FFC00007FF8 +0001FFFC00FFFFFFFFFFFFFC00FFFFFFFFFFFFF800FFFFFFFFFFFFF800FFFFFFFFFFFFF800393B +7CBA41>I<001FFF00000001FFFFF0000003FFFFFC000007F007FE00000FF801FF00001FFC00FF +80001FFC007FC0001FFC007FE0001FFC003FE0000FF8003FF0000FF8003FF00007F0003FF00001 +C0003FF0000000003FF0000000003FF0000000003FF0000000FFFFF000000FFFFFF000007FF83F +F00001FF803FF00007FE003FF0000FF8003FF0001FF0003FF0003FE0003FF0007FE0003FF0007F +E0003FF000FFC0003FF000FFC0003FF000FFC0003FF000FFC0003FF000FFC0007FF0007FE0007F +F0007FE000DFF0003FF0039FF8001FFC0F0FFFF007FFFE0FFFF001FFFC07FFF0003FE000FFF02C +267DA530>97 D<000000003FC00000003FFFC00000003FFFC00000003FFFC00000003FFFC00000 +0001FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FF +C000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC00000 +0000FFC000000000FFC000000000FFC000000000FFC00000FFC0FFC0000FFFF8FFC0003FFFFEFF +C000FFE03FFFC001FF000FFFC003FE0003FFC007FC0001FFC00FF80000FFC01FF00000FFC01FF0 +0000FFC03FF00000FFC03FE00000FFC07FE00000FFC07FE00000FFC07FE00000FFC0FFE00000FF +C0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE00000FFC0FFE0 +0000FFC0FFE00000FFC07FE00000FFC07FE00000FFC07FE00000FFC03FF00000FFC03FF00000FF +C01FF00000FFC00FF80001FFC007F80003FFC003FC0007FFC001FE000FFFE000FFC07EFFFF003F +FFFCFFFF000FFFF0FFFF0001FF80FFFF303C7DBB37>100 D<0001FFC000000FFFF800003FFFFE +0000FF80FF0001FE003F8007FC001FC00FF8000FE00FF8000FF01FF00007F03FF00007F83FF000 +07F87FE00007F87FE00003FC7FE00003FC7FE00003FCFFE00003FCFFFFFFFFFCFFFFFFFFFCFFFF +FFFFFCFFE0000000FFE0000000FFE0000000FFE00000007FE00000007FE00000007FE00000003F +E00000003FF000003C1FF000003C1FF000003C0FF800007807FC0000F803FE0001F001FF0007E0 +00FFC03FC0003FFFFF000007FFFC000000FFE00026267DA52D>I<00FF00000000FFFF00000000 +FFFF00000000FFFF00000000FFFF0000000007FF0000000003FF0000000003FF0000000003FF00 +00000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00000000 +03FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00 +00000003FF007FC00003FF01FFF80003FF07FFFC0003FF0F03FE0003FF1C01FF0003FF3001FF80 +03FF6000FF8003FFE000FFC003FFC000FFC003FF8000FFC003FF8000FFC003FF8000FFC003FF00 +00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0 +03FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF00 +00FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC0 +03FF0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFF303C7C +BB37>104 D<01F00007FC000FFE000FFE001FFF001FFF001FFF001FFF001FFF000FFE000FFE00 +07FC0001F00000000000000000000000000000000000000000000000000000000000000000FF00 +FFFF00FFFF00FFFF00FFFF0007FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 +03FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF0003FF00 +03FF0003FF0003FF0003FF0003FF0003FF0003FF00FFFFF8FFFFF8FFFFF8FFFFF8153D7DBC1B> +I<00FE007FC000FFFE01FFF800FFFE07FFFC00FFFE0F03FE00FFFE1C01FF0007FE3001FF8003FE +6000FF8003FEE000FFC003FEC000FFC003FF8000FFC003FF8000FFC003FF8000FFC003FF0000FF +C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF +0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FF +C003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF0000FFC003FF +0000FFC003FF0000FFC0FFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFFFFFFFC3FFFFF30267CA537 +>110 D<00FF01FF8000FFFF0FFFF000FFFF3FFFFC00FFFFFE03FF00FFFFF000FF8003FFC0007F +C003FF80003FE003FF00003FF003FF00001FF803FF00001FFC03FF00000FFC03FF00000FFE03FF +00000FFE03FF000007FE03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007 +FF03FF000007FF03FF000007FF03FF000007FF03FF000007FF03FF000007FE03FF000007FE03FF +00000FFE03FF00000FFC03FF00000FFC03FF00001FF803FF00001FF803FF00003FF003FF80003F +E003FFC0007FC003FFF001FF8003FFFC07FF0003FF3FFFFC0003FF0FFFF00003FF01FF000003FF +0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF000000 +0003FF0000000003FF0000000003FF0000000003FF0000000003FF0000000003FF00000000FFFF +FC000000FFFFFC000000FFFFFC000000FFFFFC00000030377DA537>112 +D<00FE03F000FFFE0FFE00FFFE1FFF00FFFE3C3F80FFFE707FC007FE60FFE003FEE0FFE003FEC0 +FFE003FFC0FFE003FF807FC003FF807FC003FF803F8003FF800E0003FF00000003FF00000003FF +00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003 +FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF00000003FF000000 +03FF00000003FF00000003FF000000FFFFFE0000FFFFFE0000FFFFFE0000FFFFFE000023267DA5 +29>114 D<0007800000078000000780000007800000078000000F8000000F8000000F8000000F +8000001F8000001F8000003F8000003F8000007F800000FF800001FF800007FF80001FFFFFF0FF +FFFFF0FFFFFFF0FFFFFFF001FF800001FF800001FF800001FF800001FF800001FF800001FF8000 +01FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF800001FF80 +0001FF800001FF800001FF803C01FF803C01FF803C01FF803C01FF803C01FF803C01FF803C01FF +803C00FF807800FFC078007FC070003FE0E0001FFFC00007FF800001FF001E377EB626>116 +D<FFFFF007FFFCFFFFF007FFFCFFFFF007FFFCFFFFF007FFFC01FF8000FC0000FFC000F80000FF +E001F000007FF003E000003FF007C000001FF80FC000000FFC1F8000000FFE1F00000007FF3E00 +000003FFFC00000001FFF800000000FFF0000000007FE0000000007FF0000000003FF800000000 +1FF8000000001FFC000000003FFE000000007FFF00000000FBFF80000001F9FF80000003F0FFC0 +000003E07FE0000007C07FF000000F803FF800001F001FFC00003E000FFC00007C0007FE0000FC +0003FF0001FC0003FF80FFFF801FFFFEFFFF801FFFFEFFFF801FFFFEFFFF801FFFFE2F267EA534 +>120 D E /Fo 40 122 df<FFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFFFEFFFFFF +FEFFFFFFFEFFFFFFFEFFFFFFFE1F0A7F9B28>45 D<07E00FF03FFC3FFC7FFEFFFFFFFFFFFFFFFF +FFFFFFFF7FFE3FFC3FFC0FF007E01010788F21>I<00001FF800000001FFFF80000007FFFFE000 +001FFFFFF800003FF81FFC0000FFE007FF0001FF8001FF8003FF0000FFC003FF0000FFC007FE00 +007FE007FE00007FE00FFC00003FF00FFC00003FF01FFC00003FF81FFC00003FF83FFC00003FFC +3FF800001FFC3FF800001FFC7FF800001FFE7FF800001FFE7FF800001FFE7FF800001FFE7FF800 +001FFE7FF800001FFEFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFF +FFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800 +001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFFFFF800001FFF +FFF800001FFFFFF800001FFFFFF800001FFF7FF800001FFE7FF800001FFE7FF800001FFE7FF800 +001FFE7FF800001FFE7FF800001FFE3FF800001FFC3FFC00003FFC3FFC00003FFC1FFC00003FF8 +1FFC00003FF81FFC00003FF80FFC00003FF00FFE00007FF007FE00007FE003FF0000FFC003FF80 +01FFC001FFC003FF8000FFE007FF00007FF81FFE00001FFFFFF8000007FFFFE0000001FFFF8000 +00001FF8000030457BC33B>48 D<03000000038007F000001F8007FF0003FF8007FFFFFFFF8007 +FFFFFFFF0007FFFFFFFE0007FFFFFFFC0007FFFFFFF80007FFFFFFF00007FFFFFFE00007FFFFFF +C00007FFFFFF000007FFFFFE000007FFFFF8000007FFFFC0000007DFFC00000007C00000000007 +C00000000007C00000000007C00000000007C00000000007C00000000007C00000000007C00000 +000007C00000000007C00000000007C07FF8000007C3FFFF000007CFFFFFE00007FFFFFFF00007 +FFC03FFC0007FE000FFE0007F80007FF0007E00007FF8007C00003FFC003800003FFE000000003 +FFE000000001FFF000000001FFF000000001FFF800000001FFF800000001FFF800000001FFF800 +000001FFFC07800001FFFC1FE00001FFFC3FF00001FFFC7FF80001FFFC7FF80001FFFCFFFC0001 +FFFCFFFC0001FFFCFFFC0001FFFCFFFC0001FFF8FFF80001FFF8FFF80001FFF87FF00001FFF07F +E00003FFF07F800003FFE03F000003FFE03F000007FFC01F80000FFF800FE0001FFF0007F0003F +FE0003FE00FFFC0001FFFFFFF80000FFFFFFE000003FFFFF8000000FFFFC00000001FFC000002E +457AC33B>53 D<0000000003E000000000000000000007F000000000000000000007F000000000 +00000000000FF80000000000000000000FF80000000000000000000FF80000000000000000001F +FC0000000000000000001FFC0000000000000000003FFE0000000000000000003FFE0000000000 +000000007FFF0000000000000000007FFF0000000000000000007FFF000000000000000000FFFF +800000000000000000FFFF800000000000000001FFFFC00000000000000001FFFFC00000000000 +000001FFFFC00000000000000003FFFFE00000000000000003EFFFE00000000000000007EFFFF0 +0000000000000007CFFFF00000000000000007C7FFF0000000000000000FC7FFF8000000000000 +000F83FFF8000000000000001F83FFFC000000000000001F03FFFC000000000000001F01FFFC00 +0000000000003F01FFFE000000000000003E00FFFE000000000000007E00FFFF00000000000000 +7C007FFF00000000000000FC007FFF80000000000000F8007FFF80000000000000F8003FFF8000 +0000000001F8003FFFC0000000000001F0001FFFC0000000000003F0001FFFE0000000000003E0 +001FFFE0000000000003E0000FFFE0000000000007E0000FFFF0000000000007C00007FFF00000 +0000000FC00007FFF800000000000F800007FFF800000000000F800003FFF800000000001F8000 +03FFFC00000000001F000001FFFC00000000003FFFFFFFFFFE00000000003FFFFFFFFFFE000000 +00007FFFFFFFFFFF00000000007FFFFFFFFFFF00000000007FFFFFFFFFFF0000000000FC000000 +7FFF8000000000F80000003FFF8000000001F80000003FFFC000000001F00000003FFFC0000000 +01F00000001FFFC000000003F00000001FFFE000000003E00000000FFFE000000007E00000000F +FFF000000007C00000000FFFF000000007C000000007FFF00000000FC000000007FFF80000000F +8000000003FFF80000001F8000000003FFFC0000001F0000000003FFFC0000007FC000000001FF +FC0000FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFFC00007FFFFFFFF80FFFFFF +C00007FFFFFFFF80FFFFFFC00007FFFFFFFF8051487CC75A>65 D<FFFFFFFFFFFFE00000FFFFFF +FFFFFFFE0000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFF000FFFFFFFFFFFFFFF800001FFF800001 +FFFE00001FFF8000007FFF00001FFF8000003FFF80001FFF8000001FFFC0001FFF8000000FFFC0 +001FFF80000007FFE0001FFF80000007FFF0001FFF80000007FFF0001FFF80000003FFF0001FFF +80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF800000 +03FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF8001FFF80000003FFF0 +001FFF80000007FFF0001FFF80000007FFE0001FFF8000000FFFE0001FFF8000000FFFC0001FFF +8000001FFF80001FFF8000003FFF00001FFF8000007FFE00001FFF800001FFFC00001FFF800007 +FFF000001FFFFFFFFFFFC000001FFFFFFFFFFE0000001FFFFFFFFFFF8000001FFFFFFFFFFFF000 +001FFF800000FFFC00001FFF8000003FFF00001FFF8000000FFFC0001FFF80000007FFE0001FFF +80000003FFF0001FFF80000003FFF8001FFF80000001FFF8001FFF80000001FFFC001FFF800000 +00FFFC001FFF80000000FFFE001FFF80000000FFFE001FFF80000000FFFE001FFF80000000FFFF +001FFF800000007FFF001FFF800000007FFF001FFF800000007FFF001FFF800000007FFF001FFF +80000000FFFF001FFF80000000FFFF001FFF80000000FFFF001FFF80000000FFFE001FFF800000 +00FFFE001FFF80000001FFFE001FFF80000001FFFC001FFF80000003FFFC001FFF80000007FFF8 +001FFF80000007FFF0001FFF8000001FFFE0001FFF8000003FFFE0001FFF800001FFFF80FFFFFF +FFFFFFFFFF00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFF000FFFFFFFFFFFFFFC000FFFFFFFFFFFF +F8000048477CC654>I<000000003FFE00000E0000000FFFFFC0001E0000007FFFFFF8003E0000 +03FFFFFFFE00FE00000FFFFFFFFF81FE00003FFFF800FFC3FE0000FFFF80000FF7FE0001FFFC00 +0003FFFE0007FFF0000001FFFE000FFFC00000007FFE001FFF800000003FFE003FFF000000001F +FE007FFE000000000FFE00FFFC0000000007FE01FFF80000000007FE03FFF00000000003FE03FF +F00000000001FE07FFE00000000001FE07FFE00000000000FE0FFFC00000000000FE0FFFC00000 +0000007E1FFFC000000000007E1FFF8000000000007E3FFF8000000000007E3FFF800000000000 +3E3FFF8000000000003E7FFF8000000000003E7FFF0000000000003E7FFF000000000000007FFF +00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF000000 +00000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF000000000000 +00FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF +000000000000007FFF000000000000007FFF000000000000007FFF000000000000007FFF800000 +0000003E3FFF8000000000003E3FFF8000000000003E3FFF8000000000003E1FFF800000000000 +3E1FFFC000000000003E0FFFC000000000007C0FFFC000000000007C07FFE000000000007C07FF +E00000000000F803FFF00000000000F803FFF00000000001F801FFF80000000001F000FFFC0000 +000003E0007FFE0000000007E0003FFF000000000FC0001FFF800000001F80000FFFC00000003F +000007FFF0000000FE000001FFFC000001FC000000FFFF80000FF80000003FFFF8007FF0000000 +0FFFFFFFFFC000000003FFFFFFFF00000000007FFFFFFC00000000000FFFFFE00000000000003F +FE000000474979C756>I<FFFFFFFFFFFFFFFE00FFFFFFFFFFFFFFFE00FFFFFFFFFFFFFFFE00FF +FFFFFFFFFFFFFE00FFFFFFFFFFFFFFFF00001FFFC00001FFFF00001FFFC000001FFF00001FFFC0 +000007FF00001FFFC0000003FF00001FFFC0000000FF00001FFFC00000007F00001FFFC0000000 +7F00001FFFC00000003F00001FFFC00000003F80001FFFC00000001F80001FFFC00000001F8000 +1FFFC00000001F80001FFFC00000000F80001FFFC00000000F80001FFFC0007C000F80001FFFC0 +007C000F80001FFFC0007C0007C0001FFFC0007C0007C0001FFFC0007C0007C0001FFFC0007C00 +07C0001FFFC000FC000000001FFFC000FC000000001FFFC000FC000000001FFFC001FC00000000 +1FFFC003FC000000001FFFC01FFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFFF +FFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFC01FFC000000001FFFC003FC00 +0000001FFFC001FC000000001FFFC000FC000000001FFFC000FC000000001FFFC000FC00000000 +1FFFC0007C00007C001FFFC0007C00007C001FFFC0007C00007C001FFFC0007C0000F8001FFFC0 +007C0000F8001FFFC0007C0000F8001FFFC000000000F8001FFFC000000001F8001FFFC0000000 +01F0001FFFC000000001F0001FFFC000000001F0001FFFC000000003F0001FFFC000000003F000 +1FFFC000000007F0001FFFC000000007E0001FFFC00000000FE0001FFFC00000001FE0001FFFC0 +0000003FE0001FFFC00000007FE0001FFFC0000000FFE0001FFFC0000003FFC0001FFFC000000F +FFC0001FFFC00000FFFFC0FFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFFC0FFFFFFFFFFFFFFFF80FF +FFFFFFFFFFFFFF80FFFFFFFFFFFFFFFF8046467CC54E>69 D<FFFFFFFFFFFFFFFC00FFFFFFFFFF +FFFFFC00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFFC00FFFFFFFFFFFFFFFE00001FFFC00003FFFE +00001FFFC000003FFE00001FFFC000000FFE00001FFFC0000003FE00001FFFC0000001FE00001F +FFC0000000FE00001FFFC0000000FE00001FFFC00000007E00001FFFC00000007F00001FFFC000 +00003F00001FFFC00000003F00001FFFC00000001F00001FFFC00000001F00001FFFC00000001F +00001FFFC00000001F00001FFFC0007C001F00001FFFC0007C000F80001FFFC0007C000F80001F +FFC0007C000F80001FFFC0007C000F80001FFFC0007C000000001FFFC000FC000000001FFFC000 +FC000000001FFFC000FC000000001FFFC001FC000000001FFFC003FC000000001FFFC01FFC0000 +00001FFFFFFFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001FFFFFFFFC000000001F +FFFFFFFC000000001FFFC01FFC000000001FFFC003FC000000001FFFC001FC000000001FFFC000 +FC000000001FFFC000FC000000001FFFC000FC000000001FFFC0007C000000001FFFC0007C0000 +00001FFFC0007C000000001FFFC0007C000000001FFFC0007C000000001FFFC0007C000000001F +FFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000 +00000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC000000000 +00001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001F +FFC00000000000001FFFC00000000000001FFFC00000000000FFFFFFFFFF00000000FFFFFFFFFF +00000000FFFFFFFFFF00000000FFFFFFFFFF00000000FFFFFFFFFF0000000041467CC54B>I<00 +0000003FFE00000E000000000FFFFFC0001E000000007FFFFFF8003E00000003FFFFFFFE00FE00 +00000FFFFFFFFF81FE0000003FFFF800FFC3FE000000FFFF80000FF7FE000001FFFC000003FFFE +000007FFF0000001FFFE00000FFFC00000007FFE00001FFF800000003FFE00003FFF000000001F +FE00007FFE000000000FFE0000FFFC0000000007FE0001FFF80000000007FE0003FFF000000000 +03FE0003FFF00000000001FE0007FFE00000000001FE0007FFE00000000000FE000FFFC0000000 +0000FE000FFFC000000000007E001FFFC000000000007E001FFF8000000000007E003FFF800000 +0000007E003FFF8000000000003E003FFF8000000000003E007FFF8000000000003E007FFF0000 +000000003E007FFF00000000000000007FFF0000000000000000FFFF0000000000000000FFFF00 +00000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF +0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FF +FF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000007FFFFFFFFE +7FFF0000007FFFFFFFFE7FFF0000007FFFFFFFFE7FFF8000007FFFFFFFFE7FFF8000007FFFFFFF +FE3FFF8000000000FFFE003FFF8000000000FFFE003FFF8000000000FFFE001FFF8000000000FF +FE001FFFC000000000FFFE000FFFC000000000FFFE000FFFC000000000FFFE0007FFE000000000 +FFFE0007FFE000000000FFFE0003FFF000000000FFFE0003FFF800000000FFFE0001FFF8000000 +00FFFE0000FFFC00000000FFFE00007FFE00000000FFFE00003FFF00000000FFFE00001FFF8000 +0000FFFE00000FFFE0000001FFFE000007FFF0000003FFFE000001FFFC000007FFFE000000FFFF +80001FFFFE0000003FFFFC00FFC7FE0000000FFFFFFFFF83FE00000003FFFFFFFE00FE00000000 +7FFFFFF8003E000000000FFFFFE0000E00000000003FFE000000004F4979C75D>I<FFFFFFFFF8 +01FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0 +FFFFFFFFF801FFFFFFFFF0001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000 +003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF800000 +1FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC0000000 +3FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001F +FFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003F +FF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFF +C00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF +8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFFF +FFFFFFFFFF8000001FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF8000001FFFFFFFFFFFFFFF80 +00001FFFFFFFFFFFFFFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC000 +00003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000 +001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000 +003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF800000 +1FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC0000000 +3FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001F +FFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003F +FF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFFC00000003FFF8000001FFF +C00000003FFF8000001FFFC00000003FFF8000FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFF +FFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF0FFFFFFFFF801FFFFFFFFF054477CC6 +5D>I<FFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFFFFFE000FFFE000000FFFE00000 +0FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000 +000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE0 +00000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFF +E000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000F +FFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE00000 +0FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000 +000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE000000FFFE0 +00000FFFE000000FFFE000000FFFE000000FFFE000FFFFFFFFFEFFFFFFFFFEFFFFFFFFFEFFFFFF +FFFEFFFFFFFFFE27477DC62D>I<FFFFFFFFF80000FFFFFFC0FFFFFFFFF80000FFFFFFC0FFFFFF +FFF80000FFFFFFC0FFFFFFFFF80000FFFFFFC0FFFFFFFFF80000FFFFFFC0001FFFC000000003FF +8000001FFFC000000001FE0000001FFFC000000003F80000001FFFC000000007F00000001FFFC0 +0000000FE00000001FFFC00000001FC00000001FFFC00000007F800000001FFFC0000000FE0000 +00001FFFC0000001FC000000001FFFC0000003F8000000001FFFC0000007F0000000001FFFC000 +001FE0000000001FFFC000003FC0000000001FFFC000007F00000000001FFFC00000FE00000000 +001FFFC00001FC00000000001FFFC00007F800000000001FFFC0000FF000000000001FFFC0001F +C000000000001FFFC0003F8000000000001FFFC0007F0000000000001FFFC000FE000000000000 +1FFFC003FC0000000000001FFFC007FC0000000000001FFFC00FFE0000000000001FFFC01FFF00 +00000000001FFFC03FFF8000000000001FFFC0FFFF8000000000001FFFC1FFFFC000000000001F +FFC3FFFFE000000000001FFFC7FFFFF000000000001FFFCFEFFFF000000000001FFFDFC7FFF800 +000000001FFFFF87FFFC00000000001FFFFE03FFFC00000000001FFFFC01FFFE00000000001FFF +F800FFFF00000000001FFFF000FFFF80000000001FFFE0007FFF80000000001FFFC0003FFFC000 +0000001FFFC0001FFFE0000000001FFFC0001FFFF0000000001FFFC0000FFFF0000000001FFFC0 +0007FFF8000000001FFFC00003FFFC000000001FFFC00003FFFE000000001FFFC00001FFFE0000 +00001FFFC00000FFFF000000001FFFC000007FFF800000001FFFC000007FFFC00000001FFFC000 +003FFFC00000001FFFC000001FFFE00000001FFFC000000FFFF00000001FFFC000000FFFF80000 +001FFFC0000007FFF80000001FFFC0000003FFFC0000001FFFC0000001FFFE0000001FFFC00000 +01FFFF0000001FFFC0000000FFFF0000001FFFC00000007FFF8000001FFFC0000000FFFFC000FF +FFFFFFF8007FFFFFFFE0FFFFFFFFF8007FFFFFFFE0FFFFFFFFF8007FFFFFFFE0FFFFFFFFF8007F +FFFFFFE0FFFFFFFFF8007FFFFFFFE053477CC65D>75 D<00000003FFF0000000000000007FFFFF +80000000000003FFFFFFF000000000000FFFFFFFFC00000000003FFF807FFF0000000000FFF800 +07FFC000000003FFE00001FFF000000007FFC00000FFF80000000FFF0000003FFC0000001FFE00 +00001FFE0000003FFC0000000FFF0000007FFC0000000FFF800000FFF800000007FFC00001FFF0 +00000003FFE00003FFF000000003FFF00003FFE000000001FFF00007FFE000000001FFF80007FF +C000000000FFF8000FFFC000000000FFFC000FFFC000000000FFFC001FFF80000000007FFE001F +FF80000000007FFE003FFF80000000007FFF003FFF80000000007FFF003FFF80000000007FFF00 +7FFF00000000003FFF807FFF00000000003FFF807FFF00000000003FFF807FFF00000000003FFF +807FFF00000000003FFF80FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003F +FFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF0000000000 +3FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000 +003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC07FFF000000 +00003FFF807FFF00000000003FFF807FFF80000000007FFF807FFF80000000007FFF803FFF8000 +0000007FFF003FFF80000000007FFF003FFF80000000007FFF001FFFC000000000FFFE001FFFC0 +00000000FFFE001FFFC000000000FFFE000FFFE000000001FFFC000FFFE000000001FFFC0007FF +E000000001FFF80003FFF000000003FFF00003FFF800000007FFF00001FFF800000007FFE00000 +FFFC0000000FFFC000007FFE0000001FFF8000007FFF0000003FFF8000003FFF8000007FFF0000 +000FFFC00000FFFC00000007FFF00003FFF800000003FFFC000FFFF000000000FFFF807FFFC000 +0000007FFFFFFFFF80000000000FFFFFFFFC000000000003FFFFFFF00000000000007FFFFF8000 +000000000003FFF0000000004A4979C759>79 D<FFFFFFFFFFFF800000FFFFFFFFFFFFFC0000FF +FFFFFFFFFFFF0000FFFFFFFFFFFFFFC000FFFFFFFFFFFFFFF000001FFF80000FFFFC00001FFF80 +0001FFFE00001FFF8000007FFF00001FFF8000003FFF80001FFF8000001FFFC0001FFF8000000F +FFC0001FFF8000000FFFE0001FFF8000000FFFE0001FFF80000007FFF0001FFF80000007FFF000 +1FFF80000007FFF0001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80 +000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007FFF8001FFF80000007 +FFF8001FFF80000007FFF0001FFF80000007FFF0001FFF80000007FFF0001FFF8000000FFFE000 +1FFF8000000FFFE0001FFF8000000FFFC0001FFF8000001FFF80001FFF8000003FFF80001FFF80 +00007FFF00001FFF800001FFFE00001FFF80000FFFF800001FFFFFFFFFFFF000001FFFFFFFFFFF +C000001FFFFFFFFFFE0000001FFFFFFFFFF00000001FFFC00000000000001FFFC0000000000000 +1FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0 +0000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000 +0000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000000000 +1FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0 +0000000000001FFFC00000000000001FFFC00000000000001FFFC00000000000001FFFC0000000 +0000001FFFC00000000000001FFFC00000000000001FFFC00000000000FFFFFFFFF800000000FF +FFFFFFF800000000FFFFFFFFF800000000FFFFFFFFF800000000FFFFFFFFF80000000045477CC6 +51>I<FFFFFFFFFFFC0000000000FFFFFFFFFFFFF000000000FFFFFFFFFFFFFE00000000FFFFFF +FFFFFFFF80000000FFFFFFFFFFFFFFE0000000001FFF80001FFFF8000000001FFF800001FFFC00 +0000001FFF8000007FFF000000001FFF8000003FFF800000001FFF8000001FFF800000001FFF80 +00000FFFC00000001FFF8000000FFFE00000001FFF8000000FFFE00000001FFF80000007FFF000 +00001FFF80000007FFF00000001FFF80000007FFF80000001FFF80000007FFF80000001FFF8000 +0007FFF80000001FFF80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF80000 +001FFF80000007FFF80000001FFF80000007FFF80000001FFF80000007FFF00000001FFF800000 +07FFF00000001FFF8000000FFFE00000001FFF8000000FFFE00000001FFF8000000FFFC0000000 +1FFF8000001FFF800000001FFF8000003FFF000000001FFF800000FFFE000000001FFF800003FF +F8000000001FFF80001FFFF0000000001FFFFFFFFFFFC0000000001FFFFFFFFFFE00000000001F +FFFFFFFFF800000000001FFFFFFFFFFE00000000001FFF80007FFF80000000001FFF80001FFFC0 +000000001FFF800007FFE0000000001FFF800003FFF0000000001FFF800001FFF8000000001FFF +800001FFFC000000001FFF800000FFFE000000001FFF800000FFFE000000001FFF8000007FFE00 +0000001FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFF000000001FFF80 +00007FFF000000001FFF8000007FFF000000001FFF8000007FFF000000001FFF8000007FFF0000 +00001FFF8000007FFF800000001FFF8000007FFF800000001FFF8000007FFF800000001FFF8000 +007FFF800000001FFF8000007FFF800000001FFF8000007FFF8000E0001FFF8000007FFF8001F0 +001FFF8000007FFFC001F0001FFF8000007FFFC001F0001FFF8000003FFFC001F0001FFF800000 +3FFFC003F0001FFF8000001FFFE003E0001FFF8000000FFFE007E0FFFFFFFFF00007FFF007C0FF +FFFFFFF00003FFFC1F80FFFFFFFFF00001FFFFFF00FFFFFFFFF000007FFFFE00FFFFFFFFF00000 +1FFFFC000000000000000000FFF00054487CC659>82 D<00007FF00007000007FFFF000F00001F +FFFFC01F00007FFFFFF03F0000FFFFFFFC7F0003FFC00FFEFF0007FE0000FFFF0007FC00003FFF +000FF000001FFF001FF0000007FF001FE0000003FF003FE0000001FF003FC0000001FF007FC000 +0000FF007FC00000007F007FC00000007F00FFC00000003F00FFC00000003F00FFC00000003F00 +FFE00000003F00FFE00000001F00FFF00000001F00FFF80000001F00FFFC0000001F00FFFF0000 +0000007FFFC0000000007FFFFE000000007FFFFFE00000003FFFFFFF0000003FFFFFFFF000001F +FFFFFFFC00001FFFFFFFFF00000FFFFFFFFFC00007FFFFFFFFE00007FFFFFFFFF00003FFFFFFFF +F80000FFFFFFFFFC00007FFFFFFFFE00003FFFFFFFFE00000FFFFFFFFF000001FFFFFFFF000000 +3FFFFFFF80000001FFFFFF800000000FFFFFC000000000FFFFC0000000001FFFC0000000000FFF +E00000000007FFE00000000003FFE07800000001FFE0F800000000FFE0F800000000FFE0F80000 +00007FE0F8000000007FE0F8000000007FE0FC000000007FE0FC000000007FC0FC000000007FC0 +FE000000007FC0FE000000007F80FF00000000FF80FF80000000FF80FFC0000000FF00FFE00000 +01FE00FFF8000003FE00FFFE000007FC00FFFF80000FF800FFFFFC007FF000FE3FFFFFFFE000FC +0FFFFFFF8000F803FFFFFF0000F0007FFFF80000E00003FFC00000334979C742>I<3FFFFFFFFF +FFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFFFFFFFFFFFF003FFFFFFF +FFFFFFFFFF003FFF0003FFF8003FFF007FF80003FFF80007FF807FE00003FFF80001FF807FC000 +03FFF80000FF807F800003FFF800007F807F000003FFF800003F807F000003FFF800003F807E00 +0003FFF800001F807E000003FFF800001F807E000003FFF800000F807C000003FFF800000F807C +000003FFF800000F807C000003FFF800000F807C000003FFF800000F80FC000003FFF800000FC0 +F8000003FFF8000007C0F8000003FFF8000007C0F8000003FFF8000007C0F8000003FFF8000007 +C0F8000003FFF8000007C000000003FFF80000000000000003FFF80000000000000003FFF80000 +000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800 +00000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8 +0000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FF +F80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000000003 +FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000000000 +03FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000000000 +0003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF80000000000 +000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF800000000 +00000003FFF80000000000000003FFF80000000000000003FFF80000000000000003FFF8000000 +0000000003FFF80000000000000003FFF8000000000003FFFFFFFFFFF800000003FFFFFFFFFFF8 +00000003FFFFFFFFFFF800000003FFFFFFFFFFF800000003FFFFFFFFFFF800004A467CC553>I< +0007FFFC000000007FFFFFC0000001FFFFFFF8000003FFFFFFFE000007FE001FFF000007FF0003 +FFC0000FFF8001FFE0000FFF8000FFF0000FFF80007FF0000FFF80007FF8000FFF80007FF80007 +FF00003FFC0007FF00003FFC0003FE00003FFC0000F800003FFC00000000003FFC00000000003F +FC00000000003FFC00000000003FFC00000007FFFFFC000000FFFFFFFC000007FFFFFFFC00003F +FFE03FFC0000FFFE003FFC0003FFF0003FFC0007FFC0003FFC000FFF00003FFC001FFE00003FFC +003FFC00003FFC007FF800003FFC007FF800003FFC00FFF000003FFC00FFF000003FFC00FFF000 +003FFC00FFF000003FFC00FFF000003FFC00FFF000007FFC007FF80000FFFC007FF80001EFFC00 +3FFC0003EFFC003FFF0007CFFF000FFFC03F8FFFF807FFFFFF07FFFC01FFFFFC03FFFC007FFFF0 +01FFFC0003FF80007FF8362E7DAD3A>97 D<007FC00000000000FFFFC00000000000FFFFC00000 +000000FFFFC00000000000FFFFC00000000000FFFFC0000000000003FFC0000000000001FFC000 +0000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0 +000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FF +C0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001 +FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00FFC000000 +01FFC07FFFC0000001FFC3FFFFF0000001FFCFFFFFFC000001FFDFF00FFF000001FFFF8003FF80 +0001FFFE0001FFC00001FFF800007FE00001FFF000007FF00001FFE000003FF80001FFE000001F +FC0001FFE000001FFC0001FFE000001FFE0001FFE000001FFE0001FFE000000FFF0001FFE00000 +0FFF0001FFE000000FFF0001FFE000000FFF0001FFE000000FFF8001FFE000000FFF8001FFE000 +000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE0 +00000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF0001FFE000000FFF0001FF +E000000FFF0001FFE000001FFE0001FFE000001FFE0001FFE000001FFC0001FFE000001FFC0001 +FFE000003FF80001FFF000003FF80001FFF800007FF00001FFFC0000FFE00001FFFE0001FFC000 +01FFBF0007FF800001FF1FE01FFE000001FE0FFFFFFC000001FC03FFFFF0000001F800FFFF8000 +0001F0001FF800000039487CC742>I<00001FFFC0000000FFFFF8000007FFFFFE00001FFFFFFF +80007FFC00FFC000FFE001FFC001FFC003FFE003FF8003FFE007FF0003FFE00FFE0003FFE00FFE +0003FFE01FFC0001FFC01FFC0001FFC03FFC0000FF803FFC00003E007FF8000000007FF8000000 +007FF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF800000000FFF8 +00000000FFF800000000FFF800000000FFF800000000FFF8000000007FF8000000007FF8000000 +007FFC000000003FFC000000003FFC000000001FFC000000F81FFE000000F80FFE000000F80FFF +000001F007FF800003F003FFC00007E001FFE0000FC000FFF0001F80007FFE00FF00001FFFFFFE +000007FFFFF8000000FFFFE00000001FFE00002D2E7CAD35>I<00000000007FC00000000000FF +FFC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000FFFFC00000000000 +03FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000000 +0001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000 +000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000 +00000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000 +00000FFC01FFC0000000FFFF81FFC0000007FFFFE1FFC000001FFFFFF9FFC000007FFC03FFFFC0 +0000FFF0007FFFC00001FFC0001FFFC00003FF80000FFFC00007FF000007FFC0000FFE000003FF +C0000FFE000003FFC0001FFC000003FFC0001FFC000003FFC0003FFC000003FFC0003FFC000003 +FFC0007FF8000003FFC0007FF8000003FFC0007FF8000003FFC000FFF8000003FFC000FFF80000 +03FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC000FFF800 +0003FFC000FFF8000003FFC000FFF8000003FFC000FFF8000003FFC0007FF8000003FFC0007FF8 +000003FFC0007FF8000003FFC0003FF8000003FFC0003FFC000003FFC0003FFC000003FFC0001F +FC000003FFC0001FFC000003FFC0000FFE000007FFC00007FF00000FFFC00003FF00001FFFC000 +01FFC0003FFFC00000FFE000FFFFE000007FF807FBFFFF80001FFFFFF3FFFF800007FFFFC3FFFF +800001FFFF03FFFF8000001FF803FFFF8039487CC742>I<00001FFE00000001FFFFE0000007FF +FFF800001FFFFFFE00007FFC07FF0000FFE001FF8001FFC0007FC003FF80003FE007FF00003FF0 +0FFE00001FF01FFE00000FF81FFC00000FF83FFC00000FFC3FFC000007FC7FFC000007FC7FF800 +0007FC7FF8000007FE7FF8000007FEFFF8000007FEFFF8000007FEFFFFFFFFFFFEFFFFFFFFFFFE +FFFFFFFFFFFEFFFFFFFFFFFCFFF800000000FFF800000000FFF800000000FFF8000000007FF800 +0000007FF8000000007FFC000000003FFC000000003FFC000000003FFC0000001C1FFE0000003E +0FFE0000003E07FF0000007E07FF000000FC03FF800001F801FFC00003F0007FF0001FE0003FFE +00FFC0001FFFFFFF800007FFFFFE000000FFFFF80000000FFF80002F2E7DAD36>I<000000FFC0 +00000007FFF80000003FFFFC000000FFFFFF000001FFC1FF000007FF03FF80000FFC03FF80000F +F807FFC0001FF807FFC0003FF007FFC0003FF007FFC0003FE003FF80007FE003FF80007FE001FF +00007FE000FE00007FE0003800007FE0000000007FE0000000007FE0000000007FE0000000007F +E0000000007FE0000000007FE0000000007FE0000000007FE0000000007FE0000000FFFFFFFE00 +00FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000FFFFFFFE0000007FF0000000007FF0000000007F +F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000 +00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007F +F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000 +00007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007F +F0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF0000000007FF00000 +00007FF00000003FFFFFF800003FFFFFF800003FFFFFF800003FFFFFF800003FFFFFF800002A48 +7DC724>I<00000000001F8000007FF000FFE00007FFFF03FFF0001FFFFFC7FFF0007FFFFFFFC7 +F800FFE03FFE0FF801FF800FFC0FF803FF0007FE0FF807FE0003FF07F007FE0003FF07F00FFC00 +01FF81C00FFC0001FF80000FFC0001FF80001FFC0001FFC0001FFC0001FFC0001FFC0001FFC000 +1FFC0001FFC0001FFC0001FFC0001FFC0001FFC0000FFC0001FF80000FFC0001FF80000FFC0001 +FF800007FE0003FF000007FE0003FF000003FF0007FE000001FF800FFC000000FFE03FF8000001 +FFFFFFF0000001DFFFFFC0000003C7FFFF00000003C07FF000000007C0000000000007C0000000 +000007C0000000000007C0000000000007E0000000000007F0000000000007F8000000000007FF +FFFFF0000007FFFFFFFF000003FFFFFFFFE00003FFFFFFFFF80001FFFFFFFFFE0001FFFFFFFFFF +0000FFFFFFFFFF80007FFFFFFFFF8003FFFFFFFFFFC00FFFFFFFFFFFC01FF800001FFFE03FE000 +0001FFE07FC00000007FF07FC00000003FF0FF800000001FF0FF800000001FF0FF800000001FF0 +FF800000001FF0FF800000001FF07FC00000003FE07FC00000003FE03FE00000007FC03FF00000 +00FFC01FFC000003FF800FFF00000FFF0003FFF000FFFC0000FFFFFFFFF000003FFFFFFFC00000 +07FFFFFE000000003FFFC0000035447DAE3B>I<007FC00000000000FFFFC00000000000FFFFC0 +0000000000FFFFC00000000000FFFFC00000000000FFFFC0000000000003FFC0000000000001FF +C0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001 +FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC00000000000 +01FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC000000000 +0001FFC0000000000001FFC0000000000001FFC0000000000001FFC0000000000001FFC001FFC0 +000001FFC00FFFF8000001FFC03FFFFE000001FFC0FFFFFF000001FFC1FC07FF800001FFC3E003 +FFC00001FFC7C001FFC00001FFCF0001FFE00001FFDE0000FFE00001FFDC0000FFE00001FFFC00 +00FFF00001FFF80000FFF00001FFF00000FFF00001FFF00000FFF00001FFF00000FFF00001FFE0 +0000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FF +E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001 +FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 +01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0 +0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF +F00001FFE00000FFF000FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07F +FFFFE0FFFFFFC07FFFFFE03B487CC742>I<00FC0001FE0003FF0007FF800FFFC01FFFE01FFFE0 +1FFFE01FFFE01FFFE01FFFE00FFFC007FF8003FF0001FE0000FC00000000000000000000000000 +000000000000000000000000000000000000000000007FC0FFFFC0FFFFC0FFFFC0FFFFC0FFFFC0 +03FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 +01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0 +01FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC001FFC0FFFFFFFFFFFFFFFFFFFFFFFF +FFFFFF18497CC820>I<007FC000000000FFFFC000000000FFFFC000000000FFFFC000000000FF +FFC000000000FFFFC00000000003FFC00000000001FFC00000000001FFC00000000001FFC00000 +000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FF +C00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0000000 +0001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC00000000001FFC0 +007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0007FFFF801FFC0000FFE00 +01FFC00007F00001FFC0000FE00001FFC0003FC00001FFC0007F800001FFC000FE000001FFC001 +FC000001FFC007F8000001FFC00FF0000001FFC01FC0000001FFC03F80000001FFC0FF00000001 +FFC1FE00000001FFC3FF00000001FFCFFF80000001FFDFFFC0000001FFFFFFC0000001FFFFFFE0 +000001FFFFFFF0000001FFFCFFF8000001FFF87FFC000001FFE03FFC000001FFC01FFE000001FF +C01FFF000001FFC00FFF800001FFC007FFC00001FFC003FFC00001FFC001FFE00001FFC001FFF0 +0001FFC000FFF80001FFC0007FFC0001FFC0003FFC0001FFC0001FFE0001FFC0000FFF0001FFC0 +000FFF8001FFC0000FFFC0FFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFFFFFFFF807FFFFF +FFFFFF807FFFFF38487CC73F>107 D<007FC000FFFFC000FFFFC000FFFFC000FFFFC000FFFFC0 +0003FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF +C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 +FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC000 +01FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC0 +0001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FF +C00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001FFC00001 +FFC00001FFC00001FFC000FFFFFF80FFFFFF80FFFFFF80FFFFFF80FFFFFF8019487CC720>I<00 +7FC001FFC00000FFE00000FFFFC00FFFF80007FFFC0000FFFFC03FFFFE001FFFFF0000FFFFC0FF +FFFF007FFFFF8000FFFFC1FC07FF80FE03FFC000FFFFC3E003FFC1F001FFE00003FFC7C001FFC3 +E000FFE00001FFCF0001FFE78000FFF00001FFDE0000FFEF00007FF00001FFDC0000FFEE00007F +F00001FFFC0000FFFE00007FF80001FFF80000FFFC00007FF80001FFF00000FFF800007FF80001 +FFF00000FFF800007FF80001FFF00000FFF800007FF80001FFE00000FFF000007FF80001FFE000 +00FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF0 +00007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007F +F80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001 +FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE000 +00FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF0 +00007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007F +F80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001FFE00000FFF000007FF80001 +FFE00000FFF000007FF80001FFE00000FFF000007FF800FFFFFFC07FFFFFE03FFFFFF0FFFFFFC0 +7FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFFE03FFFFFF0FFFFFFC07FFFFF +E03FFFFFF05C2E7CAD63>I<007FC001FFC00000FFFFC00FFFF80000FFFFC03FFFFE0000FFFFC0 +FFFFFF0000FFFFC1FC07FF8000FFFFC3E003FFC00003FFC7C001FFC00001FFCF0001FFE00001FF +DE0000FFE00001FFDC0000FFE00001FFFC0000FFF00001FFF80000FFF00001FFF00000FFF00001 +FFF00000FFF00001FFF00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 +01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0 +0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF +F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000 +FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE000 +00FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000FFFFFFC07FFFFFE0FFFFFF +C07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE0FFFFFFC07FFFFFE03B2E7CAD42>I<00000F +FF0000000000FFFFF000000007FFFFFE0000001FFFFFFF8000003FFC03FFC00000FFE0007FF000 +01FF80001FF80003FF00000FFC0007FE000007FE000FFE000007FF000FFC000003FF001FFC0000 +03FF803FFC000003FFC03FF8000001FFC03FF8000001FFC07FF8000001FFE07FF8000001FFE07F +F8000001FFE0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001 +FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF0FFF8000001FFF07FF8 +000001FFE07FF8000001FFE07FF8000001FFE07FF8000001FFE03FFC000003FFC03FFC000003FF +C01FFC000003FF801FFE000007FF800FFE000007FF0007FF00000FFE0003FF80001FFC0001FFC0 +003FF80000FFE0007FF000007FFC03FFE000001FFFFFFF80000007FFFFFE00000000FFFFF00000 +00000FFF000000342E7DAD3B>I<007FC00FFC000000FFFFC07FFFC00000FFFFC3FFFFF00000FF +FFCFFFFFFC0000FFFFDFF01FFF0000FFFFFF8007FF800003FFFE0001FFC00001FFF80000FFE000 +01FFF00000FFF00001FFE000007FF80001FFE000003FFC0001FFE000003FFC0001FFE000003FFE +0001FFE000001FFE0001FFE000001FFF0001FFE000001FFF0001FFE000001FFF0001FFE000000F +FF0001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE00000 +0FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000000FFF8001FFE000 +000FFF8001FFE000000FFF0001FFE000001FFF0001FFE000001FFF0001FFE000001FFE0001FFE0 +00001FFE0001FFE000003FFC0001FFE000003FFC0001FFE000007FF80001FFF000007FF80001FF +F80000FFF00001FFFC0001FFE00001FFFE0003FFC00001FFFF0007FF800001FFFFE03FFE000001 +FFEFFFFFFC000001FFE3FFFFF0000001FFE0FFFF80000001FFE01FF800000001FFE00000000000 +01FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE000000000 +0001FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000000001FFE0000000 +000001FFE0000000000001FFE0000000000001FFE0000000000001FFE00000000000FFFFFFC000 +000000FFFFFFC000000000FFFFFFC000000000FFFFFFC000000000FFFFFFC00000000039427CAD +42>I<00FF803F8000FFFF80FFF000FFFF83FFFC00FFFF87FFFE00FFFF8FC3FF00FFFF8F07FF00 +03FF9E0FFF8001FFBC0FFF8001FFB80FFF8001FFF80FFF8001FFF00FFF8001FFF007FF0001FFF0 +07FF0001FFE003FE0001FFE000F80001FFE000000001FFE000000001FFC000000001FFC0000000 +01FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0 +00000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0000000 +01FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC000000001FFC0 +00000001FFC000000001FFC0000000FFFFFFE00000FFFFFFE00000FFFFFFE00000FFFFFFE00000 +FFFFFFE00000292E7CAD31>114 D<000FFF00E0007FFFF3E001FFFFFFE007FFFFFFE00FF800FF +E01FC0001FE03F80000FE03F000007E07F000003E07F000003E0FF000003E0FF000003E0FF8000 +03E0FFC0000000FFF0000000FFFE000000FFFFF800007FFFFFC0007FFFFFF0003FFFFFFC001FFF +FFFF000FFFFFFF8007FFFFFFC003FFFFFFE000FFFFFFF0003FFFFFF00003FFFFF800001FFFF800 +0000FFFC0000001FFC7800000FFCF8000007FCF8000003FCFC000003FCFC000003FCFE000003F8 +FE000003F8FF000003F8FF800007F0FFC0000FF0FFF0001FE0FFFC00FFC0FFFFFFFF80FC7FFFFE +00F81FFFF800E003FF8000262E7CAD2F>I<0001F000000001F000000001F000000001F0000000 +01F000000001F000000003F000000003F000000003F000000007F000000007F000000007F00000 +000FF00000000FF00000001FF00000003FF00000003FF00000007FF0000001FFF0000003FFF000 +000FFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC0FFFFFFFFC000FFF0000000FFF0000000FFF0 +000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FF +F0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000 +FFF0000000FFF0000000FFF0000000FFF0000000FFF0000000FFF001F000FFF001F000FFF001F0 +00FFF001F000FFF001F000FFF001F000FFF001F000FFF001F000FFF001F0007FF001E0007FF803 +E0003FF803E0003FFC07C0001FFE0F80000FFFFF800007FFFE000001FFFC0000001FF00024427E +C12E>I<007FE000003FF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE0007FFFF000FFFFE0 +007FFFF000FFFFE0007FFFF00003FFE00001FFF00001FFE00000FFF00001FFE00000FFF00001FF +E00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001 +FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF000 +01FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF0 +0001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FF +F00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00000FFF00001FFE00001 +FFF00001FFE00001FFF00001FFE00001FFF00001FFE00003FFF00000FFE00007FFF00000FFE000 +0F7FF000007FE0001F7FF000007FF0003E7FF800003FFC00FC7FFFE0001FFFFFF87FFFE00007FF +FFE07FFFE00001FFFF807FFFE000003FFE007FFFE03B2E7CAD42>I<FFFFFF8001FFFFFFFFFF80 +01FFFFFFFFFF8001FFFFFFFFFF8001FFFFFFFFFF8001FFFF01FFE000001FC001FFF000001F8001 +FFF000001F8000FFF800001F0000FFF800003F00007FF800003E00007FFC00007E00003FFC0000 +7C00003FFE0000FC00001FFE0000F800001FFF0001F800000FFF0001F000000FFF8003F0000007 +FF8003E0000007FFC007E0000007FFC007E0000003FFE007C0000003FFE00FC0000001FFE00F80 +000001FFF01F80000000FFF01F00000000FFF83F000000007FF83E000000007FFC7E000000003F +FC7C000000003FFEFC000000001FFEF8000000001FFFF8000000001FFFF8000000000FFFF00000 +00000FFFF00000000007FFE00000000007FFE00000000003FFC00000000003FFC00000000001FF +800000000001FF800000000000FF000000000000FF0000000000007E0000000000003C00000038 +2E7DAD3F>I<FFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFEFFFFFF07FFFFE007FFFEFFFFFF +07FFFFE007FFFEFFFFFF07FFFFE007FFFE03FFC0001FFC00003FC003FFE0000FFC00001F8001FF +E0000FFC00001F0001FFE0000FFE00001F0001FFF00007FE00003F0000FFF0000FFF00003E0000 +FFF8000FFF00007E00007FF8000FFF00007C00007FF8001FFF80007C00003FFC001FFF8000F800 +003FFC003FFFC000F800003FFE003EFFC001F800001FFE003EFFC001F000001FFE007EFFE003F0 +00000FFF007C7FE003E000000FFF00FC7FF003E000000FFF80F83FF007E0000007FF80F83FF007 +C0000007FF81F83FF80FC0000003FFC1F01FF80F80000003FFC3F01FFC0F80000003FFE3E00FFC +1F80000001FFE3E00FFC1F00000001FFE7E00FFE3F00000000FFF7C007FE3E00000000FFFFC007 +FF3E00000000FFFF8003FF7E000000007FFF8003FF7C000000007FFF8003FFFC000000003FFF00 +01FFF8000000003FFF0001FFF8000000003FFE0000FFF8000000001FFE0000FFF0000000001FFE +0000FFF0000000000FFC00007FE0000000000FFC00007FE0000000000FF800003FE00000000007 +F800003FC00000000007F800003FC00000000003F000001F800000000001E000000F0000004F2E +7DAD56>I<7FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFFFFC000FFFF807FFF +FFC000FFFF8000FFF000000FE00000FFF800000FC00000FFF800000FC000007FFC00000F800000 +7FFC00001F8000003FFC00001F0000003FFE00003F0000001FFE00003E0000001FFF00007E0000 +000FFF00007C0000000FFF8000FC00000007FF8000F800000007FFC001F800000003FFC001F000 +000003FFE003F000000003FFE003F000000001FFF003E000000001FFF007E000000000FFF007C0 +00000000FFF80FC0000000007FF80F80000000007FFC1F80000000003FFC1F00000000003FFE3F +00000000001FFE3E00000000001FFF7E00000000000FFF7C00000000000FFFFC00000000000FFF +FC000000000007FFF8000000000007FFF8000000000003FFF0000000000003FFF0000000000001 +FFE0000000000001FFE0000000000000FFC0000000000000FFC00000000000007F800000000000 +007F800000000000003F000000000000003F000000000000003F000000000000003E0000000000 +00007E000000000000007C00000000000000FC000000001F8000F8000000003FC001F800000000 +7FE001F000000000FFF003F000000000FFF003E000000000FFF007E000000000FFF00FC0000000 +00FFF01F8000000000FFF03F80000000007FE07F00000000007F43FE00000000003FFFF8000000 +00001FFFF0000000000007FFC0000000000001FE00000000000039427EAD3F>121 +D E /Fp 87 124 df<007E1F0001C1B1800303E3C00703C3C00E03C1800E01C0000E01C0000E01 +C0000E01C0000E01C0000E01C000FFFFFC000E01C0000E01C0000E01C0000E01C0000E01C0000E +01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C0000E01C000 +0E01C0007F87FC001A1D809C18>11 D<007E0001C1800301800703C00E03C00E01800E00000E00 +000E00000E00000E0000FFFFC00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01 +C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F87F8151D809C17>I<007FC001C1C003 +03C00703C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0FFFFC00E01C00E01C00E01C00E +01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C07F +CFF8151D809C17>I<003F07E00001C09C18000380F018000701F03C000E01E03C000E00E01800 +0E00E000000E00E000000E00E000000E00E000000E00E00000FFFFFFFC000E00E01C000E00E01C +000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E0 +1C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C000E00E01C007FC7FCFF80211D +809C23>I<60F0F0F0F0F0F0F060606060606060606060606060000000000060F0F060041E7C9D +0C>33 D<6060F0F0F8F86868080808080808101010102020404080800D0C7F9C15>I<0F0000C0 +188000C030600380703807006027FB00E0100600E0100C00E0100C00E0101800E0101800E01030 +00E0106000602060007020C00030418000188180000F0303C00006062000060C10000C1C080018 +18080018380400303804006038040060380400C0380400C03804018038040300180803001C0806 +000C100C000620040003C01E217E9E23>37 D<60F0F8680808081010204080050C7C9C0C>39 +D<004000800100020006000C000C0018001800300030007000600060006000E000E000E000E000 +E000E000E000E000E000E000E000E000600060006000700030003000180018000C000C00060002 +000100008000400A2A7D9E10>I<800040002000100018000C000C000600060003000300038001 +800180018001C001C001C001C001C001C001C001C001C001C001C001C001800180018003800300 +0300060006000C000C00180010002000400080000A2A7E9E10>I<01800180018001804182F18F +399C0FF003C003C00FF0399CF18F4182018001800180018010127E9E15>I<0006000000060000 +000600000006000000060000000600000006000000060000000600000006000000060000000600 +0000060000FFFFFFE0FFFFFFE00006000000060000000600000006000000060000000600000006 +00000006000000060000000600000006000000060000000600001B1C7E9720>I<60F0F0701010 +101020204080040C7C830C>I<FFE0FFE00B0280890E>I<60F0F06004047C830C>I<0001000300 +0600060006000C000C000C0018001800180030003000300060006000C000C000C0018001800180 +030003000300060006000C000C000C00180018001800300030003000600060006000C000C00010 +297E9E15>I<03C00C301818300C300C700E60066006E007E007E007E007E007E007E007E007E0 +07E007E007E007E00760066006700E300C300C18180C3007E0101D7E9B15>I<030007003F00C7 +000700070007000700070007000700070007000700070007000700070007000700070007000700 +0700070007000F80FFF80D1C7C9B15>I<07C01830201C400C400EF00FF80FF807F8077007000F +000E000E001C001C00380070006000C00180030006010C01180110023FFE7FFEFFFE101C7E9B15 +>I<07E01830201C201C781E780E781E381E001C001C00180030006007E00030001C001C000E00 +0F000F700FF80FF80FF80FF00E401C201C183007E0101D7E9B15>I<000C00000C00001C00003C +00003C00005C0000DC00009C00011C00031C00021C00041C000C1C00081C00101C00301C00201C +00401C00C01C00FFFFC0001C00001C00001C00001C00001C00001C00001C0001FFC0121C7F9B15 +>I<300C3FF83FF03FC020002000200020002000200023E024302818301C200E000E000F000F00 +0F600FF00FF00FF00F800E401E401C2038187007C0101D7E9B15>I<00F0030C06040C0E181E30 +1E300C700070006000E3E0E430E818F00CF00EE006E007E007E007E007E007600760077006300E +300C18180C3003E0101D7E9B15>I<4000007FFF807FFF007FFF00400200800400800400800800 +00100000100000200000600000400000C00000C00001C000018000018000038000038000038000 +038000078000078000078000078000078000078000030000111D7E9B15>I<03E00C301008200C +20066006600660067006780C3E083FB01FE007F007F818FC307E601E600FC007C003C003C003C0 +0360026004300C1C1007E0101D7E9B15>I<03C00C301818300C700C600EE006E006E007E007E0 +07E007E0076007700F300F18170C2707C700060006000E300C780C78187010203030C00F80101D +7E9B15>I<60F0F0600000000000000000000060F0F06004127C910C>I<60F0F060000000000000 +0000000060F0F0701010101020204080041A7C910C>I<7FFFFFC0FFFFFFE00000000000000000 +000000000000000000000000000000000000000000000000FFFFFFE07FFFFFC01B0C7E8F20>61 +D<030007800780030000000000000000000000010001000200020002000200060004000C001800 +38007000E000E01EE01EE01EE00E600430180FE00F1D7E9414>I<0FE03038401CE00EF00EF00E +F00E000C001C0030006000C0008001800100010001000100010001000000000000000000000003 +000780078003000F1D7E9C14>I<000600000006000000060000000F0000000F0000000F000000 +17800000178000001780000023C0000023C0000023C0000041E0000041E0000041E0000080F000 +0080F0000180F8000100780001FFF80003007C0002003C0002003C0006003E0004001E0004001E +000C001F001E001F00FF80FFF01C1D7F9C1F>65 D<FFFFC00F00F00F00380F003C0F001C0F001E +0F001E0F001E0F001E0F001C0F003C0F00780F01F00FFFE00F00780F003C0F001E0F000E0F000F +0F000F0F000F0F000F0F000F0F001E0F001E0F003C0F0078FFFFE0181C7E9B1D>I<001F808000 +E0618001801980070007800E0003801C0003801C00018038000180780000807800008070000080 +F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000070000080780000 +8078000080380000801C0001001C0001000E000200070004000180080000E03000001FC000191E +7E9C1E>I<FFFFC0000F00F0000F003C000F000E000F0007000F0007000F0003800F0003C00F00 +01C00F0001C00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F0001E00F +0001C00F0001C00F0003C00F0003800F0007800F0007000F000E000F001C000F007000FFFFC000 +1B1C7E9B20>I<FFFFFC0F003C0F000C0F00040F00040F00060F00020F00020F02020F02000F02 +000F02000F06000FFE000F06000F02000F02000F02000F02010F00010F00020F00020F00020F00 +060F00060F000C0F003CFFFFFC181C7E9B1C>I<FFFFF80F00780F00180F00080F00080F000C0F +00040F00040F02040F02000F02000F02000F06000FFE000F06000F02000F02000F02000F02000F +00000F00000F00000F00000F00000F00000F00000F8000FFF800161C7E9B1B>I<001F808000E0 +618001801980070007800E0003801C0003801C00018038000180780000807800008070000080F0 +000000F0000000F0000000F0000000F0000000F0000000F000FFF0F0000F807000078078000780 +78000780380007801C0007801C0007800E00078007000B800180118000E06080001F80001C1E7E +9C21>I<FFF3FFC00F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C +000F003C000F003C000F003C000F003C000FFFFC000F003C000F003C000F003C000F003C000F00 +3C000F003C000F003C000F003C000F003C000F003C000F003C000F003C000F003C00FFF3FFC01A +1C7E9B1F>I<FFF00F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F +000F000F000F000F000F000F000F000F000F000F00FFF00C1C7F9B0F>I<1FFF00F80078007800 +7800780078007800780078007800780078007800780078007800780078007800787078F878F878 +F878F0F040E021C01F00101D7F9B15>I<FFF03FE00F000F000F000C000F0008000F0010000F00 +20000F0040000F0080000F0100000F0200000F0400000F0E00000F1F00000F2F00000F2780000F +4780000F83C0000F01E0000F01E0000F00F0000F00F8000F0078000F003C000F003C000F001E00 +0F001F000F001F80FFF07FF01C1C7E9B20>I<FFF8000F80000F00000F00000F00000F00000F00 +000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00080F00 +080F00080F00180F00180F00100F00300F00700F01F0FFFFF0151C7E9B1A>I<FF8000FF800F80 +00F8000F8000F8000BC00178000BC00178000BC001780009E002780009E002780008F004780008 +F004780008F0047800087808780008780878000878087800083C107800083C107800083C107800 +081E207800081E207800081E207800080F407800080F4078000807807800080780780008078078 +0008030078001C03007800FF8307FF80211C7E9B26>I<FF007FC00F800E000F8004000BC00400 +09E0040009E0040008F0040008F8040008780400083C0400083C0400081E0400080F0400080F04 +00080784000807C4000803C4000801E4000801E4000800F40008007C0008007C0008003C000800 +3C0008001C0008000C001C000C00FF8004001A1C7E9B1F>I<003F800000E0E000038038000700 +1C000E000E001C0007003C00078038000380780003C0780003C0700001C0F00001E0F00001E0F0 +0001E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C0780003C038000380 +3C0007801C0007000E000E0007001C000380380000E0E000003F80001B1E7E9C20>I<FFFF800F +00E00F00780F003C0F001C0F001E0F001E0F001E0F001E0F001E0F001C0F003C0F00780F00E00F +FF800F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0000FF +F000171C7E9B1C>I<003F800000E0E0000380380007001C000E000E001C0007003C0007803800 +0380780003C0780003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F0 +0001E0F00001E0700001C0780003C0780003C0380003803C0E07801C1107000E208E0007205C00 +03A0780000F0E020003FE0200000602000003060000038E000003FC000003FC000001F8000000F +001B257E9C20>I<FFFF00000F01E0000F0078000F003C000F001C000F001E000F001E000F001E +000F001E000F001C000F003C000F0078000F01E0000FFF00000F03C0000F00E0000F00F0000F00 +78000F0078000F0078000F0078000F0078000F0078000F0078100F0078100F0038100F003C20FF +F01C20000007C01C1D7E9B1F>I<07E0801C1980300580700380600180E00180E00080E00080E0 +0080F00000F800007C00007FC0003FF8001FFE0007FF0000FF80000F800007C00003C00001C080 +01C08001C08001C0C00180C00180E00300D00200CC0C0083F800121E7E9C17>I<7FFFFFC0700F +01C0600F00C0400F0040400F0040C00F0020800F0020800F0020800F0020000F0000000F000000 +0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 +000F0000000F0000000F0000000F0000000F0000001F800003FFFC001B1C7F9B1E>I<FFF07FC0 +0F000E000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004 +000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F00 +04000F0004000700080007800800038010000180100000C020000070C000001F00001A1D7E9B1F +>I<FFE00FF01F0003C00F0001800F0001000F800300078002000780020003C0040003C0040003 +C0040001E0080001E0080001F0080000F0100000F0100000F830000078200000782000003C4000 +003C4000003C4000001E8000001E8000001F8000000F0000000F00000006000000060000000600 +001C1D7F9B1F>I<FFE0FFE0FF1F001F003C1E001E00180F001F00100F001F00100F001F001007 +801F00200780278020078027802003C027804003C043C04003C043C04003E043C04001E081E080 +01E081E08001E081E08000F100F10000F100F10000F100F100007900FA00007A007A00007A007A +00003E007C00003C003C00003C003C00003C003C00001800180000180018000018001800281D7F +9B2B>I<7FF0FFC00FC03E000780180003C0180003E0100001E0200001F0600000F04000007880 +00007D8000003D0000001E0000001F0000000F0000000F8000000F80000013C0000023E0000021 +E0000041F00000C0F8000080780001007C0003003C0002001E0006001F001F003F80FFC0FFF01C +1C7F9B1F>I<FFF007FC0F8001E00780008007C0018003C0010003E0020001F0020000F0040000 +F8040000780800007C1800003C1000001E2000001F2000000F4000000FC0000007800000078000 +000780000007800000078000000780000007800000078000000780000007800000078000007FF8 +001E1C809B1F>I<7FFFF07C01F07001E06003C06003C0400780400F80400F00401E00001E0000 +3C00007C0000780000F00000F00001E00003E00003C0100780100780100F00101F00301E00203C +00203C00607800E0F803E0FFFFE0141C7E9B19>I<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE07297C9E0C>I<FEFE06060606060606 +060606060606060606060606060606060606060606060606060606060606FEFE0729809E0C>93 +D<0810204040808080B0F87830050C7D9C0C>96 D<1FC000307000783800781C00301C00001C00 +001C0001FC000F1C00381C00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E +9115>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C7C +001D86001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C00C01C01 +C01C01801E030019060010F800131D7F9C17>I<07E00C301878307870306000E000E000E000E0 +00E000E00060007004300418080C3007C00E127E9112>I<003F00000700000700000700000700 +00070000070000070000070000070000070003E7000C1700180F00300700700700600700E00700 +E00700E00700E00700E00700E00700600700700700300700180F000C370007C7E0131D7E9C17> +I<03E00C301818300C700E6006E006FFFEE000E000E000E00060007002300218040C1803E00F12 +7F9112>I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE00E000E000E000E000E00 +0E000E000E000E000E000E000E000E000E000E000E007FE00F1D809C0D>I<00038003C4C00C38 +C01C3880181800381C00381C00381C00381C001818001C38000C300013C0001000003000001800 +001FF8001FFF001FFF803003806001C0C000C0C000C0C000C06001803003001C0E0007F800121C +7F9215>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C +7C001C87001D03001E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C +03801C03801C03801C0380FF9FF0141D7F9C17>I<18003C003C00180000000000000000000000 +00000000FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF +80091D7F9C0C>I<00C001E001E000C000000000000000000000000000000FE000E000E000E000 +E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0C0F1C0 +61803E000B25839C0D>I<FC00001C00001C00001C00001C00001C00001C00001C00001C00001C +00001C00001C3FC01C0F001C0C001C08001C10001C20001C40001CE0001DE0001E70001C78001C +38001C3C001C1C001C0E001C0F001C0F80FF9FE0131D7F9C16>I<FC001C001C001C001C001C00 +1C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C +001C001C00FF80091D7F9C0C>I<FC7E07E0001C838838001D019018001E01E01C001C01C01C00 +1C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C001C01C01C +001C01C01C001C01C01C001C01C01C001C01C01C00FF8FF8FF8021127F9124>I<FC7C001C8700 +1D03001E03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C0380 +1C03801C0380FF9FF014127F9117>I<03F0000E1C00180600300300700380600180E001C0E001 +C0E001C0E001C0E001C0E001C06001807003803003001806000E1C0003F00012127F9115>I<FC +7C001D86001E03001C01801C01C01C00C01C00E01C00E01C00E01C00E01C00E01C00E01C01C01C +01C01C01801E03001D06001CF8001C00001C00001C00001C00001C00001C00001C0000FF800013 +1A7F9117>I<03C1000C3300180B00300F00700700700700E00700E00700E00700E00700E00700 +E00700600700700700300F00180F000C370007C700000700000700000700000700000700000700 +000700003FE0131A7E9116>I<FCE01D301E781E781C301C001C001C001C001C001C001C001C00 +1C001C001C001C00FFC00D127F9110>I<1F9030704030C010C010E010F8007F803FE00FF000F8 +80388018C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00FFE0 +1C001C001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F9910 +>I<FC1F801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C03801C +03801C03801C07800C07800E1B8003E3F014127F9117>I<FF07E03C03801C01001C01000E0200 +0E020007040007040007040003880003880003D80001D00001D00000E00000E00000E000004000 +13127F9116>I<FF3FCFE03C0F03801C0701801C0701001C0B01000E0B82000E0B82000E118200 +0711C4000711C4000720C40003A0E80003A0E80003C0680001C0700001C0700001803000008020 +001B127F911E>I<7F8FF00F03800F030007020003840001C80001D80000F00000700000780000 +F800009C00010E00020E000607000403801E07C0FF0FF81512809116>I<FF07E03C03801C0100 +1C01000E02000E020007040007040007040003880003880003D80001D00001D00000E00000E000 +00E000004000004000008000008000F08000F10000F300006600003C0000131A7F9116>I<7FFC +70386038407040F040E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112 +>I<FFFFF01401808B15>I E /Fq 1 98 df<00040000000E0000000E0000000E0000001F000000 +1F0000003F800000278000002780000043C0000043C0000043C0000081E0000081E0000101F000 +0100F0000100F00003FFF8000200780006007C0004003C0004003C000C001E000C001E003C003F +00FF00FFE01B1A7F991F>97 D E /Fr 62 123 df<0001FF81FE00001FFFEFFF80007F80FF87C0 +00FC00FE0FE001F801FE0FE003F801FC0FE007F001FC0FE007F001FC07C007F001FC000007F001 +FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC0000FFFFFFFFF800 +FFFFFFFFF800FFFFFFFFF80007F001FC000007F001FC000007F001FC000007F001FC000007F001 +FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC0000 +07F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001FC000007F001 +FC000007F001FC000007F001FC000007F001FC00007FFF1FFFE0007FFF1FFFE0007FFF1FFFE000 +2B2A7FA928>11 D<0001FF0000001FFFC000007F80F00000FC00F80001F801F80003F803FC0007 +F003FC0007F003FC0007F003FC0007F001F80007F000F00007F000000007F000000007F0000000 +07F0000000FFFFFFFC00FFFFFFFC00FFFFFFFC0007F001FC0007F001FC0007F001FC0007F001FC +0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001 +FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F001FC0007F0 +01FC0007F001FC007FFF1FFFC07FFF1FFFC07FFF1FFFC0222A7FA926>I<0001FF803FE000001F +FFE3FFF800007F80FFF01E0000FE007F801F0001F800FF003F0003F801FF007F8007F001FE007F +8007F001FE007F8007F001FE007F8007F000FE003F0007F000FE001E0007F000FE00000007F000 +FE00000007F000FE00000007F000FE000000FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF80 +07F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE +003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007 +F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE00 +3F8007F000FE003F8007F000FE003F8007F000FE003F8007F000FE003F807FFF0FFFE3FFF87FFF +0FFFE3FFF87FFF0FFFE3FFF8352A7FA939>14 D<FFFF80FFFF80FFFF80FFFF80FFFF80FFFF8011 +067F9017>45 D<1C003E007F00FF80FF80FF807F003E001C0009097B8813>I<003F800001FFF0 +0007E0FC000FC07E001F803F001F803F003F001F803F001F807F001FC07F001FC07F001FC07F00 +1FC0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF +001FE0FF001FE0FF001FE0FF001FE0FF001FE0FF001FE07F001FC07F001FC07F001FC07F001FC0 +3F001F803F001F801F803F001F803F000FC07E0007E0FC0001FFF000003F80001B277DA622>48 +D<000E00001E00007E0007FE00FFFE00FFFE00F8FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE007FFFFE7FFFFE7FFF +FE17277BA622>I<00FF800003FFF0000FFFFC001F03FE003800FF007C007F80FE003FC0FF003F +C0FF003FE0FF001FE0FF001FE07E001FE03C003FE000003FE000003FC000003FC000007F800000 +7F000000FE000000FC000001F8000003F0000003E00000078000000F0000001E0000003C00E000 +7000E000E000E001C001C0038001C0070001C00FFFFFC01FFFFFC03FFFFFC07FFFFFC0FFFFFF80 +FFFFFF80FFFFFF801B277DA622>I<007F800003FFF00007FFFC000F81FE001F00FF003F80FF00 +3F807F803F807F803F807F801F807F800F007F800000FF000000FF000000FE000001FC000001F8 +000007F00000FFC00000FFF0000001FC0000007E0000007F0000007F8000003FC000003FC00000 +3FE000003FE03C003FE07E003FE0FF003FE0FF003FE0FF003FC0FF007FC07E007F807C007F003F +01FE001FFFFC0007FFF00000FF80001B277DA622>I<00000E0000001E0000003E0000007E0000 +00FE000000FE000001FE000003FE0000077E00000E7E00000E7E00001C7E0000387E0000707E00 +00E07E0000E07E0001C07E0003807E0007007E000E007E000E007E001C007E0038007E0070007E +00E0007E00FFFFFFF8FFFFFFF8FFFFFFF80000FE000000FE000000FE000000FE000000FE000000 +FE000000FE000000FE00007FFFF8007FFFF8007FFFF81D277EA622>I<0C0003000F803F000FFF +FE000FFFFC000FFFF8000FFFF0000FFFE0000FFFC0000FFE00000E0000000E0000000E0000000E +0000000E0000000E0000000E7FC0000FFFF8000F80FC000E003E000C003F0000001F8000001FC0 +00001FC000001FE000001FE018001FE07C001FE0FE001FE0FE001FE0FE001FE0FE001FC0FC001F +C078003F8078003F803C007F001F01FE000FFFF80003FFF00000FF80001B277DA622>I<0007F0 +00003FFC0000FFFE0001FC0F0003F01F8007E03F800FC03F801FC03F801F803F803F801F003F80 +00007F0000007F0000007F000000FF000000FF0FC000FF3FF800FF707C00FFC03E00FFC03F00FF +801F80FF801FC0FF001FC0FF001FE0FF001FE0FF001FE07F001FE07F001FE07F001FE07F001FE0 +3F001FE03F001FC01F801FC01F803F800FC03F0007E07E0003FFFC0000FFF000003FC0001B277D +A622>I<380000003E0000003FFFFFF03FFFFFF03FFFFFF07FFFFFE07FFFFFC07FFFFF807FFFFF +0070000E0070000E0070001C00E0003800E0007000E000E0000000E0000001C000000380000007 +800000078000000F0000000F0000001F0000001F0000003F0000003E0000003E0000007E000000 +7E0000007E0000007E000000FE000000FE000000FE000000FE000000FE000000FE000000FE0000 +00FE0000007C0000003800001C297CA822>I<003FC00001FFF00003FFFC0007C07E000F003F00 +1E001F001E000F803E000F803E000F803F000F803F000F803FC00F003FF01F001FFC1E001FFE3C +000FFFF80007FFE00003FFF80001FFFC0001FFFE0007FFFF000F0FFF801E03FFC03C01FFC07C00 +7FE078001FE0F80007E0F80007E0F80003E0F80003E0F80003E0F80003C07C0003C07C0007803F +000F001FC03E000FFFFC0003FFF800007FC0001B277DA622>I<007F800001FFF00007FFF8000F +E0FC001F807E003F803F007F003F007F001F80FF001F80FF001FC0FF001FC0FF001FC0FF001FE0 +FF001FE0FF001FE0FF001FE07F001FE07F003FE03F003FE01F807FE00F807FE007C1DFE003FF9F +E0007E1FE000001FE000001FC000001FC000001FC000003F801F003F803F803F003F803F003F80 +7E003F807C001F01F8001E03F0000FFFE00007FF800001FE00001B277DA622>I<1C003E007F00 +FF80FF80FF807F003E001C000000000000000000000000000000000000001C003E007F00FF80FF +80FF807F003E001C00091B7B9A13>I<000003800000000007C00000000007C0000000000FE000 +0000000FE0000000000FE0000000001FF0000000001FF0000000003FF8000000003FF800000000 +3FF80000000073FC0000000073FC00000000F3FE00000000E1FE00000000E1FE00000001C0FF00 +000001C0FF00000003C0FF80000003807F80000007807FC0000007003FC0000007003FC000000E +003FE000000E001FE000001E001FF000001C000FF000001FFFFFF000003FFFFFF800003FFFFFF8 +0000780007FC0000700003FC0000700003FC0000E00001FE0000E00001FE0001E00001FF0001C0 +0000FF0001C00000FF00FFFE001FFFFEFFFE001FFFFEFFFE001FFFFE2F297EA834>65 +D<FFFFFFF80000FFFFFFFF8000FFFFFFFFC00003F8001FF00003F8000FF80003F80007FC0003F8 +0003FC0003F80003FC0003F80003FE0003F80001FE0003F80001FE0003F80001FE0003F80003FE +0003F80003FC0003F80003FC0003F80007F80003F8000FF00003F8001FE00003F800FFC00003FF +FFFE000003FFFFFFE00003F80007F00003F80003FC0003F80001FE0003F80001FE0003F80000FF +0003F80000FF0003F80000FF8003F80000FF8003F80000FF8003F80000FF8003F80000FF8003F8 +0000FF8003F80000FF0003F80001FF0003F80003FE0003F80007FC0003F8001FF800FFFFFFFFF0 +00FFFFFFFFC000FFFFFFFE000029297DA831>I<00003FF001800003FFFE0380000FFFFF878000 +3FF007DF8000FF8001FF8001FE00007F8003FC00003F8007F000001F800FF000000F801FE00000 +07801FE0000007803FC0000007803FC0000003807FC0000003807F80000003807F8000000000FF +8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000 +0000FF8000000000FF80000000007F80000000007F80000000007FC0000003803FC0000003803F +C0000003801FE0000003801FE0000007000FF00000070007F000000E0003FC00001E0001FE0000 +3C0000FF8000F800003FF007E000000FFFFFC0000003FFFF000000003FF8000029297CA832>I< +FFFFFFF80000FFFFFFFF8000FFFFFFFFE00003FC001FF80003FC0007FC0003FC0001FE0003FC00 +00FF0003FC00007F8003FC00003FC003FC00001FC003FC00001FE003FC00001FE003FC00000FF0 +03FC00000FF003FC00000FF003FC00000FF003FC00000FF803FC00000FF803FC00000FF803FC00 +000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF8 +03FC00000FF003FC00000FF003FC00000FF003FC00001FE003FC00001FE003FC00001FC003FC00 +003FC003FC00007F8003FC00007F0003FC0001FE0003FC0003FC0003FC001FF800FFFFFFFFE000 +FFFFFFFF8000FFFFFFFC00002D297DA835>I<FFFFFFFFE0FFFFFFFFE0FFFFFFFFE003FC001FE0 +03FC0007F003FC0001F003FC0001F003FC0000F003FC00007003FC00007003FC00007003FC01C0 +7803FC01C03803FC01C03803FC01C03803FC03C00003FC03C00003FC0FC00003FFFFC00003FFFF +C00003FFFFC00003FC0FC00003FC03C00003FC03C00003FC01C00E03FC01C00E03FC01C00E03FC +01C01C03FC00001C03FC00001C03FC00001C03FC00003C03FC00003803FC00007803FC0000F803 +FC0001F803FC0003F803FC001FF8FFFFFFFFF0FFFFFFFFF0FFFFFFFFF027297DA82D>I<FFFFFF +FFC0FFFFFFFFC0FFFFFFFFC003FC003FC003FC000FE003FC0003E003FC0001E003FC0001E003FC +0000E003FC0000E003FC0000E003FC0000F003FC03807003FC03807003FC03807003FC03800003 +FC07800003FC07800003FC1F800003FFFF800003FFFF800003FFFF800003FC1F800003FC078000 +03FC07800003FC03800003FC03800003FC03800003FC03800003FC00000003FC00000003FC0000 +0003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000FFFFFC0000FFFFFC +0000FFFFFC000024297DA82B>I<00007FE003000003FFFC0700001FFFFF0F00003FF00FFF0000 +FF8001FF0001FE0000FF0003F800003F0007F000003F000FF000001F001FE000000F001FE00000 +0F003FC000000F003FC0000007007FC0000007007F80000007007F8000000000FF8000000000FF +8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000 +0000FF8001FFFFF87F8001FFFFF87F8001FFFFF87FC00000FF003FC00000FF003FC00000FF001F +E00000FF001FE00000FF000FF00000FF0007F00000FF0003F80000FF0001FE0000FF0000FF8001 +FF00003FF007BF00001FFFFF1F000003FFFE0F0000007FF003002D297CA836>I<FFFFF01FFFFE +FFFFF01FFFFEFFFFF01FFFFE03FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00 +007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F80 +03FC00007F8003FC00007F8003FC00007F8003FC00007F8003FFFFFFFF8003FFFFFFFF8003FFFF +FFFF8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F80 +03FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F8003FC00 +007F8003FC00007F8003FC00007F8003FC00007F8003FC00007F80FFFFF01FFFFEFFFFF01FFFFE +FFFFF01FFFFE2F297DA836>I<FFFFFCFFFFFCFFFFFC01FE0001FE0001FE0001FE0001FE0001FE +0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE +0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE0001FE +0001FE0001FE0001FE00FFFFFCFFFFFCFFFFFC16297EA81A>I<FFFFF001FFFCFFFFF001FFFCFF +FFF001FFFC03FC00001E0003FC00003C0003FC0000780003FC0000F00003FC0001E00003FC0003 +C00003FC0007000003FC001E000003FC003C000003FC0078000003FC00F0000003FC01E0000003 +FC0380000003FC07C0000003FC1FC0000003FC3FE0000003FC7FF0000003FCFFF8000003FDE7F8 +000003FF83FC000003FF01FE000003FE01FF000003FC00FF000003FC007F800003FC003FC00003 +FC003FC00003FC001FE00003FC000FF00003FC000FF80003FC0007F80003FC0003FC0003FC0001 +FE0003FC0001FF0003FC0000FF0003FC00007F80FFFFF00FFFFEFFFFF00FFFFEFFFFF00FFFFE2F +297DA836>75 D<FFFFFC0000FFFFFC0000FFFFFC000003FC00000003FC00000003FC00000003FC +00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003 +FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC000000 +03FC00000003FC00000003FC0001C003FC0001C003FC0001C003FC0001C003FC0003C003FC0003 +8003FC00038003FC00078003FC00078003FC000F8003FC000F8003FC001F8003FC007F8003FC01 +FF00FFFFFFFF00FFFFFFFF00FFFFFFFF0022297DA829>I<FFFE0000001FFFC0FFFE0000001FFF +C0FFFF0000003FFFC003FF0000003FF00003FF0000003FF00003BF80000077F00003BF80000077 +F000039FC00000E7F000039FC00000E7F000038FE00001C7F000038FE00001C7F0000387F00003 +87F0000387F0000387F0000387F0000387F0000383F8000707F0000383F8000707F0000381FC00 +0E07F0000381FC000E07F0000380FE001C07F0000380FE001C07F0000380FF003807F00003807F +003807F00003807F003807F00003803F807007F00003803F807007F00003801FC0E007F0000380 +1FC0E007F00003800FE1C007F00003800FE1C007F00003800FE1C007F000038007F38007F00003 +8007F38007F000038003FF0007F000038003FF0007F000038001FE0007F000038001FE0007F000 +038000FC0007F000038000FC0007F000FFFE00FC01FFFFC0FFFE007801FFFFC0FFFE007801FFFF +C03A297DA841>I<FFFC0000FFFEFFFE0000FFFEFFFF0000FFFE03FF8000038003FF8000038003 +BFC0000380039FE0000380039FF0000380038FF80003800387F80003800383FC0003800381FE00 +03800381FF0003800380FF80038003807FC0038003803FC0038003801FE0038003800FF0038003 +800FF80380038007FC0380038003FC0380038001FE0380038000FF0380038000FF83800380007F +C3800380003FE3800380001FE3800380000FF38003800007FB8003800007FF8003800003FF8003 +800001FF8003800000FF80038000007F80038000007F80038000003F80038000001F8003800000 +0F80FFFE00000780FFFE00000380FFFE000003802F297DA836>I<0000FFE000000007FFFC0000 +003FC07F8000007F001FC00001FC0007F00003F80003F80007F00001FC000FF00001FE001FE000 +00FF001FE00000FF003FC000007F803FC000007F807FC000007FC07F8000003FC07F8000003FC0 +7F8000003FC0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000 +003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003FC07FC000007FC0 +7FC000007FC03FC000007F803FC000007F801FE00000FF001FE00000FF000FF00001FE0007F000 +01FC0003F80003F80001FC0007F00000FF001FE000003FC07F8000000FFFFE00000000FFE00000 +2B297CA834>I<FFFFFFF800FFFFFFFF00FFFFFFFFC003FC003FE003FC000FF003FC0007F803FC +0007FC03FC0003FC03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE03FC0003FE03 +FC0003FE03FC0003FC03FC0007FC03FC0007F803FC000FF003FC003FE003FFFFFF8003FFFFFE00 +03FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC0000 +0003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00000003FC00 +0000FFFFF00000FFFFF00000FFFFF0000027297DA82F>I<0000FFE000000007FFFC0000003FC0 +7F8000007F001FC00001FC0007F00003F80003F80007F00001FC000FF00001FE001FE00000FF00 +1FE00000FF003FC000007F803FC000007F807FC000007FC07FC000007FC07F8000003FC07F8000 +003FC0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0 +FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003FC07F8000003FC07FC000 +007FC03FC000007F803FC000007F801FE00000FF001FE01F00FF000FF03F81FE0007F060C1FC00 +03F8C063F80001FCC077F00000FFC07FE000003FE07F8000000FFFFE00000000FFFE0060000000 +3E00600000003F00600000001F81E00000001FFFE00000001FFFC00000000FFFC00000000FFFC0 +00000007FF8000000007FF8000000003FF0000000001FE000000000078002B357CA834>I<FFFF +FFE00000FFFFFFFE0000FFFFFFFF800003FC007FE00003FC000FF00003FC0007F80003FC0007FC +0003FC0003FC0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FE0003FC0003FE0003FC +0003FE0003FC0003FC0003FC0007F80003FC0007F80003FC001FE00003FC007FC00003FFFFFE00 +0003FFFFF0000003FC00FC000003FC007F000003FC003F800003FC003F800003FC001FC00003FC +001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FE00003FC001FF00003FC001FF0 +0003FC001FF00003FC001FF00703FC001FF80703FC000FF80703FC0007F80EFFFFF003FE1CFFFF +F001FFF8FFFFF0003FF030297DA834>I<007F806003FFF0E007FFF9E00F807FE01F001FE03E00 +07E07C0003E07C0001E0FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF000000FFC000007F +FE00007FFFE0003FFFFC001FFFFE000FFFFF8007FFFFC003FFFFE000FFFFE00007FFF000007FF0 +00000FF8000007F8000003F8600001F8E00001F8E00001F8E00001F8F00001F0F00001F0F80003 +F0FC0003E0FF0007C0FFE01F80F3FFFF00E0FFFE00C01FF0001D297CA826>I<7FFFFFFFFFC07F +FFFFFFFFC07FFFFFFFFFC07F803FC03FC07E003FC007C078003FC003C078003FC003C070003FC0 +01C0F0003FC001E0F0003FC001E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E0E0 +003FC000E000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 +000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000 +003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 +000000003FC0000000003FC0000000003FC00000007FFFFFE000007FFFFFE000007FFFFFE0002B +287EA730>I<FFFFF001FFFCFFFFF001FFFCFFFFF001FFFC03FC0000070003FC0000070003FC00 +00070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC00000700 +03FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC00 +00070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC00000700 +03FC0000070003FC0000070003FC0000070003FC0000070003FC0000070003FC0000070001FC00 +000E0001FE00000E0000FE00001C00007E00001C00007F00003800003FC000F000000FF007E000 +0007FFFFC0000001FFFF000000001FF800002E297DA835>I<FFFFF0003FFF80FFFFF0003FFF80 +FFFFF0003FFF8003FE000001E00001FE000001C00001FF000003C00000FF000003800000FF0000 +038000007F8000070000007F8000070000007FC0000F0000003FC0000E0000003FE0001E000000 +1FE0001C0000001FF0001C0000000FF000380000000FF0003800000007F8007000000007F80070 +00000007FC00F000000003FC00E000000003FE01E000000001FE01C000000001FF01C000000000 +FF038000000000FF038000000000FF8780000000007F8700000000007FCF00000000003FCE0000 +0000003FFE00000000001FFC00000000001FFC00000000000FF800000000000FF800000000000F +F8000000000007F0000000000007F0000000000003E0000000000003E0000000000001C0000000 +31297FA834>I<FFFFE07FFFF007FFF0FFFFE07FFFF007FFF0FFFFE07FFFF007FFF003FC0001FE +00001C0003FC0001FE00001C0001FE0001FF0000380001FE0000FF0000380001FF0000FF000078 +0000FF0000FF8000700000FF0000FF8000700000FF8000FF8000F000007F8001FFC000E000007F +8001FFC000E000003FC003FFE001C000003FC0039FE001C000003FE0039FE003C000001FE0070F +F0038000001FE0070FF0038000001FF00F0FF0078000000FF00E07F8070000000FF00E07F80700 +000007F81E07FC0E00000007F81C03FC0E00000007FC1C03FC1E00000003FC3801FE1C00000003 +FC3801FE1C00000001FE7801FF3800000001FE7000FF3800000001FE7000FF3800000000FFF000 +FFF000000000FFE0007FF000000000FFE0007FF0000000007FC0003FE0000000007FC0003FE000 +0000003FC0003FC0000000003F80001FC0000000003F80001FC0000000001F80001F8000000000 +1F00000F80000000001F00000F80000000000E00000700000044297FA847>I<01FF800007FFF0 +000F81F8001FC07E001FC07E001FC03F000F803F8007003F8000003F8000003F8000003F80000F +FF8000FFFF8007FC3F800FE03F803F803F803F003F807F003F80FE003F80FE003F80FE003F80FE +003F807E007F807F00DF803F839FFC0FFF0FFC01FC03FC1E1B7E9A21>97 +D<001FF80000FFFE0003F01F0007E03F800FC03F801F803F803F801F007F800E007F0000007F00 +0000FF000000FF000000FF000000FF000000FF000000FF000000FF0000007F0000007F0000007F +8000003F8001C01F8001C00FC0038007E0070003F01E0000FFFC00001FE0001A1B7E9A1F>99 +D<00003FF80000003FF80000003FF800000003F800000003F800000003F800000003F800000003 +F800000003F800000003F800000003F800000003F800000003F800000003F800000003F800001F +E3F80000FFFBF80003F03FF80007E00FF8000FC007F8001F8003F8003F8003F8007F0003F8007F +0003F8007F0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800FF0003F800 +FF0003F8007F0003F8007F0003F8007F0003F8003F8003F8001F8003F8000F8007F80007C00FF8 +0003F03BFF8000FFF3FF80003FC3FF80212A7EA926>I<003FE00001FFF80003F07E0007C01F00 +0F801F801F800F803F800FC07F000FC07F0007C07F0007E0FF0007E0FF0007E0FFFFFFE0FFFFFF +E0FF000000FF000000FF0000007F0000007F0000007F0000003F8000E01F8000E00FC001C007E0 +038003F81F0000FFFE00001FF0001B1B7E9A20>I<0007F0003FFC00FE3E01F87F03F87F03F07F +07F07F07F03E07F00007F00007F00007F00007F00007F00007F000FFFFC0FFFFC0FFFFC007F000 +07F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F000 +07F00007F00007F00007F00007F00007F00007F0007FFF807FFF807FFF80182A7EA915>I<00FF +81F003FFE7F80FC1FE7C1F80FC7C1F007C383F007E107F007F007F007F007F007F007F007F007F +007F007F007F003F007E001F007C001F80FC000FC1F8001FFFE00018FF80003800000038000000 +3C0000003E0000003FFFF8001FFFFF001FFFFF800FFFFFC007FFFFE01FFFFFF03E0007F07C0001 +F8F80000F8F80000F8F80000F8F80000F87C0001F03C0001E01F0007C00FC01F8003FFFE00007F +F0001E287E9A22>I<FFE0000000FFE0000000FFE00000000FE00000000FE00000000FE0000000 +0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000 +000FE00000000FE07F00000FE1FFC0000FE787E0000FEE03F0000FF803F0000FF803F8000FF003 +F8000FF003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE0 +03F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000F +E003F8000FE003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80212A7DA926>I<07000F801FC03FE0 +3FE03FE01FC00F8007000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00F +E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE +0F2B7DAA14>I<000700000F80001FC0003FE0003FE0003FE0001FC0000F800007000000000000 +0000000000000000000000000000000001FFE001FFE001FFE0000FE0000FE0000FE0000FE0000F +E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000F +E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE07C0FE0FE0FE0FE0F +C0FE1F80FE1F007C3E003FFC000FF000133784AA15>I<FFE00000FFE00000FFE000000FE00000 +0FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000000FE000 +000FE000000FE01FFC0FE01FFC0FE01FFC0FE007800FE00F000FE01E000FE03C000FE078000FE0 +E0000FE3C0000FE7C0000FEFE0000FFFE0000FFFF0000FF3F8000FE3F8000FC1FC000FC0FE000F +C07F000FC07F000FC03F800FC01FC00FC00FC00FC00FE0FFFC3FFEFFFC3FFEFFFC3FFE1F2A7EA9 +24>I<FFE0FFE0FFE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0 +0FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00F +E00FE0FFFEFFFEFFFE0F2A7DA914>I<FFC07F800FF000FFC1FFE03FFC00FFC383F0707E000FC6 +03F8C07F000FCC01F9803F000FD801FF003F800FF001FE003F800FF001FE003F800FE001FC003F +800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001 +FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F80 +0FE001FC003F800FE001FC003F800FE001FC003F800FE001FC003F80FFFE1FFFC3FFF8FFFE1FFF +C3FFF8FFFE1FFFC3FFF8351B7D9A3A>I<FFC07F0000FFC1FFC000FFC787E0000FCE03F0000FD8 +03F0000FD803F8000FF003F8000FF003F8000FE003F8000FE003F8000FE003F8000FE003F8000F +E003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F800 +0FE003F8000FE003F8000FE003F8000FE003F800FFFE3FFF80FFFE3FFF80FFFE3FFF80211B7D9A +26>I<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E07F0007F07F0007F0 +7F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F87F0007 +F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A22> +I<FFE1FE0000FFE7FF8000FFFE07E0000FF803F0000FF001F8000FE000FC000FE000FE000FE000 +FF000FE0007F000FE0007F000FE0007F800FE0007F800FE0007F800FE0007F800FE0007F800FE0 +007F800FE0007F800FE0007F000FE000FF000FE000FF000FE000FE000FE001FC000FF001F8000F +F803F0000FFE0FE0000FE7FF80000FE1FC00000FE00000000FE00000000FE00000000FE0000000 +0FE00000000FE00000000FE00000000FE00000000FE0000000FFFE000000FFFE000000FFFE0000 +0021277E9A26>I<FFC1F0FFC7FCFFCE3E0FD87F0FD87F0FF07F0FF03E0FF01C0FE0000FE0000F +E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000F +E000FFFF00FFFF00FFFF00181B7E9A1C>114 D<03FE300FFFF01E03F03800F0700070F00070F0 +0070F80070FC0000FFE0007FFE007FFF803FFFE01FFFF007FFF800FFF80003FC0000FC60007CE0 +003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B>I<007000007000007000 +00700000F00000F00000F00001F00003F00003F00007F0001FFFF0FFFFF0FFFFF007F00007F000 +07F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F03807F038 +07F03807F03807F03807F03803F03803F87001F86000FFC0001F8015267FA51B>I<FFE03FF800 +FFE03FF800FFE03FF8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8 +000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003F8000FE003 +F8000FE003F8000FE003F8000FE003F8000FE003F8000FE007F80007E007F80007E00FF80003F0 +3BFF8001FFF3FF80003FC3FF80211B7D9A26>I<FFFE03FF80FFFE03FF80FFFE03FF8007F00070 +0007F000700007F800F00003F800E00003FC01E00001FC01C00001FC01C00000FE03800000FE03 +8000007F070000007F070000007F8F0000003F8E0000003FDE0000001FDC0000001FDC0000000F +F80000000FF80000000FF800000007F000000007F000000003E000000003E000000001C0000021 +1B7F9A24>I<FFFE7FFC0FFEFFFE7FFC0FFEFFFE7FFC0FFE0FE007E000E007F003F001C007F003 +F001C007F807F803C003F807F8038003F807F8038001FC0EFC070001FC0EFC070001FE1EFC0F00 +00FE1C7E0E0000FE1C7E0E0000FF383F1E00007F383F1C00007F783F3C00003FF01FB800003FF0 +1FB800003FF01FF800001FE00FF000001FE00FF000000FC007E000000FC007E000000FC007E000 +00078003C00000078003C0002F1B7F9A32>I<FFFC0FFF00FFFC0FFF00FFFC0FFF0007F003C000 +03F807800001FC07800000FE0F000000FF1E0000007F3C0000003FF80000001FF00000000FF000 +00000FF000000007F000000007F80000000FFC0000001FFE0000001EFE0000003C7F000000783F +800000F01FC00001E01FE00001C00FE00003C007F000FFF01FFF80FFF01FFF80FFF01FFF80211B +7F9A24>I<FFFE03FF80FFFE03FF80FFFE03FF8007F000700007F000700007F800F00003F800E0 +0003FC01E00001FC01C00001FC01C00000FE03800000FE038000007F070000007F070000007F8F +0000003F8E0000003FDE0000001FDC0000001FDC0000000FF80000000FF80000000FF800000007 +F000000007F000000003E000000003E000000001C000000001C000000003800000000380000038 +078000007C07000000FE0F000000FE0E000000FE1E000000FE3C0000007C780000003FE0000000 +0FC000000021277F9A24>I<3FFFFF803FFFFF803F007F003C00FE003801FE007803FC007803F8 +007007F800700FF000700FE000001FC000003FC000007F8000007F000000FF000001FE038001FC +038003F8038007F803800FF007800FE007801FE007003FC00F003F801F007F007F00FFFFFF00FF +FFFF00191B7E9A1F>I E /Fs 4 94 df<003F000000E180000380C020070060400E0070401C00 +70403C0070803C003880780039007800390078003A00F0003A00F0003C00F0003800F000380070 +003800700078003000B800380338401C1C188007E00F001B157E941F>11 +D<00007C00000183000002018000040180000801C0001001C0002001C0002001C0004001C00040 +038000800380008003000080070001000E000107FC0001083800010FDC0002000E0002000E0002 +000F0002000F0004000F0004000F0004000F0004000F0008001E0008001E0008001C0008003C00 +14003800140070001400E0001201C00021838000207C0000200000002000000040000000400000 +004000000040000000800000008000000080000000800000001A2D7EA21C>I<70F8F8F8700505 +7C840E>58 D<00400040004020402040204020402040204020402040207021F027F03FF0FFC0FE +40F840E0402040204020402040204020402040204020402040204020402040207021F027F03FF0 +FFC0FE40F840E04020402040204020402000200020000C2F7DA313>93 D +E /Ft 71 124 df<001F83E000706E3000C07C780180F8780380F0780700700007007000070070 +00070070000700700007007000070070000700700007007000FFFFFFC007007000070070000700 +700007007000070070000700700007007000070070000700700007007000070070000700700007 +0070000700700007007000070070000700700007007000070078007FE3FF801D2380A21C>11 +D<001FC0000070200000C010000180380003807800070078000700300007000000070000000700 +000007000000070000000700000007000000FFFFF8000700780007003800070038000700380007 +003800070038000700380007003800070038000700380007003800070038000700380007003800 +07003800070038000700380007003800070038007FE1FF80192380A21B>I<001FD80000703800 +00C078000180780003807800070038000700380007003800070038000700380007003800070038 +000700380007003800FFFFF8000700380007003800070038000700380007003800070038000700 +380007003800070038000700380007003800070038000700380007003800070038000700380007 +00380007003800070038007FF3FF80192380A21B>I<000FC07F00007031C08000E00B00400180 +1E00E003803E01E007003C01E007001C00C007001C000007001C000007001C000007001C000007 +001C000007001C000007001C0000FFFFFFFFE007001C01E007001C00E007001C00E007001C00E0 +07001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00 +E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E007001C00E07FF1FF +CFFE272380A229>I<00200040008001000300060004000C000C00180018003000300030007000 +600060006000E000E000E000E000E000E000E000E000E000E000E000E000E000E0006000600060 +007000300030003000180018000C000C0004000600030001000080004000200B327CA413>40 +D<800040002000100018000C000400060006000300030001800180018001C000C000C000C000E0 +00E000E000E000E000E000E000E000E000E000E000E000E000E000C000C000C001C00180018001 +80030003000600060004000C00180010002000400080000B327DA413>I<70F8FCFC7404040404 +080810102040060F7C840E>44 D<FFE0FFE00B027F8B10>I<70F8F8F87005057C840E>I<01F000 +071C000C06001803003803803803807001C07001C07001C07001C0F001E0F001E0F001E0F001E0 +F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E07001C07001C07001C0 +7803C03803803803801C07000C0600071C0001F00013227EA018>48 D<008003800F80F3800380 +038003800380038003800380038003800380038003800380038003800380038003800380038003 +8003800380038003800380038007C0FFFE0F217CA018>I<03F0000C1C001007002007804003C0 +4003C08003E0F003E0F801E0F801E0F801E02003E00003E00003C00003C0000780000700000E00 +001C0000180000300000600000C0000180000100000200200400200800201800603000403FFFC0 +7FFFC0FFFFC013217EA018>I<03F8000C1E001007002007804007C07807C07803C07807C03807 +C0000780000780000700000F00000E0000380003F000001C00000F000007800007800003C00003 +C00003E02003E07003E0F803E0F803E0F003C04003C0400780200780100F000C1C0003F0001322 +7EA018>I<000200000600000E00000E00001E00001E00002E00004E00004E00008E00008E0001 +0E00020E00020E00040E00040E00080E00100E00100E00200E00200E00400E00800E00FFFFF800 +0E00000E00000E00000E00000E00000E00000E00001F0001FFF015217FA018>I<1000801E0700 +1FFF001FFE001FF80013E00010000010000010000010000010000010000010F800130E00140700 +1803801003800001C00001C00001E00001E00001E00001E07001E0F001E0F001E0E001C08001C0 +4003C04003802007001006000C1C0003F00013227EA018>I<007E0001C1000300800601C00E03 +C01C03C0180180380000380000780000700000700000F0F800F30C00F40600F40300F80380F801 +C0F001C0F001E0F001E0F001E0F001E0F001E07001E07001E07001E03801C03801C01803801C03 +000C0600070C0001F00013227EA018>I<4000006000007FFFE07FFFC07FFFC0400080C0010080 +010080020080020000040000080000080000100000300000200000600000600000600000E00000 +C00000C00001C00001C00001C00001C00003C00003C00003C00003C00003C00003C00003C00003 +C00001800013237DA118>I<01F800060E000803001001802001802000C06000C06000C06000C0 +7000C07801803E01003F02001FC4000FF80003F80003FC00067F00083F80100F803007C06001C0 +6000E0C000E0C00060C00060C00060C000606000406000C03000801803000E0E0003F00013227E +A018>I<01F000060C000C0600180700380380700380700380F001C0F001C0F001C0F001E0F001 +E0F001E0F001E0F001E07001E07003E03803E01805E00C05E00619E003E1E00001C00001C00001 +C0000380000380300300780700780600700C002018001030000FC00013227EA018>I<70F8F8F8 +70000000000000000000000070F8F8F87005157C940E>I<FFFFFFFEFFFFFFFE00000000000000 +00000000000000000000000000000000000000000000000000FFFFFFFEFFFFFFFE1F0C7D9126> +61 D<0001800000018000000180000003C0000003C0000003C0000005E0000005E000000DF000 +0008F0000008F0000010F800001078000010780000203C0000203C0000203C0000401E0000401E +0000401E0000800F0000800F0000FFFF000100078001000780030007C0020003C0020003C00400 +03E0040001E0040001E00C0000F00C0000F03E0001F8FF800FFF20237EA225>65 +D<FFFFF8000F800E0007800780078003C0078003E0078001E0078001F0078001F0078001F00780 +01F0078001F0078001E0078003E0078007C007800F8007803E0007FFFE0007800780078003C007 +8001E0078001F0078000F0078000F8078000F8078000F8078000F8078000F8078000F8078001F0 +078001F0078003E0078007C00F800F00FFFFFC001D227EA123>I<0007E0100038183000E00630 +01C00170038000F0070000F00E0000701E0000701C0000303C0000303C0000307C000010780000 +1078000010F8000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800 +0000780000107C0000103C0000103C0000101C0000201E0000200E000040070000400380008001 +C0010000E0020000381C000007E0001C247DA223>I<FFFFF0000F801E0007800700078003C007 +8001C0078000E0078000F007800078078000780780007C0780003C0780003C0780003C0780003E +0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003C078000 +3C0780007C0780007807800078078000F0078000E0078001E0078003C0078007000F801E00FFFF +F8001F227EA125>I<FFFFFFC00F8007C0078001C0078000C00780004007800040078000600780 +0020078000200780002007802020078020000780200007802000078060000780E00007FFE00007 +80E000078060000780200007802000078020000780200807800008078000080780001007800010 +07800010078000300780003007800070078000E00F8003E0FFFFFFE01D227EA121>I<FFFFFFC0 +0F8007C0078001C0078000C0078000400780004007800060078000200780002007800020078020 +20078020000780200007802000078060000780E00007FFE0000780E00007806000078020000780 +200007802000078020000780000007800000078000000780000007800000078000000780000007 +800000078000000FC00000FFFE00001B227EA120>I<0007F008003C0C1800E0021801C001B803 +8000F8070000780F0000381E0000381E0000183C0000183C0000187C0000087800000878000008 +F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8001FFF780000F8780000 +787C0000783C0000783C0000781E0000781E0000780F00007807000078038000B801C000B800E0 +0318003C0C080007F00020247DA226>I<FFFC3FFF0FC003F0078001E0078001E0078001E00780 +01E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E007 +8001E007FFFFE0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0 +078001E0078001E0078001E0078001E0078001E0078001E0078001E00FC003F0FFFC3FFF20227E +A125>I<FFFC0FC007800780078007800780078007800780078007800780078007800780078007 +80078007800780078007800780078007800780078007800780078007800FC0FFFC0E227EA112> +I<FFFC03FF000FC000F80007800060000780004000078000800007800100000780020000078004 +00000780080000078010000007802000000780400000078080000007818000000783C000000787 +E000000789E000000788F000000790F0000007A078000007C03C000007803C000007801E000007 +800F000007800F00000780078000078007C000078003C000078001E000078001E000078000F000 +078000F8000FC000FC00FFFC07FF8021227EA126>75 D<FFFE00000FC000000780000007800000 +078000000780000007800000078000000780000007800000078000000780000007800000078000 +000780000007800000078000000780000007800000078000000780000007800000078000800780 +00800780008007800080078001800780018007800100078003000780030007800F000F803F00FF +FFFF0019227EA11E>I<FFC00003FF0FC00003F007C00003E005E00005E005E00005E004F00009 +E004F00009E004F00009E004780011E004780011E004780011E0043C0021E0043C0021E0043C00 +21E0041E0041E0041E0041E0040F0081E0040F0081E0040F0081E004078101E004078101E00407 +8101E00403C201E00403C201E00401E401E00401E401E00401E401E00400F801E00400F801E004 +00F801E004007001E00E007001E01F007003F0FFE0203FFF28227EA12D>I<FF8007FF07C000F8 +07C0007005E0002004F0002004F0002004780020047C0020043C0020041E0020041F0020040F00 +2004078020040780200403C0200401E0200401E0200400F0200400F8200400782004003C200400 +3E2004001E2004000F2004000F20040007A0040003E0040003E0040001E0040001E0040000E00E +0000601F000060FFE0002020227EA125>I<000FE00000783C0000E00E0003C00780078003C00F +0001E00E0000E01E0000F03C0000783C0000787C00007C7C00007C7800003C7800003CF800003E +F800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003E7800003C7C0000 +7C7C00007C3C0000783E0000F81E0000F00F0001E00F0001E0078003C003C0078000E00E000078 +3C00000FE0001F247DA226>I<FFFFF0000F803C0007800F0007800780078007C0078003C00780 +03E0078003E0078003E0078003E0078003E0078003E0078003C0078007C00780078007800F0007 +803C0007FFF0000780000007800000078000000780000007800000078000000780000007800000 +0780000007800000078000000780000007800000078000000FC00000FFFC00001B227EA121>I< +000FE00000783C0000E00E0003C00780078003C00F0001E00E0000E01E0000F03E0000F83C0000 +787C00007C7C00007C7800003C7800003CF800003EF800003EF800003EF800003EF800003EF800 +003EF800003EF800003EF800003E7800003C7C00007C7C00007C3C0000783C0000781E0380F00E +0420E00F0801E0078813C003C8178000E80E00007C3C02000FEC0200000C0200000C0200000E06 +00000F0E000007FC000007FC000007F8000003F8000001E01F2D7DA226>I<FFFFE000000F803C +000007800E00000780078000078007C000078003C000078003E000078003E000078003E0000780 +03E000078003E000078003C000078007C000078007800007800E000007803C000007FFE0000007 +80700000078038000007801C000007801E000007800E000007800F000007800F000007800F0000 +07800F000007800F800007800F800007800F800007800F808007800FC080078007C0800FC003C1 +00FFFC01E2000000007C0021237EA124>I<03F0200C0C601802603001E07000E0600060E00060 +E00060E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003FC0 +0007E00001E00000F00000F0000070800070800070800070800070C00060C00060E000C0F000C0 +C80180C6070081FC0014247DA21B>I<7FFFFFF878078078600780184007800840078008400780 +08C007800C80078004800780048007800480078004000780000007800000078000000780000007 +800000078000000780000007800000078000000780000007800000078000000780000007800000 +078000000780000007800000078000000780000007800000078000000FC00003FFFF001E227EA1 +23>I<FFFC07FF0FC000F807800070078000200780002007800020078000200780002007800020 +078000200780002007800020078000200780002007800020078000200780002007800020078000 +20078000200780002007800020078000200780002007800020078000200380004003C0004003C0 +004001C0008000E000800060010000300600001C08000003F00020237EA125>I<FFF0007FC01F +80001F000F00000C000780000C000780000800078000080003C000100003C000100003E0003000 +01E000200001E000200000F000400000F000400000F000400000780080000078008000007C0180 +00003C010000003C010000001E020000001E020000001F020000000F040000000F040000000F8C +0000000788000000078800000003D000000003D000000003F000000001E000000001E000000000 +C000000000C000000000C0000022237FA125>I<FFF03FFC03FE1F8007E000F80F0003C000700F +0003C000200F0003C00020078001E00040078001E00040078001E0004003C002F0008003C002F0 +008003C002F0008001E00478010001E00478010001E00478010000F0083C020000F0083C020000 +F0083C020000F8183E06000078101E04000078101E0400007C101E0400003C200F0800003C200F +0800003C200F0800001E40079000001E40079000001E40079000000F8003E000000F8003E00000 +0F8003E00000070001C00000070001C00000070001C0000003000180000002000080002F237FA1 +32>I<7FF807FF0007E001F80003C000E00003E000C00001E000800000F001000000F803000000 +78020000007C040000003E0C0000001E080000001F100000000FB000000007A000000007C00000 +0003E000000001E000000001F000000003F80000000278000000047C0000000C3E000000081E00 +0000101F000000300F80000020078000004007C00000C003E000008001E000010001F000030000 +F000070000F8001F8001FC00FFE007FFC022227FA125>I<0FE0001838003C0C003C0E00180700 +00070000070000070000FF0007C7001E07003C0700780700700700F00708F00708F00708F00F08 +7817083C23900FC1E015157E9418>97 D<0E0000FE00001E00000E00000E00000E00000E00000E +00000E00000E00000E00000E00000E00000E00000E1F000E61C00E80600F00300E00380E003C0E +001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E001C0E003C0E00380F00700C80600C +41C0083F0017237FA21B>I<01FE000703000C07801C0780380300780000700000F00000F00000 +F00000F00000F00000F00000F000007000007800403800401C00800C010007060001F80012157E +9416>I<0000E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000 +E00000E00000E001F8E00704E00C02E01C01E03800E07800E07000E0F000E0F000E0F000E0F000 +E0F000E0F000E0F000E07000E07800E03800E01801E00C02E0070CF001F0FE17237EA21B>I<01 +FC000707000C03801C01C03801C07801E07000E0F000E0FFFFE0F00000F00000F00000F00000F0 +00007000007800203800201C00400E008007030000FC0013157F9416>I<003C00C6018F038F03 +0F070007000700070007000700070007000700FFF8070007000700070007000700070007000700 +07000700070007000700070007000700070007807FF8102380A20F>I<00007001F198071E180E +0E181C07001C07003C07803C07803C07803C07801C07001C07000E0E000F1C0019F00010000010 +00001800001800001FFE000FFFC00FFFE03800F0600030400018C00018C00018C0001860003060 +00303800E00E038003FE0015217F9518>I<0E0000FE00001E00000E00000E00000E00000E0000 +0E00000E00000E00000E00000E00000E00000E00000E1F800E60C00E80E00F00700F00700E0070 +0E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070 +0E0070FFE7FF18237FA21B>I<1C001E003E001E001C0000000000000000000000000000000000 +0E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E +00FFC00A227FA10E>I<01C003E003E003E001C00000000000000000000000000000000001E00F +E001E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 +00E000E000E000E000E060E0F0C0F18061803E000B2C82A10F>I<0E0000FE00001E00000E0000 +0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E03FC0E01F00E01C0 +0E01800E02000E04000E08000E10000E38000EF8000F1C000E1E000E0E000E07000E07800E03C0 +0E01C00E01E00E00F00E00F8FFE3FE17237FA21A>I<0E00FE001E000E000E000E000E000E000E +000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 +0E000E000E000E000E000E00FFE00B237FA20E>I<0E1FC07F00FE60E183801E807201C00F003C +00E00F003C00E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E00 +3800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E +003800E0FFE3FF8FFE27157F942A>I<0E1F80FE60C01E80E00F00700F00700E00700E00700E00 +700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7 +FF18157F941B>I<01FC000707000C01801800C03800E0700070700070F00078F00078F00078F0 +0078F00078F00078F000787000707800F03800E01C01C00E038007070001FC0015157F9418>I< +0E1F00FE61C00E80600F00700E00380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E +0E001E0E003C0E003C0E00380F00700E80E00E41C00E3F000E00000E00000E00000E00000E0000 +0E00000E00000E00000E0000FFE000171F7F941B>I<01F8200704600E02601C01603801E07800 +E07800E0F000E0F000E0F000E0F000E0F000E0F000E0F000E07000E07800E03801E01C01E00C02 +E0070CE001F0E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000FFE171F +7E941A>I<0E3CFE461E8F0F0F0F060F000E000E000E000E000E000E000E000E000E000E000E00 +0E000E000F00FFF010157F9413>I<0F8830786018C018C008C008E008F0007F803FE00FF001F8 +003C801C800C800CC00CC008E018D0308FC00E157E9413>I<0200020002000200060006000600 +0E001E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E040E040E040E +040E040708030801F00E1F7F9E13>I<0E0070FE07F01E00F00E00700E00700E00700E00700E00 +700E00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F006017003827800FC +7F18157F941B>I<FFC1FE1E00780E00300E00200E002007004007004003808003808003808001 +C10001C10000E20000E20000E20000740000740000380000380000380000100017157F941A>I< +FF8FF8FF1E01E03C1C01C0180E01C0180E01E0100E01E010070260200702702007027020038430 +40038438400384384001C8188001C81C8001C81C8000F00D0000F00F0000F00F00006006000060 +06000060060020157F9423>I<FF83FE1F01F00E00C007008003810003830001C20000E4000078 +00007800003800003C00004E00008E000187000103800201C00401E00C00E03E01F0FF03FE1715 +7F941A>I<FFC1FE1E00780E00300E00200E002007004007004003808003808003808001C10001 +C10000E20000E20000E20000740000740000380000380000380000100000100000200000200000 +2000004000F04000F08000F180004300003C0000171F7F941A>I<3FFFC0380380300780200700 +600E00401C00403C0040380000700000E00001E00001C0000380400700400F00400E00C01C0080 +380080780180700780FFFF8012157F9416>I<FFFFFE1701808C18>I E /Fu +64 124 df<000FF83F00007FFDFFC001F81FE3E003E03F87E007C03F87E00F803F07E00F803F03 +C00F801F00000F801F00000F801F00000F801F00000F801F00000F801F0000FFFFFFFC00FFFFFF +FC000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F80 +1F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F +801F00000F801F00000F801F00007FF0FFF0007FF0FFF00023237FA221>11 +D<000FF000007FFC0001F80E0003E01F0007C03F000F803F000F803F000F801E000F800C000F80 +00000F8000000F8000000F800000FFFFFF00FFFFFF000F801F000F801F000F801F000F801F000F +801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F00 +0F801F000F801F000F801F000F801F007FF0FFE07FF0FFE01B237FA21F>I<FFFCFFFCFFFCFFFC +0E047F8C13>45 D<387CFEFEFE7C3807077C8610>I<00FE0007FFC00F83E01F01F03E00F83E00 +F87C007C7C007C7C007CFC007CFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC00 +7EFC007EFC007EFC007EFC007E7C007C7C007C7C007C3E00F83E00F81F01F00F83E007FFC000FE +0017207E9F1C>48 D<00180000780001F800FFF800FFF80001F80001F80001F80001F80001F800 +01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F800 +01F80001F80001F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>I<03FC000FFF +003C1FC07007E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003F00003F00007 +E00007C0000F80001F00003E0000380000700000E01801C0180380180700180E00380FFFF01FFF +F03FFFF07FFFF0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F03F03F81F83F +81F83F81F81F03F81F03F00003F00003E00007C0001F8001FE0001FF000007C00001F00001F800 +00FC0000FC3C00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00FFFC001FE0017 +207E9F1C>I<0000E00001E00003E00003E00007E0000FE0001FE0001FE00037E00077E000E7E0 +01C7E00187E00307E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFEFFFFFE0007E0 +0007E00007E00007E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000201E01E01FFF +C01FFF801FFF001FFE001FF8001BC00018000018000018000018000019FC001FFF001E0FC01807 +E01803E00003F00003F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03F07007E03007 +C01C1F800FFF0003F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F01F83E01F83E +01F87E00F07C00007C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC007EFC007EFC +007EFC007E7C007E7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000FF0017207E9F +1C>I<6000007800007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0C00180C00300 +C00300000600000C00001C0000180000380000780000780000F00000F00000F00001F00001F000 +01F00003F00003F00003F00003F00003F00003F00003F00001E00017227DA11C>I<00FE0003FF +C00703E00E00F01C00F01C00783C00783E00783F00783F80783FE0F01FF9E01FFFC00FFF8007FF +C003FFE007FFF01E7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF0001CF8001C7800 +383C00381F01F00FFFC001FF0017207E9F1C>I<01FE0007FF800F83E01E01F03E00F07C00F87C +0078FC007CFC007CFC007CFC007EFC007EFC007EFC007E7C00FE7C00FE3E01FE1E037E0FFE7E07 +FC7E00207E00007C00007C1E007C3F00F83F00F83F00F03F01E01E03C01C0F800FFE0003F80017 +207E9F1C>I<387CFEFEFE7C380000000000000000387CFEFEFE7C3807167C9510>I<0000700000 +00007000000000F800000000F800000000F800000001FC00000001FC00000003FE00000003FE00 +000003FE00000006FF000000067F0000000E7F8000000C3F8000000C3F800000183FC00000181F +C00000381FE00000300FE00000300FE00000600FF000006007F00000E007F80000FFFFF80000FF +FFF800018001FC00018001FC00038001FE00030000FE00030000FE000600007F000600007F00FF +E00FFFF8FFE00FFFF825227EA12A>65 D<FFFFFF8000FFFFFFE00007F001F80007F000FC0007F0 +007E0007F0007E0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007F0007E0007 +F000FE0007F000FC0007F003F80007FFFFF00007FFFFF00007F001FC0007F0007E0007F0003F00 +07F0003F8007F0001F8007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F +C007F0003F8007F0003F8007F0007F0007F001FE00FFFFFFF800FFFFFFC00022227EA128>I<00 +03FE0080001FFF818000FF01E38001F8003F8003E0001F8007C0000F800F800007801F80000780 +3F000003803F000003807F000001807E000001807E00000180FE00000000FE00000000FE000000 +00FE00000000FE00000000FE00000000FE00000000FE000000007E000000007E000001807F0000 +01803F000001803F000003801F800003000F8000030007C000060003F0000C0001F800380000FF +00F000001FFFC0000003FE000021227DA128>I<FFFFFF8000FFFFFFF00007F003FC0007F0007E +0007F0003F0007F0001F8007F0000FC007F00007E007F00007E007F00007F007F00003F007F000 +03F007F00003F007F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F0 +0003F807F00003F807F00003F807F00003F007F00003F007F00003F007F00007E007F00007E007 +F0000FC007F0001F8007F0003F0007F0007E0007F003FC00FFFFFFF000FFFFFF800025227EA12B +>I<FFFFFFFCFFFFFFFC07F000FC07F0003C07F0001C07F0000C07F0000E07F0000E07F0000607 +F0180607F0180607F0180607F0180007F0380007F0780007FFF80007FFF80007F0780007F03800 +07F0180007F0180007F0180307F0180307F0000307F0000607F0000607F0000607F0000E07F000 +0E07F0001E07F0003E07F001FCFFFFFFFCFFFFFFFC20227EA125>I<FFFFFFF8FFFFFFF807F001 +F807F0007807F0003807F0001807F0001C07F0001C07F0000C07F0000C07F0180C07F0180C07F0 +180007F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007 +F0180007F0180007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00000 +FFFFE000FFFFE0001E227EA123>I<0003FE0040001FFFC0C0007F00F1C001F8003FC003F0000F +C007C00007C00FC00003C01F800003C03F000001C03F000001C07F000000C07E000000C07E0000 +00C0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 +0FFFFC7E000FFFFC7F00001FC07F00001FC03F00001FC03F00001FC01F80001FC00FC0001FC007 +E0001FC003F0001FC001FC003FC0007F80E7C0001FFFC3C00003FF00C026227DA12C>I<FFFF83 +FFFEFFFF83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0 +001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007FFFFFFC007 +FFFFFFC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC0 +07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F +C0FFFF83FFFEFFFF83FFFE27227EA12C>I<FFFFE0FFFFE003F80003F80003F80003F80003F800 +03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800 +03F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F800FFFFE0 +FFFFE013227FA115>I<FFFF803FFCFFFF803FFC07F000038007F000070007F0000E0007F00018 +0007F000300007F000E00007F001C00007F003800007F007000007F00E000007F018000007F038 +000007F0FC000007F1FE000007F3FE000007F77F000007FE7F800007F83F800007F01FC00007F0 +1FE00007F00FE00007F007F00007F007F80007F003F80007F001FC0007F001FE0007F000FF0007 +F0007F0007F0007F8007F0003FC0FFFF83FFFCFFFF83FFFC26227EA12C>75 +D<FFFFE000FFFFE00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0 +000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007 +F0000007F0000007F0001807F0001807F0001807F0001807F0003807F0003807F0007007F00070 +07F000F007F001F007F007F0FFFFFFF0FFFFFFF01D227EA122>I<FFF000000FFFFFF800001FFF +07F800001FE006FC000037E006FC000037E006FC000037E0067E000067E0067E000067E0063F00 +00C7E0063F0000C7E0061F800187E0061F800187E0060FC00307E0060FC00307E0060FC00307E0 +0607E00607E00607E00607E00603F00C07E00603F00C07E00601F81807E00601F81807E00601F8 +1807E00600FC3007E00600FC3007E006007E6007E006007E6007E006003FC007E006003FC007E0 +06001F8007E006001F8007E006001F8007E006000F0007E0FFF00F00FFFFFFF00600FFFF30227E +A135>I<FFF8001FFEFFFC001FFE07FC0000C007FE0000C006FF0000C0067F8000C0063FC000C0 +061FE000C0060FE000C0060FF000C00607F800C00603FC00C00601FE00C00600FE00C00600FF00 +C006007F80C006003FC0C006001FE0C006000FF0C0060007F0C0060007F8C0060003FCC0060001 +FEC0060000FFC00600007FC00600007FC00600003FC00600001FC00600000FC006000007C00600 +0003C006000003C0FFF00001C0FFF00000C027227EA12C>I<0007FC0000003FFF800000FC07E0 +0003F001F80007E000FC000FC0007E001F80003F001F80003F003F00001F803F00001F807F0000 +1FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00 +000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F00001FC07F00001FC03F00001F803F +80003F801F80003F000FC0007E0007E000FC0003F001F80000FC07E000003FFF80000007FC0000 +23227DA12A>I<FFFFFF00FFFFFFE007F007F007F001FC07F000FC07F0007E07F0007E07F0007F +07F0007F07F0007F07F0007F07F0007F07F0007E07F0007E07F000FC07F001FC07F007F007FFFF +E007FFFF0007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0 +000007F0000007F0000007F0000007F00000FFFF8000FFFF800020227EA126>I<0007FC000000 +3FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001F80003F003F00001F80 +3F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000F +E0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F00001FC07F0000 +1FC03F00001F803F81F03F801F83F83F000FC70C7E0007E606FC0003F607F80000FF07E000003F +FF80000007FF80200000038020000003C020000003E0E0000003FFE0000001FFC0000001FFC000 +0000FFC0000000FF800000007F000000001E00232C7DA12A>I<FFFFFE0000FFFFFFC00007F007 +F00007F001F80007F000FC0007F0007E0007F0007F0007F0007F0007F0007F0007F0007F0007F0 +007F0007F0007F0007F0007E0007F000FC0007F001F80007F007F00007FFFFC00007FFFF800007 +F00FE00007F007F00007F003F80007F001FC0007F001FC0007F001FC0007F001FC0007F001FC00 +07F001FC0007F001FC0007F001FC0007F001FC0607F000FE0607F000FF0CFFFF803FF8FFFF800F +F027227EA12A>I<01FC0407FF8C1F03FC3C007C7C003C78001C78001CF8000CF8000CFC000CFC +0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FF00007F00003F00 +003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF8018227DA11F>I< +7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003F80180E003F801C0E003F801 +C0C003F800C0C003F800C0C003F800C0C003F800C00003F800000003F800000003F800000003F8 +00000003F800000003F800000003F800000003F800000003F800000003F800000003F800000003 +F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 +03F8000003FFFFF80003FFFFF80022227EA127>I<FFFF803FFCFFFF803FFC07F000018007F000 +018007F000018007F000018007F000018007F000018007F000018007F000018007F000018007F0 +00018007F000018007F000018007F000018007F000018007F000018007F000018007F000018007 +F000018007F000018007F000018007F000018007F000018007F000018007F000018003F0000300 +03F800030001F800060000FC000E00007E001C00003F80F800000FFFE0000001FF000026227EA1 +2B>I<FFFF800FFEFFFF800FFE07F00000C007F80000C003F800018003F800018001FC00030001 +FC00030001FE00070000FE00060000FF000600007F000C00007F800C00003F801800003F801800 +003FC03800001FC03000001FE03000000FE06000000FF060000007F0C0000007F0C0000007F9C0 +000003F980000003FD80000001FF00000001FF00000000FE00000000FE00000000FE000000007C +000000007C00000000380000000038000027227FA12A>I<FFFF0FFFF01FFEFFFF0FFFF01FFE0F +F000FF0000E007F0007F0000C007F0007F0000C003F8007F80018003F8003F80018003FC003F80 +038001FC003FC0030001FC003FC0030000FE007FE0060000FE006FE0060000FF006FE00600007F +00C7F00C00007F00C7F00C00007F80C7F81C00003F8183F81800003F8183F81800001FC383FC30 +00001FC301FC3000001FE301FC3000000FE600FE6000000FE600FE6000000FF600FFE0000007FC +007FC0000007FC007FC0000003FC007F80000003F8003F80000003F8003F80000001F0001F0000 +0001F0001F00000000F0001E00000000E0000E00000000E0000E000037227FA13A>I<07FC001F +FF803F07C03F03E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC +01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97 +D<FF000000FF0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F00 +00001F0000001F0000001F0000001F0FE0001F3FF8001FF07C001F801E001F001F001F000F801F +000F801F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000FC01F000F80 +1F001F801F801F001FC03E001EE07C001C3FF800180FC0001A237EA21F>I<00FF8007FFE00F83 +F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000FC0000FC0000FC00007C00007E00 +007E00003E00301F00600FC0E007FF8000FE0014167E9519>I<0001FE000001FE0000003E0000 +003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00 +01FC3E0007FFBE000F81FE001F007E003E003E007E003E007C003E00FC003E00FC003E00FC003E +00FC003E00FC003E00FC003E00FC003E00FC003E007C003E007C003E003E007E001E00FE000F83 +BE0007FF3FC001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC +00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC07003 +FFC000FF0015167E951A>I<003F8000FFC001E3E003C7E007C7E00F87E00F83C00F80000F8000 +0F80000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F80000F80000F80000F8000 +0F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80007FF8007FF800 +13237FA211>I<03FC1E0FFF7F1F0F8F3E07CF3C03C07C03E07C03E07C03E07C03E07C03E03C03 +C03E07C01F0F801FFF0013FC003000003000003800003FFF801FFFF00FFFF81FFFFC3800FC7000 +3EF0001EF0001EF0001EF0001E78003C7C007C3F01F80FFFE001FF0018217E951C>I<FF000000 +FF0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000 +001F0000001F0000001F07E0001F1FF8001F307C001F403C001F803E001F803E001F003E001F00 +3E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F +003E001F003E001F003E00FFE1FFC0FFE1FFC01A237EA21F>I<1C003E007F007F007F003E001C +000000000000000000000000000000FF00FF001F001F001F001F001F001F001F001F001F001F00 +1F001F001F001F001F001F001F001F00FFE0FFE00B247EA310>I<0038007C00FE00FE00FE007C +0038000000000000000000000000000003FE03FE003E003E003E003E003E003E003E003E003E00 +3E003E003E003E003E003E003E003E003E003E003E003E003E003E783EFC3EFC3CFC7C78F87FE0 +1F800F2E83A311>I<FF000000FF0000001F0000001F0000001F0000001F0000001F0000001F00 +00001F0000001F0000001F0000001F0000001F0000001F00FF801F00FF801F0038001F0060001F +01C0001F0380001F0700001F0E00001F1C00001F7E00001FFF00001FCF00001F0F80001F07C000 +1F03E0001F01E0001F01F0001F00F8001F007C001F003C00FFE0FFC0FFE0FFC01A237EA21E>I< +FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA210>I<FF +07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F001F001F00 +1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 +1F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530>I<FF07E000FF1FF8001F307C001F403C001F80 +3E001F803E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F +003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE1FFC01A167E951F>I<00 +FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC +007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>I<FF0FE000FF3F +F8001FF07C001F803E001F001F001F001F801F001F801F000FC01F000FC01F000FC01F000FC01F +000FC01F000FC01F000FC01F000FC01F001F801F001F801F803F001FC03E001FE0FC001F3FF800 +1F0FC0001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F000000FFE000 +00FFE000001A207E951F>I<00FE030007FF87000FC1C7001F006F003F003F007E003F007E001F +007C001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F007E001F007E00 +1F003E003F001F007F000FC1DF0007FF9F0001FC1F0000001F0000001F0000001F0000001F0000 +001F0000001F0000001F0000001F000000FFE00000FFE01B207E951E>I<FE1F00FE3FC01E67E0 +1EC7E01E87E01E87E01F83C01F00001F00001F00001F00001F00001F00001F00001F00001F0000 +1F00001F00001F00001F0000FFF000FFF00013167E9517>I<0FF3003FFF00781F00600700E003 +00E00300F00300FC00007FE0007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E003 +80F00700FC0E00EFFC00C7F00011167E9516>I<01800001800001800001800003800003800007 +80000780000F80003F8000FFFF00FFFF000F80000F80000F80000F80000F80000F80000F80000F +80000F80000F80000F80000F81800F81800F81800F81800F81800F830007C30003FE0000F80011 +207F9F16>I<FF01FE00FF01FE001F003E001F003E001F003E001F003E001F003E001F003E001F +003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F007E00 +1F00FE000F81BE0007FF3FC001FC3FC01A167E951F>I<FFE01FE0FFE01FE00F8006000F800600 +0FC00E0007C00C0007E01C0003E0180003E0180001F0300001F0300000F8600000F86000007CC0 +00007CC000007FC000003F8000003F8000001F0000001F0000000E0000000E00001B167F951E> +I<FFE7FF07F8FFE7FF07F81F007800C00F807801800F807C01800F807C018007C07E030007C0DE +030007E0DE070003E0DF060003E18F060001F18F0C0001F38F8C0001FB079C0000FB07D80000FE +03D800007E03F000007E03F000007C01F000003C01E000003800E000001800C00025167F9528> +I<FFE07FC0FFE07FC00F801C0007C0380003E0700003F0600001F8C00000F98000007F8000003F +0000001F0000001F8000003FC0000037C0000063E00000C1F00001C0F8000380FC0007007E000E +003E00FF80FFE0FF80FFE01B167F951E>I<FFE01FE0FFE01FE00F8006000F8006000FC00E0007 +C00C0007E01C0003E0180003E0180001F0300001F0300000F8600000F86000007CC000007CC000 +007FC000003F8000003F8000001F0000001F0000000E0000000E0000000C0000000C0000001800 +0078180000FC380000FC300000FC60000069C000007F8000001F0000001B207F951E>I<7FFFF0 +7FFFF07C03E07007C0600FC0E01F80C01F00C03E00C07E0000FC0000F80001F00003F03007E030 +07C0300F80701F80703F00603E00E07C03E0FFFFE0FFFFE014167E9519>I<FFFFFFE0FFFFFFE0 +1B02808E1C>I E /Fv 23 119 df<00000003FF00000C0000003FFFF0001C000001FFFFFC001C +000007FF007F003C00001FF0000F807C00007FC00003C0FC0000FF000000F0FC0003FC00000079 +FC0007F80000003FFC000FF00000001FFC001FE00000000FFC003FC000000007FC007F80000000 +03FC00FF8000000003FC01FF0000000001FC01FE0000000001FC03FE0000000000FC07FC000000 +0000FC07FC00000000007C0FFC00000000007C0FF800000000007C1FF800000000003C1FF80000 +0000003C3FF000000000003C3FF000000000003C3FF000000000001C7FF000000000001C7FF000 +000000001C7FE000000000001C7FE0000000000000FFE0000000000000FFE0000000000000FFE0 +000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FF +E0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000 +FFE00000000000007FE00000000000007FE00000000000007FF000000000001C7FF00000000000 +1C3FF000000000001C3FF000000000001C3FF000000000001C1FF800000000001C1FF800000000 +00380FF80000000000380FFC00000000003807FC00000000003807FC00000000007003FE000000 +00007001FE0000000000E001FF0000000000E000FF8000000001C0007F8000000001C0003FC000 +00000380001FE00000000700000FF00000000E000007F80000001C000003FC00000038000000FF +000000700000007FC00001E00000001FF00007C000000007FF007F0000000001FFFFFE00000000 +003FFFF0000000000003FF8000003E497AC74B>67 D<FFFFFFFFFFFFFF80FFFFFFFFFFFFFF80FF +FFFFFFFFFFFF80007FF800000FFF80003FF0000000FFC0001FF00000003FC0001FF00000001FC0 +001FF00000000FC0001FF000000007C0001FF000000003C0001FF000000003C0001FF000000001 +C0001FF000000001E0001FF000000001E0001FF000000000E0001FF000000000E0001FF0000000 +00E0001FF000000000E0001FF000000000E0001FF00000000070001FF00000000070001FF00001 +C00070001FF00001C00070001FF00001C00000001FF00001C00000001FF00001C00000001FF000 +01C00000001FF00001C00000001FF00003C00000001FF00003C00000001FF00007C00000001FF0 +000FC00000001FF0003FC00000001FFFFFFFC00000001FFFFFFFC00000001FFFFFFFC00000001F +F0003FC00000001FF0000FC00000001FF00007C00000001FF00003C00000001FF00003C0000000 +1FF00001C00000001FF00001C00000001FF00001C00000001FF00001C00000001FF00001C0000E +001FF00001C0000E001FF00001C0000E001FF0000000001C001FF0000000001C001FF000000000 +1C001FF0000000001C001FF0000000001C001FF0000000003C001FF0000000003C001FF0000000 +0038001FF00000000038001FF00000000078001FF00000000078001FF000000000F8001FF00000 +0000F8001FF000000001F0001FF000000001F0001FF000000003F0001FF00000000FF0001FF000 +00001FF0003FF00000007FF0007FF8000007FFF0FFFFFFFFFFFFFFE0FFFFFFFFFFFFFFE0FFFFFF +FFFFFFFFE03F477DC646>69 D<FFFFFFFEFFFFFFFEFFFFFFFE007FFC00003FF800001FF000001F +F000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF00000 +1FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000 +001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF0 +00001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001F +F000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF00000 +1FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000001FF000 +001FF000003FF800007FFC00FFFFFFFEFFFFFFFEFFFFFFFE1F477DC625>73 +D<FFFFFFFFFFC00000FFFFFFFFFFFC0000FFFFFFFFFFFF0000007FF80001FFC000003FF000003F +F000001FF000000FF800001FF0000007FC00001FF0000003FE00001FF0000001FF00001FF00000 +01FF80001FF0000000FF80001FF0000000FFC0001FF0000000FFE0001FF00000007FE0001FF000 +00007FE0001FF00000007FF0001FF00000007FF0001FF00000007FF0001FF00000007FF0001FF0 +0000007FF0001FF00000007FF0001FF00000007FF0001FF00000007FF0001FF00000007FE0001F +F00000007FE0001FF0000000FFC0001FF0000000FFC0001FF0000000FF80001FF0000001FF8000 +1FF0000001FF00001FF0000003FE00001FF0000007FC00001FF000000FF800001FF000003FE000 +001FF00001FF8000001FFFFFFFFE0000001FFFFFFFF00000001FF00000000000001FF000000000 +00001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF0000000 +0000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF00000 +000000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF000 +00000000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001FF0 +0000000000001FF00000000000001FF00000000000001FF00000000000001FF00000000000001F +F00000000000001FF00000000000001FF00000000000003FF80000000000007FFC0000000000FF +FFFFFE00000000FFFFFFFE00000000FFFFFFFE000000003C477DC646>80 +D<3FFFFFFFFFFFFFFF003FFFFFFFFFFFFFFF003FFFFFFFFFFFFFFF003FF8000FFE0007FF003FC0 +0007FC0000FF003F000007FC00003F007E000007FC00001F807C000007FC00000F807C000007FC +00000F8078000007FC0000078078000007FC0000078078000007FC0000078070000007FC000003 +8070000007FC0000038070000007FC0000038070000007FC0000038070000007FC00000380F000 +0007FC000003C0E0000007FC000001C0E0000007FC000001C0E0000007FC000001C0E0000007FC +000001C0E0000007FC000001C000000007FC0000000000000007FC0000000000000007FC000000 +0000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000000000 +0007FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC +0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000 +0000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000000000 +0007FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC +0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000 +0000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000000000 +0007FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC +0000000000000007FC0000000000000007FC0000000000000007FC0000000000000007FC000000 +000000000FFE000000000000003FFF800000000003FFFFFFFFF800000003FFFFFFFFF800000003 +FFFFFFFFF8000042467CC54B>84 D<0003FE000000001FFFC00000007E03F0000000F000FC0000 +01C0007E00000380003F000007C0001F800007F0001FC0000FF0000FC0000FF8000FE0000FF800 +0FE0000FF80007F00007F00007F00007F00007F00001C00007F00000000007F00000000007F000 +00000007F00000000007F000000001FFF00000007FFFF0000003FF87F000001FF007F000007F80 +07F00001FE0007F00003F80007F00007F00007F0000FE00007F0001FC00007F0003FC00007F000 +3F800007F0007F800007F01C7F800007F01CFF000007F01CFF000007F01CFF000007F01CFF0000 +0FF01CFF00000FF01CFF00000FF01C7F80001BF01C7F800033F01C3FC00031F8381FC00061F838 +0FF001C0FC7003FC0780FFE000FFFE003FC0001FF8001F802E2F7CAD34>97 +D<00003FE0000001FFFE000007E01F80001F8003C0003E0000E0007C00007001F80000F803F800 +03F803F00003FC07F00007FC0FE00007FC1FE00007FC1FC00003F83FC00003F83FC00000E03FC0 +0000007FC00000007F800000007F80000000FF80000000FF80000000FF80000000FF80000000FF +80000000FF80000000FF80000000FF80000000FF80000000FF800000007F800000007F80000000 +7FC00000003FC00000003FC000000E1FC000000E1FE000000E0FE000001C0FF000001C07F00000 +3803F800003801F800007000FC0000E0007E0001C0001F800780000FE03E000001FFFC0000003F +E000272F7DAD2E>99 D<000000003FC0000000001FFFC0000000001FFFC0000000001FFFC00000 +0000007FC000000000003FC000000000001FC000000000001FC000000000001FC000000000001F +C000000000001FC000000000001FC000000000001FC000000000001FC000000000001FC0000000 +00001FC000000000001FC000000000001FC000000000001FC000000000001FC000000000001FC0 +00000000001FC000000000001FC000000000001FC000000000001FC000000000001FC000000000 +001FC00000001FE01FC0000001FFFC1FC0000007F01E1FC000001F80079FC000003F0001DFC000 +007C0000FFC00001F800007FC00003F800003FC00003F000003FC00007E000001FC0000FE00000 +1FC0001FE000001FC0001FC000001FC0003FC000001FC0003FC000001FC0007FC000001FC0007F +8000001FC0007F8000001FC000FF8000001FC000FF8000001FC000FF8000001FC000FF8000001F +C000FF8000001FC000FF8000001FC000FF8000001FC000FF8000001FC000FF8000001FC000FF80 +00001FC0007F8000001FC0007F8000001FC0007F8000001FC0003FC000001FC0003FC000001FC0 +001FC000001FC0001FC000001FC0000FE000001FC0000FE000003FC00007F000003FC00003F000 +007FC00001F80000FFC00000FC0001DFE000007E00039FF000001F000F1FFFC0000FE03E1FFFC0 +0003FFF81FFFC000003FC01FE00032497DC739>I<00007F80000003FFF000000FC0FC00003F00 +3F00007C001F8000F8000FC001F80007E003F00007E007E00003F00FE00003F80FE00003F81FC0 +0001FC1FC00001FC3FC00001FC3FC00001FC7F800001FE7F800000FE7F800000FEFF800000FEFF +800000FEFFFFFFFFFEFFFFFFFFFEFF80000000FF80000000FF80000000FF80000000FF80000000 +FF800000007F800000007F800000007F800000007FC00000003FC00000003FC000000E1FC00000 +0E1FE000000E0FE000001C07E000001C07F000003803F000007001F800007000FC0000E0003E00 +03C0001F8007000007E03E000001FFF80000003FC000272F7DAD2E>I<000007F00000003FFC00 +00007C0E000001F81F000003F03F800007E07FC0000FC07FC0000FC07FC0001F807FC0003F803F +80003F801F00003F000E00007F000000007F000000007F000000007F000000007F000000007F00 +0000007F000000007F000000007F000000007F000000007F000000007F000000007F000000007F +000000007F000000007F000000007F000000FFFFFFE000FFFFFFE000FFFFFFE000007F00000000 +7F000000007F000000007F000000007F000000007F000000007F000000007F000000007F000000 +007F000000007F000000007F000000007F000000007F000000007F000000007F000000007F0000 +00007F000000007F000000007F000000007F000000007F000000007F000000007F000000007F00 +0000007F000000007F000000007F000000007F000000007F000000007F000000007F000000007F +000000007F000000007F000000007F000000007F80000001FFC000007FFFFFC0007FFFFFC0007F +FFFFC00022497DC820>I<0001FF0003F0000FFFE01FFC001F83F07C3E007E00FDE07E00F8003F +807E01F8003F003C03F0001F801807F0001FC00007F0001FC0000FE0000FE0000FE0000FE0001F +E0000FF0001FE0000FF0001FE0000FF0001FE0000FF0001FE0000FF0001FE0000FF0001FE0000F +F0000FE0000FE0000FE0000FE00007F0001FC00007F0001FC00003F0001F800001F8003F000000 +F8003E000001FE00FC0000019F83F00000030FFFE000000301FF00000007000000000007000000 +000007000000000007000000000007000000000007000000000007800000000007C00000000007 +E00000000003FFFFFE000003FFFFFFE00001FFFFFFF80000FFFFFFFE00007FFFFFFF0001FFFFFF +FF8003E00001FFC00F8000003FE01F0000000FE03E00000003F03C00000001F07C00000001F878 +00000000F8F800000000F8F800000000F8F800000000F8F800000000F8F800000000F87C000000 +01F07C00000001F03E00000003E01E00000003C00F000000078007C000001F0003E000003E0000 +FC0001F800003F800FE000000FFFFF80000000FFF800002F437DAC34>I<01FE0000000000FFFE +0000000000FFFE0000000000FFFE000000000003FE000000000001FE000000000000FE00000000 +0000FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00 +0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000 +00FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000 +00000000FE000000000000FE000000000000FE000000000000FE007F80000000FE03FFF0000000 +FE0781F8000000FE0C007C000000FE18007E000000FE30003F000000FE60003F800000FEC0001F +800000FF80001F800000FF80001FC00000FF00001FC00000FF00001FC00000FF00001FC00000FE +00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC0 +0000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00 +001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC000 +00FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE0000 +1FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00003 +FF80007FF000FFFFFE1FFFFFC0FFFFFE1FFFFFC0FFFFFE1FFFFFC032487CC739>I<01F00003F8 +0007FC000FFE000FFE000FFE000FFE000FFE0007FC0003F80001F0000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000FE00FFFE00FFFE +00FFFE0003FE0001FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE +0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0003FF +00FFFFFCFFFFFCFFFFFC16467DC51C>I<01FE00FFFE00FFFE00FFFE0003FE0001FE0000FE0000 +FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 +FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 +FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 +FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000 +FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0003FF80FFFFFEFFFFFEFFFFFE17 +487DC71C>108 D<01FC007FC00007FC0000FFFC01FFF8001FFF8000FFFC0780FC00780FC000FF +FC0E003E00E003E00003FC18003F018003F00001FC30001F830001F80000FC60001FC60001FC00 +00FCC0001FCC0001FC0000FD80000FD80000FC0000FD80000FF80000FE0000FF00000FF00000FE +0000FF00000FF00000FE0000FF00000FF00000FE0000FE00000FE00000FE0000FE00000FE00000 +FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE000 +00FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE0 +0000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000F +E00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE0000 +0FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00 +000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0000FE +00000FE00000FE0000FE00000FE00000FE0000FE00000FE00000FE0003FF80003FF80003FF80FF +FFFE0FFFFFE0FFFFFEFFFFFE0FFFFFE0FFFFFEFFFFFE0FFFFFE0FFFFFE4F2D7CAC56>I<01FC00 +7F800000FFFC03FFF00000FFFC0781F80000FFFC0C007C000003FC18007E000001FC30003F0000 +00FC60003F800000FCC0001F800000FD80001F800000FD80001FC00000FF00001FC00000FF0000 +1FC00000FF00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000 +FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001F +C00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE +00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC0 +0000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00 +001FC00000FE00001FC00003FF80007FF000FFFFFE1FFFFFC0FFFFFE1FFFFFC0FFFFFE1FFFFFC0 +322D7CAC39>I<00003FE000000001FFFC00000007E03F0000001F800FC000007E0003F00000FC +0001F80001F80000FC0003F000007E0007F000007F0007E000003F000FE000003F801FC000001F +C01FC000001FC03FC000001FE03FC000001FE03F8000000FE07F8000000FF07F8000000FF07F80 +00000FF0FF8000000FF8FF8000000FF8FF8000000FF8FF8000000FF8FF8000000FF8FF8000000F +F8FF8000000FF8FF8000000FF8FF8000000FF8FF8000000FF87F8000000FF07F8000000FF07F80 +00000FF03FC000001FE03FC000001FE03FC000001FE01FC000001FC00FE000003F800FE000003F +8007F000007F0003F000007E0001F80000FC0000FC0001F800007E0003F000001F800FC000000F +E03F80000003FFFE000000003FE000002D2F7DAD34>I<01FE00FF000000FFFE07FFF00000FFFE +1F01FC0000FFFE38007E000003FE70003F800001FEC0001FC00000FF80000FE00000FF800007F0 +0000FF000003F80000FE000003FC0000FE000001FC0000FE000001FE0000FE000001FE0000FE00 +0000FF0000FE000000FF0000FE000000FF8000FE000000FF8000FE0000007F8000FE0000007FC0 +00FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000 +007FC000FE0000007FC000FE0000007FC000FE0000007FC000FE0000007F8000FE000000FF8000 +FE000000FF8000FE000000FF0000FE000000FF0000FE000001FE0000FE000001FE0000FE000003 +FC0000FE000003F80000FF000007F00000FF800007F00000FF80000FE00000FFC0001F800000FE +E0003F000000FE7800FE000000FE1E03F8000000FE0FFFE0000000FE01FE00000000FE00000000 +0000FE000000000000FE000000000000FE000000000000FE000000000000FE000000000000FE00 +0000000000FE000000000000FE000000000000FE000000000000FE000000000000FE0000000000 +00FE000000000000FE000000000000FE000000000003FF8000000000FFFFFE00000000FFFFFE00 +000000FFFFFE0000000032417DAC39>I<01FC01F800FFFC07FE00FFFC1E1F00FFFC383F8003FC +607FC001FC607FC000FCC07FC000FCC07FC000FD803F8000FD801F0000FF000E0000FF00000000 +FF00000000FF00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE000000 +00FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE0000 +0000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 +000000FE00000000FE00000000FE00000000FE00000000FF00000003FF800000FFFFFF8000FFFF +FF8000FFFFFF8000222D7DAC28>114 D<001FF8060000FFFF0E0003F0079E00078001FE000E00 +007E001C00003E003C00003E007800001E007800001E00F800001E00F800000E00F800000E00FC +00000E00FC00000E00FE00000E00FF000000007FC00000007FF80000003FFFE000001FFFFE0000 +0FFFFF800007FFFFE00003FFFFF00000FFFFFC00001FFFFE000001FFFE0000000FFF00000001FF +800000007F806000001FC0E000001FC0E000000FC0F000000FC0F0000007C0F0000007C0F00000 +07C0F8000007C0F800000780FC00000780FC00000F00FE00000F00FF00001E00FF80003C00F9E0 +007800F0F803E000E03FFFC000C007FC0000222F7DAD29>I<0007000000070000000700000007 +00000007000000070000000F0000000F0000000F0000000F0000000F0000001F0000001F000000 +3F0000003F0000007F0000007F000000FF000001FF000007FF00001FFFFFFCFFFFFFFCFFFFFFFC +007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F00 +00007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F0000007F +0000007F0000007F0000007F000E007F000E007F000E007F000E007F000E007F000E007F000E00 +7F000E007F000E007F000E007F000E003F000C003F801C001F801C001F8018000FC0380007C030 +0003F0E00001FFC000003F801F417EBF28>I<01FE00003FC000FFFE001FFFC000FFFE001FFFC0 +00FFFE001FFFC00003FE00007FC00001FE00003FC00000FE00001FC00000FE00001FC00000FE00 +001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC000 +00FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE0000 +1FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000 +FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001FC00000FE00001F +C00000FE00001FC00000FE00001FC00000FE00003FC00000FE00003FC00000FE00003FC00000FE +00007FC000007E00007FC000007E00007FC000003F0000DFC000003F00019FE000001F00031FF0 +00000F80061FFFC00007F01C1FFFC00001FFF81FFFC000003FE01FE000322E7CAC39>I<FFFFF8 +007FFFC0FFFFF8007FFFC0FFFFF8007FFFC003FF80001FFE0001FE000007F80000FE000003E000 +00FE000003C00000FF000003C000007F0000038000007F0000038000003F8000070000003F8000 +070000003FC0000F0000001FC0000E0000001FC0000E0000000FE0001C0000000FE0001C000000 +0FF0003C00000007F0003800000007F0003800000003F8007000000003F8007000000003FC00F0 +00000001FC00E000000001FC00E000000000FE01C000000000FE01C000000000FF03C000000000 +7F0380000000007F0380000000003F8700000000003F8700000000003FCF00000000001FCE0000 +0000001FCE00000000000FFC00000000000FFC00000000000FFC000000000007F8000000000007 +F8000000000003F0000000000003F0000000000003F0000000000001E0000000000001E0000000 +322D7EAB37>I E /Fw 38 122 df<78FCFCFCFC7806067B8511>46 D<007F000001C1C0000780 +F0000F0078000E0038001C001C003C001E003C001E003C001E0078000F0078000F0078000F0078 +000F00F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80 +F8000F80F8000F80F8000F80F8000F80F8000F80F8000F8078000F0078000F0078000F0078000F +003C001E003C001E003C001E001C001C000E0038000F0078000780F00001C1C000007F00001929 +7EA71E>48 D<00100000700001F0000FF000FEF000F0F00000F00000F00000F00000F00000F000 +00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000 +00F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F000 +01F8007FFFE07FFFE013287BA71E>I<007F000001FFC00007C1E0000F0070001E0038001C003C +003C001C0078001E0078001E00F8000F00F8000F00F8000F00F8000F00F8000F80F8000F80F800 +0F80F8000F8078000F8078001F803C001F803C001F801C002F800E004F800700CF8003810F8000 +7E0F8000000F0000000F0000000F0000001E0000001E0000001E0000003C001C003C003E007800 +3E0070003C00E0001801C0001C0780000FFE000003F8000019297EA71E>57 +D<00001800000000180000000018000000003C000000003C000000003C000000007E000000007E +00000000FF000000009F000000009F000000011F800000010F800000010F8000000207C0000002 +07C000000207C000000403E000000403E000000403E000000801F000000801F000001801F80000 +1000F800001000F800002000FC000020007C00003FFFFC00007FFFFE000040003E000040003E00 +0080001F000080001F000080001F000100000F800100000F800100000F8002000007C007000007 +C01F80000FE0FFF000FFFFFFF000FFFF282A7EA92D>65 D<FFFFFF8000FFFFFFF00007E000FC00 +03E0007E0003E0003F0003E0001F8003E0000F8003E0000F8003E0000FC003E0000FC003E0000F +C003E0000FC003E0000FC003E0000F8003E0001F8003E0001F0003E0003E0003E0007C0003E001 +F80003FFFFE00003E000F80003E0003E0003E0001F0003E0000F8003E00007C003E00007E003E0 +0003E003E00003F003E00003F003E00003F003E00003F003E00003F003E00003F003E00007E003 +E00007E003E0000FC003E0001F8003E0003F0007E000FE00FFFFFFF800FFFFFFE00024297EA82A +>I<0000FF00100007FFE030001FC07830003E000C7000F80006F001F00003F003E00001F007C0 +0000F00F800000700F800000701F000000303F000000303E000000303E000000107E000000107E +000000107C00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000 +FC00000000FC00000000FC000000007C000000007E000000007E000000103E000000103E000000 +103F000000101F000000200F800000200F8000006007C000004003E000008001F000018000F800 +0300003E000E00001FC038000007FFE0000000FF8000242B7DA92B>I<FFFFFFFF80FFFFFFFF80 +07E0001F8003E000078003E00001C003E00000C003E00000C003E000004003E000004003E00000 +4003E000004003E000002003E001002003E001002003E001000003E001000003E003000003E003 +000003E00F000003FFFF000003FFFF000003E00F000003E003000003E003000003E001000003E0 +01001003E001001003E001001003E000001003E000002003E000002003E000002003E000002003 +E000006003E000006003E00000E003E00001E003E00003C007E0001FC0FFFFFFFFC0FFFFFFFFC0 +24297EA829>69 D<FFFFFFFF00FFFFFFFF0007E0003F0003E000070003E000038003E000018003 +E000018003E000008003E000008003E000008003E000008003E000004003E002004003E0020040 +03E002000003E002000003E002000003E006000003E00E000003FFFE000003FFFE000003E00E00 +0003E006000003E002000003E002000003E002000003E002000003E002000003E000000003E000 +000003E000000003E000000003E000000003E000000003E000000003E000000003E000000003E0 +00000007F0000000FFFFE00000FFFFE0000022297EA827>I<FFFF81FFFFFFFF81FFFF07F0000F +E003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E000 +07C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E0 +0007C003FFFFFFC003FFFFFFC003E00007C003E00007C003E00007C003E00007C003E00007C003 +E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C0 +03E00007C003E00007C003E00007C003E00007C007F0000FE0FFFF81FFFFFFFF81FFFF28297EA8 +2D>72 D<FFFF80FFFF8007F00003E00003E00003E00003E00003E00003E00003E00003E00003E0 +0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0 +0003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E0 +0007F000FFFF80FFFF8011297EA816>I<03FFFF03FFFF0007E00003E00003E00003E00003E000 +03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 +03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E03003E07803E0FC +03E0FC03E0FC03C0F807C0400780200F00300E000C3C0003F000182A7DA81F>I<FFFFE000FFFF +E00007F0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003 +E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00000 +03E0000003E0000003E0000003E0000003E0000103E0000103E0000103E0000103E0000203E000 +0203E0000203E0000203E0000603E0000603E0000E03E0001E03E0007C07E001FCFFFFFFFCFFFF +FFFC20297EA825>76 D<FFE0000003FFC0FFE0000003FFC007E0000003F80002F0000005F00002 +F0000005F0000278000009F0000278000009F0000278000009F000023C000011F000023C000011 +F000021E000021F000021E000021F000021E000021F000020F000041F000020F000041F0000207 +800081F0000207800081F0000207800081F0000203C00101F0000203C00101F0000203E00201F0 +000201E00201F0000201E00201F0000200F00401F0000200F00401F0000200F00401F000020078 +0801F0000200780801F00002003C1001F00002003C1001F00002003C1001F00002001E2001F000 +02001E2001F00002000F4001F00002000F4001F00002000F4001F0000200078001F00007000780 +01F0000F80030003F800FFF803007FFFC0FFF803007FFFC032297EA837>I<FFE0001FFFFFF000 +1FFF03F80001F002F80000E0027C000040027E000040023E000040021F000040021F800040020F +8000400207C000400207E000400203E000400201F000400201F800400200F8004002007C004002 +007E004002003E004002001F004002001F804002000F8040020007C040020003E040020003E040 +020001F040020000F840020000F8400200007C400200003E400200003E400200001F400200000F +C00200000FC002000007C002000003C002000003C007000001C00F800000C0FFF80000C0FFF800 +004028297EA82D>I<0001FF0000000F01E000003C0078000078003C0000E0000E0001E0000F00 +03C000078007800003C00F800003E01F000001F01F000001F03E000000F83E000000F87E000000 +FC7E000000FC7C0000007C7C0000007CFC0000007EFC0000007EFC0000007EFC0000007EFC0000 +007EFC0000007EFC0000007EFC0000007EFC0000007E7C0000007C7E000000FC7E000000FC7E00 +0000FC3E000000F83F000001F81F000001F01F000001F00F800003E007800003C007C00007C003 +E0000F8000F0001E000078003C00003C007800000F01E0000001FF0000272B7DA92E>I<FFFFFF +8000FFFFFFF00007E000FC0003E0003E0003E0001F0003E0000F8003E0000FC003E00007C003E0 +0007E003E00007E003E00007E003E00007E003E00007E003E00007E003E00007C003E0000FC003 +E0000F8003E0001F0003E0003E0003E001F80003FFFFE00003E000000003E000000003E0000000 +03E000000003E000000003E000000003E000000003E000000003E000000003E000000003E00000 +0003E000000003E000000003E000000003E000000003E000000003E000000007F0000000FFFF80 +0000FFFF80000023297EA829>I<FFFFFE000000FFFFFFC0000007E003F0000003E000FC000003 +E0003E000003E0001F000003E0001F800003E0000F800003E0000FC00003E0000FC00003E0000F +C00003E0000FC00003E0000FC00003E0000FC00003E0000F800003E0001F000003E0001E000003 +E0003C000003E000F8000003E003E0000003FFFE00000003E00780000003E001E0000003E000F0 +000003E00078000003E0007C000003E0003C000003E0003E000003E0003E000003E0003E000003 +E0003E000003E0003F000003E0003F000003E0003F000003E0003F000003E0003F008003E0003F +808003E0001F808007F0000F8100FFFF8007C100FFFF8003C20000000000FC00292A7EA82C>82 +D<00FE010003FF83000F81E3001E0037003C001F0038000F007800070070000700F0000300F000 +0300F0000300F0000100F8000100F8000100FC0000007C0000007F0000003FE000001FFF00000F +FFE00007FFF80003FFFC00007FFE000007FF0000007F0000001F8000000F80000007C0000007C0 +800003C0800003C0800003C0800003C0C00003C0C0000380C0000380E0000780F0000700F8000E +00EE001C00C3C07800C1FFF000803FC0001A2B7DA921>I<7FFFFFFFF87FFFFFFFF87C007C00F8 +70007C003860007C001840007C000840007C0008C0007C000CC0007C000C80007C000480007C00 +0480007C000480007C000480007C000400007C000000007C000000007C000000007C000000007C +000000007C000000007C000000007C000000007C000000007C000000007C000000007C00000000 +7C000000007C000000007C000000007C000000007C000000007C000000007C000000007C000000 +007C000000007C000000007C000000007C00000000FE000000FFFFFE0000FFFFFE0026297EA82B +>I<FFFF801FFFFFFF801FFF07F00001F003E00000E003E000004003E000004003E000004003E0 +00004003E000004003E000004003E000004003E000004003E000004003E000004003E000004003 +E000004003E000004003E000004003E000004003E000004003E000004003E000004003E0000040 +03E000004003E000004003E000004003E000004003E000004003E000004003E000004003E00000 +4001E000008001F000008001F000008000F000010000780003000078000200003C000C00001F00 +18000007C070000001FFE00000007F0000282A7EA82D>I<01FC00000E0780001001C0003C00E0 +003E00F0003E0078001C00780008007800000078000000780000007800007FF80003E078000F80 +78001F0078003E0078007C00780078007820F8007820F8007820F8007820F800F8207C00F8203C +013C401F063FC007F80F001B1A7E991E>97 D<007F8001C0700780080F003C1E007C3C007C3C00 +387C0010780000F80000F80000F80000F80000F80000F80000F80000F800007800007C00003C00 +043C00041E00080F001007802001C0C0007F00161A7E991B>99 D<007E0003C3800700E00E00F0 +1C00703C00783C003878003C78003CF8003CF8003CFFFFFCF80000F80000F80000F80000F80000 +7800007C00003C00043C00041E00080E001007002001C0C0007F00161A7E991B>101 +D<001F000070C000E1E001C3E003C3E00381C00780800780000780000780000780000780000780 +00078000078000078000FFFE00FFFE000780000780000780000780000780000780000780000780 +000780000780000780000780000780000780000780000780000780000780000780000780000780 +0007C000FFFE00FFFE00132A7FA912>I<07800000FF800000FF8000000F800000078000000780 +000007800000078000000780000007800000078000000780000007800000078000000780000007 +8000000783F800078C1C0007900E0007A0070007A0078007C0078007C007800780078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +800780078007800780078007800780078007800780FFFCFFFCFFFCFFFC1E2A7FA921>104 +D<07000F801F801F800F80070000000000000000000000000000000000000007807F807F800F80 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +80FFF8FFF80D297FA811>I<007800FC00FC00FC00FC0078000000000000000000000000000000 +000000007C07FC07FC007C003C003C003C003C003C003C003C003C003C003C003C003C003C003C +003C003C003C003C003C003C003C003C003C003C003C003C003C003C7038F838F870F07060C01F +800E3582A812>I<07800000FF800000FF8000000F800000078000000780000007800000078000 +00078000000780000007800000078000000780000007800000078000000780000007807FF00780 +7FF007801F8007801C000780180007802000078040000780800007810000078200000787000007 +9F800007A7800007C7C0000783E0000781E0000781F0000780F8000780780007807C0007803E00 +07801E0007801F0007801F80FFFC7FF8FFFC7FF81D2A7FA920>I<0780FF80FF800F8007800780 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +8007800780078007800780078007800780078007800780078007800780FFFCFFFC0E2A7FA911> +I<0781F800FC00FF860E030700FF98070C03800FA0079003C007A003D001E007C003E001E007C0 +03E001E0078003C001E0078003C001E0078003C001E0078003C001E0078003C001E0078003C001 +E0078003C001E0078003C001E0078003C001E0078003C001E0078003C001E0078003C001E00780 +03C001E0078003C001E0078003C001E0078003C001E0078003C001E0FFFC7FFE3FFFFFFC7FFE3F +FF301A7F9933>I<0783F800FF8C1C00FF900E000FA0070007A0078007C0078007C00780078007 +800780078007800780078007800780078007800780078007800780078007800780078007800780 +0780078007800780078007800780078007800780078007800780FFFCFFFCFFFCFFFC1E1A7F9921 +>I<007F000001C1C000070070000E0038001C001C003C001E003C001E0078000F0078000F00F8 +000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F80F8000F8078000F0078000F00 +3C001E003C001E001E003C000E0038000700700001C1C000007F0000191A7E991E>I<0783F000 +FF8C1C00FFB00F0007A0078007C003C0078003E0078001E0078001F0078001F0078000F8078000 +F8078000F8078000F8078000F8078000F8078000F8078000F0078001F0078001F0078001E00780 +03C007C003C007C0078007A00E0007983C000787E0000780000007800000078000000780000007 +8000000780000007800000078000000780000007800000FFFC0000FFFC00001D267F9921>I<07 +87C0FF98E0FF91F00FA1F007C1F007C0E007C00007800007800007800007800007800007800007 +800007800007800007800007800007800007800007800007800007800007C000FFFE00FFFE0014 +1A7F9917>114 D<07F8401C06C03001C06000C06000C0E00040E00040F00040F800007E00007F +F0003FFE000FFF0003FF80003FC00007C08001E08001E0C000E0C000E0C000E0E000C0F001C0F8 +0180C4070083F800131A7E9918>I<008000008000008000008000018000018000018000038000 +0380000780000F80001FFF80FFFF80078000078000078000078000078000078000078000078000 +07800007800007800007800007800007804007804007804007804007804007804007804003C080 +01C08000E100003E0012257FA417>I<FFF00FF8FFF00FF80F8003C0078003800780010003C002 +0003C0020003E0020001E0040001E0040000F0080000F0080000F818000078100000781000003C +2000003C2000003E6000001E4000001E4000000F8000000F800000070000000700000007000000 +020000000200000004000000040000000400000008000070080000F8100000F8100000F8200000 +F0400000608000001F0000001D267F9920>121 D E /Fx 13 90 df<0000030000000000030000 +0000000300000000000780000000000780000000000FC0000000000FC0000000000FC000000000 +17E00000000013E00000000013E00000000023F00000000021F00000000021F00000000040F800 +00000040F80000000040F800000000807C00000000807C00000001807E00000001003E00000001 +003E00000002003F00000002001F00000002001F00000004000F80000004000F80000004000F80 +0000080007C00000080007C00000180007E000001FFFFFE000001FFFFFE00000200003F0000020 +0001F00000200001F00000400001F80000400000F80000400000F800008000007C00008000007C +00008000007C00010000003E00010000003E00030000003F00030000001F00070000001F001F80 +00003F80FFE00003FFFCFFE00003FFFC2E327EB132>65 D<00003FE0010001FFF8030007F01E03 +001F800307003E000087007800004F00F000002F01E000001F03C000000F078000000F0F800000 +070F000000071F000000031E000000033E000000033C000000017C000000017C000000017C0000 +00017800000000F800000000F800000000F800000000F800000000F800000000F800000000F800 +000000F800000000F800000000F800000000F80000000078000000007C000000007C000000017C +000000013C000000013E000000011E000000011F000000020F000000020F800000060780000004 +03C000000801E000000800F00000100078000020003E0000C0001F8003800007F00F000001FFFC +0000003FE00028337CB130>67 D<FFFFFFE00000FFFFFFFC000007E0007F000003E0000F800003 +E00003C00003E00001E00003E00000F00003E00000780003E000003C0003E000001E0003E00000 +1E0003E000000F0003E000000F0003E000000F8003E00000078003E0000007C003E0000007C003 +E0000003C003E0000003C003E0000003E003E0000003E003E0000003E003E0000003E003E00000 +03E003E0000003E003E0000003E003E0000003E003E0000003E003E0000003E003E0000003E003 +E0000003C003E0000003C003E0000007C003E0000007C003E00000078003E00000078003E00000 +0F8003E000000F0003E000001F0003E000001E0003E000003C0003E00000780003E00000F80003 +E00001F00003E00003E00003E0000F800007E0003F0000FFFFFFFC0000FFFFFFE000002B317CB0 +33>I<FFFFFFFFE0FFFFFFFFE007E0000FE003E00001E003E00000F003E000007003E000003003 +E000003003E000001003E000001003E000001003E000001003E000000803E000000803E0000008 +03E000800803E000800003E000800003E000800003E000800003E001800003E001800003E00780 +0003FFFF800003FFFF800003E007800003E001800003E001800003E000800003E000800003E000 +800003E000800203E000800203E000000203E000000403E000000403E000000403E000000403E0 +00000C03E000000C03E000000803E000001803E000001803E000003803E000007803E00001F807 +E0000FF0FFFFFFFFF0FFFFFFFFF027317CB02D>I<FFFFFFFFC0FFFFFFFFC007E0001FC003E000 +03C003E00001E003E00000E003E000006003E000006003E000002003E000002003E000002003E0 +00002003E000001003E000001003E000001003E000801003E000800003E000800003E000800003 +E000800003E001800003E001800003E007800003FFFF800003FFFF800003E007800003E0018000 +03E001800003E000800003E000800003E000800003E000800003E000800003E000000003E00000 +0003E000000003E000000003E000000003E000000003E000000003E000000003E000000003E000 +000003E000000003E000000003E000000007F0000000FFFFC00000FFFFC0000024317CB02B>I< +FFFF807FFFC0FFFF807FFFC007F00003F80003E00001F00003E00001F00003E00001F00003E000 +01F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F000 +03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000 +01F00003E00001F00003E00001F00003E00001F00003FFFFFFF00003FFFFFFF00003E00001F000 +03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000 +01F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F000 +03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000 +01F00007F00003F800FFFF807FFFC0FFFF807FFFC02A317CB032>72 D<FFFF80FFFF8007F00003 +E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003 +E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003 +E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003 +E00003E00003E00003E00007F000FFFF80FFFF8011317DB017>I<FFFFC00000FFFFC0000007F0 +00000003E000000003E000000003E000000003E000000003E000000003E000000003E000000003 +E000000003E000000003E000000003E000000003E000000003E000000003E000000003E0000000 +03E000000003E000000003E000000003E000000003E000000003E000000003E000000003E00000 +0003E000000003E000000003E000000003E000000003E000000003E000004003E000004003E000 +004003E000004003E000008003E000008003E000008003E000008003E000018003E000018003E0 +00038003E000038003E000078003E0000F0003E0003F0007E000FF00FFFFFFFF00FFFFFFFF0022 +317CB029>76 D<FFE00007FFC0FFF00007FFC003F000007C0002F80000380002FC00001000027C +00001000023E00001000023E00001000021F00001000021F80001000020F800010000207C00010 +000207E00010000203E00010000203F00010000201F00010000200F80010000200FC0010000200 +7C00100002007E00100002003E00100002001F00100002001F80100002000F80100002000FC010 +00020007C01000020003E01000020003F01000020001F01000020000F81000020000F810000200 +007C10000200007E10000200003E10000200001F10000200001F10000200000F90000200000FD0 +0002000007D00002000003F00002000003F00002000001F00002000001F00002000000F0000200 +000070000700000070000F8000003000FFF800003000FFF8000010002A317CB032>78 +D<00003FC000000001C03800000007000E0000001C0003800000380001C00000F00000F00001E0 +0000780003C000003C00038000001C00078000001E000F0000000F000F0000000F001E00000007 +801E00000007803C00000003C03C00000003C07C00000003E07C00000003E07800000001E07800 +000001E0F800000001F0F800000001F0F800000001F0F800000001F0F800000001F0F800000001 +F0F800000001F0F800000001F0F800000001F0F800000001F0F800000001F07C00000003E07C00 +000003E07C00000003E07C00000003E03C00000003C03E00000007C01E00000007801E00000007 +800F0000000F000F0000000F00078000001E0003C000003C0003C000003C0001E00000780000F0 +0000F00000380001C000001C000380000007000E00000001E078000000003FC000002C337CB134 +>I<FFFFFFC000FFFFFFF80007E0007E0003E0001F0003E000078003E00003C003E00001E003E0 +0001F003E00001F003E00000F003E00000F803E00000F803E00000F803E00000F803E00000F803 +E00000F803E00000F003E00001F003E00001E003E00003E003E00003C003E000078003E0001F00 +03E0007C0003FFFFF00003E000000003E000000003E000000003E000000003E000000003E00000 +0003E000000003E000000003E000000003E000000003E000000003E000000003E000000003E000 +000003E000000003E000000003E000000003E000000003E000000003E000000003E000000007F0 +000000FFFF800000FFFF80000025317CB02D>I<7FFFFFFFFFE07FFFFFFFFFE07E000F8007E078 +000F8001E070000F8000E060000F80006040000F80002040000F800020C0000F800030C0000F80 +003080000F80001080000F80001080000F80001080000F80001080000F80001080000F80001000 +000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80 +000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000 +000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80 +000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000 +000F80000000000F80000000000F80000000000F80000000001FC00000000FFFFF8000000FFFFF +80002C317EB030>84 D<FFFE000007FFFFFE000007FF0FF0000001F803F0000000E003F0000000 +C001F80000008000F80000018000FC00000100007E00000200007E00000200003F00000400001F +80000C00001F80000800000FC00010000007C00010000007E00020000003F00060000001F00040 +000001F80080000000FC0080000000FC01000000007E03000000003E02000000003F0400000000 +1F84000000000F88000000000FD80000000007F00000000007E00000000003E00000000003E000 +00000003E00000000003E00000000003E00000000003E00000000003E00000000003E000000000 +03E00000000003E00000000003E00000000003E00000000003E00000000003E00000000003E000 +00000003E00000000003E00000000007F000000000FFFF80000000FFFF800030317FB032>89 +D E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300dpi +TeXDict begin +%%PaperSize: A4 + +%%EndSetup +%%Page: 1 1 +1 0 bop 465 315 a Fx(THE)21 b(HA)-6 b(TFIELD)22 b(POL)-6 b(YTECHNIC)578 +531 y Fw(Sc)n(ho)r(ol)19 b(of)h(Information)f(Sciences)378 +807 y(BA)n(CHELOR)i(OF)g(SCIENCE)e(IN)g(COMPUTER)844 882 y(SCIENCE)781 +1158 y(Pro)s(ject)h(Rep)r(ort)629 1425 y Fv(In)m(v)m(estigation)35 +b(of)457 1549 y(T)-9 b(actical)35 b(and)g(P)m(ositional)283 +1674 y(Ev)-6 b(aluation)36 b(in)g(Computer)f(Chess)761 1949 +y Fw(Mark)20 b(J.)f(Uniac)n(k)n(e)851 2343 y(Ma)n(y)g(1990)p +eop +%%Page: 0 2 +0 1 bop 870 627 a Fu(Abstract)262 762 y Ft(This)25 b(rep)q(ort)g(examines)e +(and)j(describ)q(es)f(v)m(arious)h(tec)o(hniques)d(curren)o(tly)262 +820 y(used)16 b(to)h(program)f(a)g(computer)f(to)i(pla)o(y)e(c)o(hess.)324 +914 y(New)k(w)o(a)o(ys)h(of)g(impro)o(ving)e(b)q(oth)j(p)q(ositional)f(and)g +(tactical)f(abilit)o(y)g(are)262 972 y(in)o(v)o(estigated.)324 +1066 y(An)g(ev)m(aluation)g(function)g(is)g(dev)o(elop)q(ed)f(after)h +(analysing)h(ho)o(w)g(strong)262 1124 y(c)o(hess)15 b(pla)o(y)o(ers)g(select) +g(mo)o(v)o(es.)k(The)d(ev)m(aluation)g(function)f(criteria)g(are)h(for-)262 +1182 y(mally)e(de\014ned)i(and)g(co)o(v)o(er)f(b)q(oth)j(p)q(ositional)e(and) +h(tactical)f(asp)q(ects.)324 1275 y(V)l(arious)c(searc)o(h)f(extension)h +(heuristics)e(are)i(in)o(v)o(estigated)f(and)h(a)g(metho)q(d)262 +1334 y(of)23 b(encorp)q(orating)i(these)e(selectiv)o(e)e(extensions)i(in)o +(to)g(an)h(aspiration)g Fs(\013\014)262 1392 y Ft(searc)o(h)15 +b(is)i(dev)o(elop)q(ed.)324 1485 y(The)j(concept)g(of)h(uncertain)o(t)o(y)d +(is)i(encorp)q(orated)i(in)o(to)d(the)i(ev)m(aluation)262 1543 +y(function)11 b(and)i(a)g(close)e(connection)h(b)q(et)o(w)o(een)f(static)h +(ev)m(aluation)g(and)h(searc)o(h)262 1601 y(decision)i(making)g(is)h(sho)o +(wn)h(to)g(b)q(e)f(e\013ectiv)o(e.)324 1695 y(The)e(ideas)g(dev)o(elop)q(ed)f +(are)h(com)o(bined)e(in)o(to)i(a)g(c)o(hess)g(program)g(encorp)q(o-)262 +1753 y(rating)k(man)o(y)f(state)h(of)h(the)e(art)i(tec)o(hniques.)25 +b(The)18 b(program)g(is)g(sho)o(wn)h(to)262 1811 y(p)q(erform)10 +b(at)i(the)g(exp)q(ert)f(lev)o(el)f(of)i(abilit)o(y)e(b)q(oth)j(tactically)d +(and)i(p)q(ositionally)l(.)324 1905 y(The)23 b(trade)g(o\013)h(b)q(et)o(w)o +(een)e(kno)o(wledge)g(and)i(searc)o(h)e(is)h(examined)e(and)262 +1963 y(conclusions)d(ab)q(out)i(the)f(e\013ectiv)o(eness)e(of)i(reducing)g +(searc)o(h)f(e\013ort)h(b)o(y)g(in-)262 2021 y(creasing)d(kno)o(wledge)g(con) +o(ten)o(t)f(are)h(dra)o(wn.)p eop +%%Page: 1 3 +1 2 bop 692 1168 a Fr(Ac)n(kno)n(wledgemen)n(ts)262 1303 y +Ft(I)10 b(w)o(ould)h(lik)o(e)e(to)i(thank)g(m)o(y)e(pro)s(ject)i(sup)q +(ervisor,)h(Neil)d(Da)o(v)o(ey)l(,)h(for)h(the)g(man)o(y)262 +1361 y(in)o(teresting)17 b(discussions)h(throughout)i(the)e(y)o(ear)g(and)h +(Piet)e(T)l(utelaers,)h(for)262 1419 y(designing)e(c)o(hess)g(fon)o(ts)g +(whic)o(h)g(can)g(b)q(e)h(used)f(in)g(L)1195 1413 y Fq(a)1219 +1419 y Ft(T)1246 1434 y(E)1273 1419 y(X)g(do)q(cumen)o(ts.)967 +2574 y Fp(1)p eop +%%Page: 2 4 +2 3 bop 262 639 a Fo(Con)m(ten)m(ts)262 912 y Fu(1)45 b(In)n(tro)r(duction) +1022 b(7)335 970 y Ft(1.1)50 b(A)16 b(Brief)f(History)34 b +Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h +(:)f(:)g(:)74 b Ft(8)335 1028 y(1.2)50 b(My)16 b(Bac)o(kground)24 +b Fs(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h +(:)f(:)g(:)50 b Ft(10)335 1087 y(1.3)g(Aims)14 b(of)j(the)f(Pro)s(ject)j +Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)50 b Ft(10)262 1193 y Fu(2)45 b(Basic)18 b(Ov)n(erview)924 +b(11)335 1252 y Ft(2.1)50 b(Mac)o(hine)15 b(Represen)o(tation)43 +b Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(11)335 1310 y(2.2)g(Mo)o(v)o(e)15 b(Generation)38 b Fs(:)24 +b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) +50 b Ft(13)335 1368 y(2.3)g(Ev)m(aluation)17 b(F)l(unctions)28 +b Fs(:)c(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(14)335 1426 y(2.4)g(Lo)q(ok)17 b(Ahead)29 b Fs(:)c(:)f(:)h(:)f(:)h(:)f +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(15)335 1484 y(2.5)g(Selectiv)o(e)13 b(Searc)o(hing)37 +b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)g(:)50 b Ft(17)335 1542 y(2.6)g(F)l(ull)15 b(Width)h(Searc)o(hing)25 +b Fs(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(19)335 1600 y(2.7)g(Quiescence)15 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:) +h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(20)335 1658 y(2.8)g(Horizon)16 b(E\013ect)k Fs(:)k(:)h(:)f(:)h(:)f(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(20)262 1765 y Fu(3)45 b(Adv)m(anced)18 b(T)-5 b(opics)889 +b(22)335 1823 y Ft(3.1)50 b(T)l(ree)16 b(Searc)o(hing)c Fs(:)24 +b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)g(:)50 b Ft(22)447 1881 y(3.1.1)56 b(Alpha)16 b(Beta)g(Searc)o(h)g +(Algorithm)34 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(22)447 1940 y(3.1.2)56 b(Aspiration)16 b Fs(\013\014)j +Ft(Searc)o(h)i Fs(:)j(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(25)447 1998 y(3.1.3)56 b(Principle)15 b(V)l(ariation)h +Fs(\013\014)i Ft(Searc)o(h)33 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(25)447 2056 y(3.1.4)56 b(Iterativ)o(e)14 b(Deep)q(ening)21 +b Fs(:)k(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(28)447 2114 y(3.1.5)56 b(Mo)o(v)o(e)15 b(Ordering)43 b +Fs(:)25 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(28)447 2172 y(3.1.6)56 b(Null)15 b(Mo)o(v)o(es)45 b Fs(:)25 +b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(29)447 2230 y(3.1.7)56 b(Razoring)19 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b +Ft(31)335 2288 y(3.2)g(Ev)m(aluation)21 b Fs(:)j(:)h(:)f(:)h(:)f(:)h(:)f(:)h +(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(33)447 2346 y(3.2.1)56 b(Piece)15 b(Square)h(T)l(ables)e +Fs(:)25 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(33)447 2405 y(3.2.2)56 b(Static)16 b(Ev)m(aluation)32 +b Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(34)967 2574 y Fp(2)p eop +%%Page: 3 5 +3 4 bop 447 307 a Ft(3.2.3)56 b(Incremen)o(tal)13 b(Ev)m(aluation)20 +b Fs(:)k(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b +Ft(35)447 365 y(3.2.4)56 b(Phases)17 b(of)g(Pla)o(y)12 b Fs(:)24 +b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(36)447 423 y(3.2.5)56 b(Planning)19 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h +(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b +Ft(37)335 482 y(3.3)g(Learning)25 b Fs(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:) +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(37)447 540 y(3.3.1)56 b(Rote)16 b(Learning)21 b Fs(:)j(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(38)447 +598 y(3.3.2)56 b(Advice)15 b(T)l(aking)h Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(38)447 656 +y(3.3.3)56 b(Induction)43 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h +(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(39)447 714 y(3.3.4)56 +b(Learning)17 b(b)o(y)f(Analogy)31 b Fs(:)24 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) +h(:)f(:)h(:)f(:)g(:)50 b Ft(39)447 772 y(3.3.5)56 b(P)o(arameter)15 +b(Adjustmen)o(t)26 b Fs(:)e(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(39)335 830 y(3.4)g(Time)14 b(Con)o(trol)39 b Fs(:)24 b(:)h(:)f(:)h(:)f +(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(40)262 937 y Fu(4)45 b(The)18 b(Ev)m(aluation)g(F)-5 b(unction)695 +b(42)335 995 y Ft(4.1)50 b(De\014nition)16 b(1)g(:)22 b(Material)35 +b Fs(:)25 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(44)335 1053 y(4.2)g(De\014nition)16 b(2)g(:)22 b(Game)15 +b(Phase)27 b Fs(:)e(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(46)335 1111 y(4.3)g(General)16 b(P)o(ositional)g(Ev)m(aluation)35 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(47)447 1170 y(4.3.1)56 b(De\014nition)16 b(3)h(:)k(Mobilit)o(y)32 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(47)447 1228 y(4.3.2)56 b(De\014nition)16 b(4)h(:)k(Dev)o(elopmen)o(t)11 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(49)447 +1286 y(4.3.3)56 b(De\014nition)16 b(5)h(:)k(Cen)o(tre)15 b(Con)o(trol)49 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(50)447 1344 +y(4.3.4)56 b(De\014nition)16 b(6)h(:)k(Square)16 b(Con)o(trol)46 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(52)335 1402 +y(4.4)g(P)o(a)o(wn)16 b(Ev)m(aluation)42 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(53)447 +1460 y(4.4.1)56 b(De\014nition)16 b(7)h(:)k(Doubled)16 b(P)o(a)o(wns)38 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(53)447 1518 +y(4.4.2)56 b(De\014nition)16 b(8)h(:)k(Isolated)16 b(P)o(a)o(wns)49 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(54)447 1576 +y(4.4.3)56 b(De\014nition)16 b(9)h(:)k(W)l(eak)16 b(P)o(a)o(wns)21 +b Fs(:)j(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(54)447 +1634 y(4.4.4)56 b(De\014nition)16 b(10)h(:)k(P)o(assed)c(P)o(a)o(wns)48 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(56)447 1693 +y(4.4.5)56 b(De\014nition)16 b(11)h(:)k(P)o(a)o(wn)c(T)l(able)e +Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(58)447 +1751 y(4.4.6)56 b(De\014nition)16 b(12)h(:)k(P)o(a)o(wn)c(V)l(alue)c +Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(58)335 +1809 y(4.5)g(Knigh)o(t)16 b(Ev)m(aluation)49 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(60)447 +1867 y(4.5.1)56 b(De\014nition)16 b(13)h(:)k(Knigh)o(t)16 b(V)l(alue)21 +b Fs(:)k(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(60)335 1925 +y(4.6)g(Bishop)16 b(Ev)m(aluation)51 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h +(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(61)447 1983 +y(4.6.1)56 b(De\014nition)16 b(14)h(:)k(Bishop)16 b(A)o(ttac)o(k)37 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(61)447 2041 +y(4.6.2)56 b(De\014nition)16 b(15)h(:)k(Bishop)16 b(on)h(Kings)f(Diagonal)j +Fs(:)24 b(:)g(:)50 b Ft(61)447 2099 y(4.6.3)56 b(De\014nition)16 +b(16)h(:)k(Bishop)16 b(P)o(air)g Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) +g(:)50 b Ft(62)447 2158 y(4.6.4)56 b(De\014nition)16 b(17)h(:)k(Horrwitz)16 +b(Bishops)51 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(62)447 +2216 y(4.6.5)56 b(De\014nition)16 b(18)h(:)k(Enem)o(y)14 b(P)o(a)o(wn)j +(Obstruction)23 b Fs(:)h(:)g(:)50 b Ft(63)447 2274 y(4.6.6)56 +b(De\014nition)16 b(19)h(:)k(Bishop)16 b(T)l(able)25 b Fs(:)g(:)f(:)h(:)f(:)h +(:)f(:)h(:)f(:)g(:)50 b Ft(64)447 2332 y(4.6.7)56 b(De\014nition)16 +b(20)h(:)k(Bishop)16 b(V)l(alue)23 b Fs(:)i(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)50 b Ft(64)335 2390 y(4.7)g(Ro)q(ok)17 b(Ev)m(aluation)47 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h +(:)f(:)g(:)50 b Ft(66)447 2448 y(4.7.1)56 b(De\014nition)16 +b(21)h(:)k(Ro)q(ok{King)c(Closeness)42 b Fs(:)24 b(:)h(:)f(:)g(:)50 +b Ft(66)967 2574 y Fp(3)p eop +%%Page: 4 6 +4 5 bop 447 307 a Ft(4.7.2)56 b(De\014nition)16 b(22)h(:)k(Connected)16 +b(Ro)q(oks)50 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(67)447 +365 y(4.7.3)56 b(De\014nition)16 b(23)h(:)k(Ro)q(ok)c(on)g(Op)q(en)f(File)c +Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(68)447 423 y(4.7.4)56 +b(De\014nition)16 b(24)h(:)k(Ro)q(ok)c(on)g(Sev)o(en)o(th)e(Rank)44 +b Fs(:)25 b(:)f(:)g(:)50 b Ft(68)447 482 y(4.7.5)56 b(De\014nition)16 +b(25)h(:)k(Ro)q(ok)c(V)l(alue)i Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)50 b Ft(69)335 540 y(4.8)g(Queen)16 b(Ev)m(aluation)23 b +Fs(:)h(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) +g(:)50 b Ft(70)447 598 y(4.8.1)56 b(De\014nition)16 b(26)h(:)k(Queen{King)16 +b(Closeness)i Fs(:)24 b(:)h(:)f(:)g(:)50 b Ft(70)447 656 y(4.8.2)56 +b(De\014nition)16 b(27)h(:)k(Queen)16 b(P)o(o)o(w)o(er)23 b +Fs(:)i(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(71)447 714 +y(4.8.3)56 b(De\014nition)16 b(28)h(:)k(Queen)16 b(V)l(alue)33 +b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(71)335 +772 y(4.9)g(King)16 b(Ev)m(aluation)h Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(72)447 +830 y(4.9.1)56 b(De\014nition)16 b(29)h(:)k(King)16 b(On)h(Op)q(en)f(Files)26 +b Fs(:)f(:)f(:)h(:)f(:)g(:)50 b Ft(72)447 888 y(4.9.2)56 b(De\014nition)16 +b(30)h(:)k(W)l(eak)16 b(Squares)h(around)g(King)30 b Fs(:)24 +b(:)50 b Ft(73)447 946 y(4.9.3)56 b(De\014nition)16 b(31)h(:)k(Mating)16 +b(Net)k Fs(:)k(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(75)447 +1005 y(4.9.4)56 b(De\014nition)16 b(32)h(:)k(Chec)o(k)15 b(Threats)33 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(76)447 1063 +y(4.9.5)56 b(De\014nition)16 b(33)h(:)k(King)16 b(T)l(able)30 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(77)447 +1121 y(4.9.6)56 b(De\014nition)16 b(34)h(:)k(King)16 b(V)l(alue)28 +b Fs(:)c(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(77)335 +1179 y(4.10)26 b(Static)16 b(T)l(actical)f(Ev)m(aluation)41 +b Fs(:)25 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 +b Ft(79)447 1237 y(4.10.1)32 b(De\014nition)16 b(35)h(:)k(Pinned)16 +b(Pieces)46 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b +Ft(79)447 1295 y(4.10.2)32 b(De\014nition)16 b(36)h(:)k(A)o(ttac)o(k)o(ed)14 +b(Pieces)43 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(81)335 +1353 y(4.11)26 b(Planning)c Fs(:)i(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:) +f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(82)447 +1411 y(4.11.1)32 b(De\014nition)16 b(37)h(:)k(Pressure)16 b(on)h(King)e +Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(83)447 1469 y(4.11.2)32 +b(De\014nition)16 b(38)h(:)k(Plan)c(Selection)38 b Fs(:)24 +b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(84)447 1528 y(4.11.3)32 +b(De\014nition)16 b(39)h(:)k(P)o(a)o(wn)c(Square)f(T)l(able)46 +b Fs(:)25 b(:)f(:)h(:)f(:)g(:)50 b Ft(86)447 1586 y(4.11.4)32 +b(De\014nition)16 b(40)h(:)k(Knigh)o(t)16 b(Square)g(T)l(able)g +Fs(:)25 b(:)f(:)h(:)f(:)g(:)50 b Ft(88)447 1644 y(4.11.5)32 +b(De\014nition)16 b(41)h(:)k(Bishop)16 b(Square)h(T)l(able)g +Fs(:)25 b(:)f(:)h(:)f(:)g(:)50 b Ft(89)447 1702 y(4.11.6)32 +b(De\014nition)16 b(42)h(:)k(King)16 b(Square)h(T)l(able)22 +b Fs(:)i(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(90)447 1760 y(4.11.7)32 +b(De\014nition)16 b(43)h(:)k(Square)16 b(Con)o(trol)h(T)l(able)41 +b Fs(:)24 b(:)h(:)f(:)g(:)50 b Ft(92)335 1818 y(4.12)26 b(De\014nition)16 +b(44)h(:)k(T)l(otal)c(Ev)m(aluation)g(F)l(unction)f(V)l(alue)32 +b Fs(:)24 b(:)g(:)50 b Ft(94)262 1925 y Fu(5)45 b(T)-5 b(ree)18 +b(Searc)n(hing)940 b(96)335 1983 y Ft(5.1)50 b(Main)16 b(Searc)o(h)22 +b Fs(:)j(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h +(:)f(:)h(:)f(:)g(:)50 b Ft(97)335 2041 y(5.2)g(Searc)o(h)16 +b(Extensions)i Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f +(:)h(:)f(:)h(:)f(:)g(:)50 b Ft(99)447 2099 y(5.2.1)56 b(Threats)44 +b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)h(:)f(:)g(:)h Ft(100)447 2158 y(5.2.2)56 b(Threat)17 b(Execution)25 +b Fs(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(103)335 2216 y(5.3)50 b(Quiescence)14 b(Decision)g Fs(:)25 +b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(106)335 2274 y(5.4)50 b(Quiescence)14 b(Searc)o(h)h Fs(:)24 +b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(107)262 2381 y Fu(6)45 b(HIAR)n(CS)19 b(5.0)966 b(110)335 +2439 y Ft(6.1)50 b(Program)16 b(History)g(and)h(En)o(vironmen)o(t)40 +b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(110)967 +2574 y Fp(4)p eop +%%Page: 5 7 +5 6 bop 335 307 a Ft(6.2)50 b(Program)16 b(Structure)40 b Fs(:)25 +b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(111)335 365 y(6.3)50 b(Data)17 b(Structures)24 b Fs(:)h(:)f(:)h(:)f(:)h(:) +f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(113)447 423 y(6.3.1)56 b(P)o(osition)16 b(Represen)o(tation)46 +b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(114)447 +482 y(6.3.2)56 b(Game)15 b(T)l(ree)e Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) +h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(115)447 540 +y(6.3.3)56 b(T)l(ransp)q(osition)18 b(T)l(able)d Fs(:)25 b(:)f(:)g(:)h(:)f(:) +h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(115)447 598 y(6.3.4)56 +b(Refutation)16 b(T)l(able)41 b Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f +(:)h(:)f(:)h(:)f(:)g(:)h Ft(118)447 656 y(6.3.5)56 b(The)16 +b(History)g(Heuristic)c Fs(:)24 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)g(:)h Ft(119)447 714 y(6.3.6)56 b(Incremen)o(tal)13 b(A)o(ttac)o(k)i(T)l +(ables)29 b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(119)447 772 y(6.3.7)56 b(Game)15 b(History)26 b Fs(:)e(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(121)335 +830 y(6.4)50 b(The)16 b(Algorithms)26 b Fs(:)f(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(122)447 +888 y(6.4.1)56 b(Mo)o(v)o(e)15 b(Generation)36 b Fs(:)24 b(:)h(:)f(:)g(:)h(:) +f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(122)447 946 y(6.4.2)56 +b(Mo)o(v)o(e)15 b(Ordering)43 b Fs(:)25 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h +(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(124)447 1005 y(6.4.3)56 b(T)l(ree)16 +b(Searc)o(hing)48 b Fs(:)25 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)h(:)f(:)g(:)h Ft(127)447 1063 y(6.4.4)56 b(Ev)m(aluation)19 +b Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h +(:)f(:)g(:)h Ft(131)447 1121 y(6.4.5)56 b(Time)14 b(Allo)q(cation)i(and)h +(Con)o(trol)c Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(133)335 1179 y(6.5)50 b(E\016ciency)14 b(Asp)q(ects)j Fs(:)24 +b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(139)447 1237 y(6.5.1)56 b(Algorithms)47 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:) +g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(139)447 +1295 y(6.5.2)56 b(Data)17 b(Structures)22 b Fs(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:) +h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(139)447 1353 y(6.5.3)56 +b(Co)q(de)17 b(Pro)q(duction)39 b Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h +(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(140)262 1460 y Fu(7)45 b(Program)17 +b(P)n(erformance)733 b(141)335 1518 y Ft(7.1)50 b(Bratk)o(o-Kop)q(ec)16 +b(T)l(ests)k Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:) +f(:)h(:)f(:)g(:)h Ft(142)335 1576 y(7.2)50 b(Computer)15 b(Opp)q(osition)i +Fs(:)24 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(146)335 1634 y(7.3)50 b(Human)15 b(Opp)q(osition)36 b Fs(:)25 +b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(152)335 1693 y(7.4)50 b(Kno)o(wledge)16 b(v)o(ersus)g(Searc)o(h)23 +b Fs(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(158)335 1751 y(7.5)50 b(In)o(ternal)15 b(Statistics)24 b +Fs(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) +g(:)h Ft(160)335 1809 y(7.6)50 b(Summary)14 b(of)i(P)o(erformance)e +Fs(:)24 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(162)262 1916 y Fu(8)45 b(Conclusion)1007 b(164)335 1974 +y Ft(8.1)50 b(Review)18 b Fs(:)25 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(164)335 2032 y(8.2)50 b(Ac)o(hiev)o(em)o(e)o(n)o(ts)33 b +Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)h(:)f(:)g(:)h Ft(166)335 2090 y(8.3)50 b(Implications)14 +b(and)j(F)l(uture)f(Prosp)q(ects)e Fs(:)24 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f +(:)g(:)h Ft(168)262 2197 y Fu(A)31 b(Glossary)1063 b(175)262 +2304 y(B)33 b(Pseudo)19 b(F)-5 b(unctions)844 b(176)262 2411 +y(C)33 b(Time)16 b(Allo)r(cation)i(Graphs)681 b(202)967 2574 +y Fp(5)p eop +%%Page: 6 8 +6 7 bop 262 307 a Fu(D)30 b(Bratk)n(o-Kop)r(ec)17 b(T)-5 b(est)18 +b(P)n(ositions)572 b(208)262 414 y(E)36 b(T)-5 b(est)18 b(Games)f(Pla)n(y)n +(ed)805 b(221)335 472 y Ft(E.1)41 b(HIAR)o(CS)15 b(5.0)h(v)o(ersus)g +(Mephisto)g(Exclusiv)o(e)21 b Fs(:)k(:)f(:)h(:)f(:)h(:)f(:)g(:)h +Ft(222)447 530 y(E.1.1)47 b(Game)15 b(1)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:) +h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(222)447 +588 y(E.1.2)47 b(Game)15 b(2)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(223)447 +647 y(E.1.3)47 b(Game)15 b(3)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(224)447 +705 y(E.1.4)47 b(Game)15 b(4)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(225)447 +763 y(E.1.5)47 b(Game)15 b(5)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(226)447 +821 y(E.1.6)47 b(Game)15 b(6)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(227)335 +879 y(E.2)41 b(HIAR)o(CS)15 b(5.0)h(v)o(ersus)g(Mark)g(Uniac)o(k)o(e)21 +b Fs(:)j(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(228)447 +937 y(E.2.1)47 b(Game)15 b(1)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(228)447 +995 y(E.2.2)47 b(Game)15 b(2)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(229)335 +1053 y(E.3)41 b(HIAR)o(CS)15 b(5.0)h(v)o(ersus)g(NOKNO)o(W)45 +b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(231)447 +1111 y(E.3.1)47 b(Game)15 b(1)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(231)447 +1170 y(E.3.2)47 b(Game)15 b(2)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(233)447 +1228 y(E.3.3)47 b(Game)15 b(3)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(234)447 +1286 y(E.3.4)47 b(Game)15 b(4)44 b Fs(:)25 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g +(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h Ft(235)967 +2574 y Fp(6)p eop +%%Page: 7 9 +7 8 bop 262 654 a Fn(Chapter)34 b(1)262 897 y Fo(In)m(tro)s(duction)262 +1148 y Fp(Chess)14 b(is)g(an)g(extraordinary)f(game.)k(The)d(rules)g(are)g +(clearly)g(de\014ned)h(and)e(quite)h(simple)262 1198 y(to)j(learn,)h(y)o(et)g +(the)g(game)e(is)h(so)h(complex)e(it)h(has)h(c)o(hallenged)f(mankind)f(for)h +(cen)o(turies)262 1248 y(and)f(is)g(still)g(as)h(ric)o(h)f(and)h(v)n(aried)f +(as)h(ev)o(er.)27 b(Suc)o(h)17 b(an)f(enormous)g(amoun)o(t)f(of)h(material) +262 1298 y(has)11 b(b)q(een)i(written)f(ab)q(out)g(the)g(game)f(that)g(there) +j(are)e(more)e(b)q(o)q(oks)i(written)g(ab)q(out)g(c)o(hess)262 +1347 y(than)j(all)f(other)j(games)d(put)i(together.)24 b(The)16 +b(game)e(app)q(eals)i(to)f(all)f(ages)i(and)g(abilities)262 +1397 y(from)c(b)q(eginner)i(to)g(exp)q(ert.)365 1480 y("Chess)d(is)f(a)g(sea) +g(in)g(whic)o(h)f(a)h(gnat)g(ma)o(y)e(drink)h(or)h(an)g(elephan)o(t)g(ma)o(y) +e(bathe.")1319 1547 y Fm(Indian)k(pr)n(overb.)324 1665 y Fp(Chess)18 +b(epitomises)e(man)o(y)e(of)i(the)i(problems)e(facing)f(the)j(\014eld)e(of)h +(arti\014cial)e(in)o(telli-)262 1715 y(gence,)j(that)f(of)g(the)h(storage,)g +(represen)o(tation,)h(retriev)n(al)e(and)g(application)f(of)h(kno)o(wl-)262 +1765 y(edge;)12 b(searc)o(hing)h(in\014nite)e(domains)f(and)i(problem)f +(solving)f(using)i(inexact)g(information.)262 1815 y(Chess)h(therefore)h(pro) +o(vides)f(an)f(almost)f(p)q(erfect)j(en)o(vironmen)o(t)e(in)g(whic)o(h)g(to)h +(exp)q(erimen)o(t)262 1864 y(with)e(new)g(ideas.)18 b(Unlik)o(e)10 +b(most)g(other)i(problem)e(domains,)g(progress)i(can)g(b)q(e)g(accurately)262 +1914 y(measured,)g(see)i([19)o(].)j(Ideas)c(can)g(easily)f(b)q(e)h(put)g(to)f +(the)i(test,)f(b)q(oth)g(against)f(h)o(uman)f(and)262 1964 +y(computer)g(opp)q(osition)f(in)h(comp)q(etition;)g(and)g(in)g(sp)q(ecially)g +(designed)i(exp)q(erimen)o(ts.)k(F)m(or)262 2014 y(these)c(reasons,)g(c)o +(hess)h(is)e(an)g(excellen)o(t)h(researc)o(h)i(en)o(vironmen)o(t)c(in)h(whic) +o(h)g(to)g(in)o(v)o(estigate)262 2064 y(h)o(uman)h(in)o(tellectual)j(skill)e +(and)i(arti\014cial)e(in)o(telligence.)23 b(In)16 b(fact,)f(winning)g(the)h +(h)o(uman)262 2114 y(w)o(orld)c(c)o(hess)k(c)o(hampionship)11 +b(w)o(as)j(de\014ned)g(as)g(one)g(of)f(the)h(fundamen)o(tal)d(aims)h(of)h +(arti\014-)262 2163 y(cial)g(in)o(telligence.)20 b(It)15 b(is)g(a)f(testimon) +o(y)f(to)i(the)g(problem's)e(complexit)o(y)g(that)i(after)g(more)262 +2213 y(than)e(fort)o(y)h(y)o(ears)g(of)g(concerted)h(e\013ort)g(this)f(aim)e +(is)h(still)g(far)h(from)e(b)q(eing)i(realised.)967 2574 y(7)p +eop +%%Page: 8 10 +8 9 bop 262 307 a Fr(1.1)69 b(A)23 b(Brief)f(History)262 434 +y Fp(On)12 b(Marc)o(h)h(9th)f(1949,)f(Claude)h(E)h(Shannon,)e(a)h(researc)o +(her)j(at)d(Bell)h(T)m(elephone)f(Lab)q(ora-)262 483 y(tories,)i(presen)o +(ted)j(a)d(pap)q(er)i(titled)e("Programming)d(a)j(Computer)g(for)g(Pla)o +(ying)g(Chess")262 533 y([53)o(].)21 b(This)15 b(w)o(as)g(the)h(\014rst)g +(pap)q(er)g(of)f(its)g(kind)f(and)h(ev)o(en)h(to)q(da)o(y)f(most)f(computer)h +(c)o(hess)262 583 y(programs)e(o)o(w)o(e)i(m)o(uc)o(h)e(to)i(Shannon's)g +(original)e(ideas.)21 b(Essen)o(tially)m(,)13 b(Shannon)i(put)g(for-)262 +633 y(w)o(ard)e(three)i(di\013eren)o(t)g(t)o(yp)q(es)g(of)e(program:)312 +709 y(1.)20 b(T)o(yp)q(e)d Fl(A)p Fp(:)f(A)h(program)d(that)j(do)q(es)g(a)f +(full)f(width)i(searc)o(h)g(to)g(a)f(giv)o(en)g(depth)h(and)365 +759 y(uses)e(a)f(simple)e(terminal)h(ev)n(aluation)f(function.)312 +839 y(2.)20 b(T)o(yp)q(e)e Fl(B)p Fp(:)f(A)h(program)e(that)h(do)q(es)i(a)e +(selectiv)o(e)i(searc)o(h)f(of)f(the)h(most)f(promising)365 +889 y(lines.)312 968 y(3.)j(T)o(yp)q(e)13 b Fl(C)p Fp(:)g(A)g(program)e(that) +h(is)h(goal)e(orien)o(ted,)i(although)f(little)g(detail)g(ab)q(out)h(this)365 +1018 y(approac)o(h)h(w)o(as)g(giv)o(en.)262 1095 y(Alan)j(T)m(uring)g(built)h +(further)h(on)f(some)f(of)h(these)h(ideas)g(and)f(in)f(1950)g(wrote)i(a)f +(pap)q(er)262 1144 y(ab)q(out)h(his)g(w)o(ork)h(on)f(computer)g(c)o(hess)i +(at)e(Manc)o(hester)j(Univ)o(ersit)o(y)d([60)o(].)35 b(Ho)o(w)o(ev)o(er,)262 +1194 y(Shannon's)17 b(ideas)g(w)o(ere)i(not)e(actually)g(incorp)q(orated)h +(in)o(to)f(a)g(c)o(hess)i(pla)o(ying)d(program)262 1244 y(un)o(til)d(1956)h +(when)i(a)e(Shannon)h(t)o(yp)q(e)g(A)g(program)e(w)o(as)i(dev)o(elop)q(ed)h +(at)e(the)i(Los)f(Alamos)262 1294 y(Scien)o(ti\014c)d(Lab)q(oratory)640 +1279 y Fk(1)658 1294 y Fp(.)18 b(In)12 b(1957,)e(Bernstein)k(and)e(Rob)q +(erts)g(wrote)h(a)e(t)o(yp)q(e)i(B)f(program)262 1344 y(for)j(the)h(IBM)g +(704)f([9)o(].)22 b(Most)16 b(notably)f(New)o(ell,)g(Simon)f(and)h(Sha)o(w)g +(wrote)i(a)e(Shannon)262 1393 y(t)o(yp)q(e)d(C)h(program)d(in)i(1958)f([42].) +17 b(This)12 b(w)o(as)g(the)h(\014rst)g(ev)o(er)g(practical)f(application)f +(of)h(the)262 1443 y(alpha-b)q(eta)f(algorithm.)k(A)e(n)o(um)o(b)q(er)e(of)h +(programs)f(follo)o(w)o(ed,)g(but)h(all)f(pla)o(y)o(ed)h(v)o(ery)h(p)q(o)q +(or)262 1493 y(c)o(hess.)25 b(Despite)16 b(this,)g(man)o(y)e(researc)o(hers) +19 b(in)c(the)h(\014eld)g(of)f(arti\014cial)g(in)o(telligence)h(w)o(ere)262 +1543 y(v)o(ery)e(con\014den)o(t)g(ab)q(out)g(the)h(p)q(oten)o(tial)e(of)g +(their)i(mac)o(hines.)365 1619 y("Within)d(10)g(y)o(ears)h(a)g(digital)e +(computer)i(will)e(b)q(e)i(the)h(w)o(orld's)e(c)o(hess)i(c)o(ham-)365 +1669 y(pion,)f(unless)i(rules)f(bar)g(it)g(from)e(comp)q(etition")1088 +1734 y Fm(Herb)n(ert)h(Simon,)j(1957.)324 1846 y Fp(It)h(w)o(as)h(not)f(un)o +(til)g(1966)f(that)i(real)g(progress)g(w)o(as)g(made)e(b)o(y)h(Ric)o(hard)g +(Green)o(blatt)262 1895 y(at)g(MIT)g([23)o(].)27 b(His)17 b(program)f(MacHac) +o(k-6,)h(w)o(as)h(the)f(\014rst)h(program)e(whic)o(h)h(could)g(b)q(e)262 +1945 y(considered)g(to)g(pla)o(y)e("real)h(c)o(hess".)27 b(It)17 +b(pla)o(y)o(ed)e(in)h(v)n(arious)g(h)o(uman)f(tournamen)o(ts)h(and)262 +1995 y(established)e(p)q(erformance)f(ratings)h(in)f(the)h(1250)f(to)g(1640)g +(USCF)g(range.)19 b(This)13 b(is)h(quite)262 2045 y(an)f(ac)o(hiev)o(emen)o +(t,)g(particularly)g(when)h(one)h(considers)g(it)e(w)o(as)h(in)f(1966.)324 +2130 y(In)i(1968,)f(v)n(arious)h(AI)g(researc)o(hers,)j(encouraged)f(b)o(y)e +(Green)o(blatt's)g(progress)i(made)262 2180 y(a)f(2500)f(dollar)g(b)q(et)i +(with)f(Da)o(vid)f(Levy)m(,)h(an)g(In)o(ternational)g(Master,)h(that)g(a)f +(computer)262 2230 y(w)o(ould)g(b)q(e)j(able)e(to)g(b)q(eat)i(him)c(in)i(a)h +(matc)o(h)e(within)h(10)g(y)o(ears.)30 b(Encouraged)18 b(b)o(y)g(suc)o(h)262 +2280 y(activities)13 b(v)n(arious)g(scien)o(tists)h(from)e(the)i +(arti\014cial)f(in)o(telligence)g(\014eld)g(got)h(in)o(v)o(olv)o(ed)e(and)262 +2329 y(in)i(1970)g(the)h(\014rst)h(United)f(States)g(Computer)g(Chess)h +(Championship)c(w)o(as)j(held.)21 b(This)262 2379 y(ev)o(en)o(t)14 +b(has)g(con)o(tin)o(ued)g(to)g(b)q(e)g(held)g(ann)o(ually)f(to)g(the)i +(presen)o(t)g(da)o(y)m(.)p 262 2411 573 2 v 308 2437 a Fj(1)325 +2449 y Fi(only)10 b(dev)o(elop)q(ed)f(for)i(a)g(6x6)g(b)q(oard)f(with)i(no)f +(bishops.)967 2574 y Fp(8)p eop +%%Page: 9 11 +9 10 bop 324 307 a Fp(In)14 b(1974,)f(the)i(\014rst)h(W)m(orld)d(Computer)h +(Chess)h(Championship)e(w)o(as)h(held)g(in)g(Sto)q(c)o(k-)262 +357 y(holm.)25 b(This)17 b(ev)o(en)o(t)h(w)o(as)f(w)o(on)g(b)o(y)g(a)g +(Russian)g(program)e(called)i(Kaissa,)h(essen)o(tially)f(a)262 +407 y(Shannon)g(t)o(yp)q(e)h(A)g(program)e(with)i(n)o(umerous)f(enhancemen)o +(ts.)31 b(Kaissa's)17 b(rating)h(w)o(as)262 457 y(somewhere)c(in)f(the)i +(1500)e(to)h(1700)f(ELO)h(range;)g(impressiv)o(e)g(for)f(a)h(program,)e(but)i +(v)o(ery)262 506 y(lo)o(w)d(in)g(w)o(orld)h(c)o(hess)h(terms.)k(This)12 +b(compares)g(with)g(a)g(t)o(ypical)f(2500)g(ELO)h(Grandmaster)262 +556 y(rating,)g(ev)o(en)j(Da)o(vid)e(Levy)h(w)o(as)f(rated)i(at)f(ab)q(out)f +(2350)g(ELO.)324 641 y(In)i(1977,)f(real)h(progress)h(w)o(as)f(made)f(when)i +(Chess)g(4)p Fh(:)p Fp(5)e([4],)g(an)h(American)f(program)262 +691 y(written)d(at)g(the)h(North)o(w)o(estern)h(Univ)o(ersit)o(y)m(,)d(comp)q +(eted)i(in)e(the)i(Minnesota)f(Op)q(en)h(Chess)262 741 y(Championship)h(and)i +(w)o(on)g(the)g(ev)o(en)o(t)h(with)f(a)g(5-1)g(score.)23 b(This)16 +b(success)h(w)o(as)f(v)o(ery)f(sig-)262 791 y(ni\014can)o(t)h(b)q(ecause)i +(sev)o(eral)f(Exp)q(erts)h(and)e(Class)h("A")f(pla)o(y)o(ers)g(comp)q(eted.) +26 b(It)16 b(w)o(as)h(not)262 841 y(ac)o(hiev)o(ed)12 b(as)g(one)h(migh)o(t)d +(exp)q(ect)k(b)o(y)e(a)f(breakthrough)i(in)f(c)o(hess)i(algorithms,)9 +b(but)k(rather)262 891 y(through)h(the)i(use)g(of)e(one)h(of)f(the)i(latest)f +("sup)q(er-computers")g(-)g(a)g(CD)f(Cyb)q(er)i(170.)k(In-)262 +940 y(evitably)m(,)8 b(Chess)j(4)p Fh(:)p Fp(6)e(later)h(w)o(on)f(the)h +(triennial)f(W)m(orld)g(Computer)g(Chess)i(Championship)262 +990 y(with)i(a)h(p)q(erfect)h(4-0)e(score.)324 1075 y(In)j(Septem)o(b)q(er)i +(1978,)d(Chess)j(4)p Fh(:)p Fp(7)e(c)o(hallenged)g(Da)o(vid)g(Levy)h(for)f +(the)h(b)q(et)h(made)d(10)262 1125 y(y)o(ears)f(earlier,)g(the)g(program)e +(did)i(w)o(ell,)f(but)h(lost)f(b)o(y)h(a)g(score)h(of)e(3)1336 +1109 y Fk(1)p 1336 1116 17 2 v 1336 1140 a(2)1357 1125 y Fp(-1)1397 +1109 y Fk(1)p 1397 1116 V 1397 1140 a(2)1418 1125 y Fp(.)324 +1210 y(Programs)h(based)i(on)g(a)f(Shannon)g(t)o(yp)q(e)h(A)g(approac)o(h)f +(with)g(little)g(kno)o(wledge,)g(but)262 1260 y(v)o(ery)20 +b(fast)g(searc)o(hing)h(had)e(b)q(een)j(dominating)17 b("in)o(telligen)o(t")h +(selectiv)o(e)k(searc)o(hers)g(for)262 1310 y(some)14 b(5)g(y)o(ears.)22 +b(In)15 b(1978,)f(using)h(this)g(principle)g(of)f(fast)h(sp)q(eed)h(with)f +(little)f(kno)o(wledge,)262 1360 y(sp)q(ecial)f(c)o(hess)h(hardw)o(are)f(w)o +(as)g(designed)g(and)g(built)f(b)o(y)h(Ken)g(Thompson)f(and)h(Jo)q(e)g(Con-) +262 1410 y(don)i([14)o(].)24 b(The)16 b(program,)f(Belle,)h(from)e(Bell)i +(Lab)q(oratories,)g(running)g(on)f(this)h(sp)q(ecial)262 1460 +y(hardw)o(are)e(ended)h(up)f(winning)e(the)j(1980)e(W)m(orld)f(Computer)i +(Chess)h(Championship.)324 1545 y(By)f(1983,)f(the)i(strength)g(of)f(deep)h +(brute)g(force)f(searc)o(hers)j(w)o(as)d(further)h(emphasised)262 +1595 y(when)20 b(the)g(program)e(Cra)o(y)h(Blitz)g([31)o(],)h(running)g(on)f +(a)g(2)g(pro)q(cessor)j(Cra)o(y)d(XMP/48)262 1644 y(computer,)d(w)o(on)g(the) +h(4th)f(W)m(orld)f(Computer)h(Chess)h(Championship.)23 b(The)17 +b(follo)o(wing)262 1694 y(y)o(ear)h(an)g(exhibition)g(matc)o(h)f(w)o(as)h +(arranged)h(b)q(et)o(w)o(een)h(Cra)o(y)e(Blitz)g(and)g(Da)o(vid)f(Levy)m(.) +262 1744 y(In)j(the)g(matc)o(h,)g(Da)o(vid)f(Levy)h(crushed)i(the)f(mac)o +(hine)e(4-0.)36 b(This)20 b(clearly)g(indicated)262 1794 y(that)15 +b(although)g(the)h(mac)o(hine)e(w)o(as)h(of)g(master)g(strength)i(in)e(the)h +(realms)e(of)h(tactics,)i(its)262 1844 y(p)q(ositional)e(and)i(strategic)h +(pla)o(y)e(w)o(as)h(w)o(eak.)27 b(Cra)o(y)17 b(Blitz)g(retained)h(its)f(w)o +(orld)f(title)h(in)262 1893 y(1986.)324 1979 y(Curren)o(tly)11 +b(there)g(are)g(2)f(programs)f(of)h(in)o(ternational)f(master)h(strength)1456 +1964 y Fk(1)1476 1979 y Fp(,)h(Hitec)o(h)g(and)262 2029 y(Deep)16 +b(Though)o(t.)24 b(Both)17 b(Hitec)o(h)g(and)e(Deep)i(Though)o(t)f(run)g(on)g +(sp)q(ecial)g(purp)q(ose)i(hard-)262 2078 y(w)o(are)13 b(and)h(essen)o +(tially)g(p)q(erform)e(sophisticated)j(brute)f(force)h(searc)o(hes.)20 +b(Deep)14 b(Though)o(t)262 2128 y(is)g(clearly)h(the)g(strongest)h(of)e +(these)i(programs)d(with)i(an)f(o\016cial)g(rating)g(of)g(2551)f(USCF)262 +2178 y(whic)o(h)j(equates)i(to)e(appro)o(ximately)e(2450)i(ELO.)h(During)f +(Ma)o(y)g(1989,)g(Deep)h(Though)o(t)262 2228 y(demonstrated)d(this)g +(strength)i(b)o(y)e(winning)g(the)h(6th)f(W)m(orld)f(Computer)h(Chess)h +(Cham-)262 2278 y(pionship.)p 262 2312 573 2 v 308 2339 a Fj(1)325 +2351 y Fi(around)10 b(2400)g(ELO,)i(not)f(to)g(b)q(e)g(confused)e(with)j(a)f +(US)h(master)e(rating)g(of)h(2200)f(USCF)967 2574 y Fp(9)p +eop +%%Page: 10 12 +10 11 bop 324 307 a Fp(In)13 b(Octob)q(er)i(1989,)d(Deep)h(Though)o(t)g(c)o +(hallenged)g(Gary)g(Kasparo)o(v,)g(the)h(w)o(orld)e(c)o(hess)262 +357 y(c)o(hampion,)7 b(to)j(a)f(t)o(w)o(o)g(game)f(exhibition)g(matc)o(h.)15 +b(Kasparo)o(v)10 b(outpla)o(y)o(ed)f(the)h(mac)o(hine)e(not)262 +407 y(only)i(p)q(ositionally)m(,)f(but)j(more)f(surprisingly)g(tactically)m +(,)f(to)h(win)g(the)h(matc)o(h)f(2-0.)16 b(During)262 457 y(Decem)o(b)q(er)d +(1989,)f(Deep)h(Though)o(t)g(pla)o(y)o(ed)f(Da)o(vid)g(Levy)h(in)g(a)f(four)h +(game)e(matc)o(h.)17 b(Deep)262 506 y(Though)o(t)c(illustrated)h(its)g +(impressiv)o(e)f(abilit)o(y)f(b)o(y)i(winning)e(the)j(matc)o(h)e(4-0.)262 +679 y Fr(1.2)69 b(My)24 b(Bac)n(kground)262 805 y Fp(I)13 b(ha)o(v)o(e)g(b)q +(een)h(v)o(ery)f(in)o(terested)i(in)e(computer)g(c)o(hess)i(for)e(some)f +(considerable)i(time.)i(I)d(am)262 855 y(a)f(mem)o(b)q(er)g(of)g(the)i(In)o +(ternational)f(Computer)f(Chess)i(Asso)q(ciation)f(and)g(ha)o(v)o(e)g +(written)h(a)262 905 y(n)o(um)o(b)q(er)f(of)g(programs)g(using)g(b)q(oth)h +(selectiv)o(e)h(and)f(brute)h(force)f(searc)o(hing.)324 990 +y(In)f(August)g(1989,)e(I)i(en)o(tered)h(m)o(y)d(latest)i(program)f(HIAR)o +(CS)g(4.1)g(in)g(the)h(c)o(hess)i(tour-)262 1040 y(namen)o(t)f(of)h(the)i +(\014rst)f(ev)o(er)h Fm(Computer)f(Olympiad)p Fp(.)24 b(HIAR)o(CS)16 +b(came)f(a)g(clear)h(6th)g(with)262 1090 y(3)e(out)g(of)g(8)h(p)q(oin)o(ts.) +20 b(It)15 b(w)o(as)f(running)g(on)h(a)f(7Mhz)h(68000)e(pro)q(cessor,)k(slo)o +(w)o(er)d(hardw)o(are)262 1140 y(than)f(all)g(of)g(the)h(opp)q(osition,)f +(for)g(example)f(a)i Fm(Fidelity)g(Ele)n(ctr)n(onics)f Fp(en)o(try)h(from)e +(Miami)262 1190 y(ran)h(on)h(a)g(68030)e(at)i(44Mhz)g(with)f(25ns)h(1)g(Mb)g +(DRAM.)262 1362 y Fr(1.3)69 b(Aims)21 b(of)j(the)e(Pro)t(ject)262 +1489 y Fp(It)c(is)g(clear)h(to)f(me)f(that)h(curren)o(t)i(programs)d +(su\013er)j(from)c(a)i(ma)r(jor)f(w)o(eakness)i(in)f(the)262 +1538 y(p)q(ositional)d(and)h(strategic)i(area)e(of)g(c)o(hess.)28 +b(Belo)o(w)17 b(2000)e(ELO,)i(tactics)g(pla)o(y)f(a)g(ma)r(jor)262 +1588 y(role,)10 b(ho)o(w)o(ev)o(er,)h(ab)q(o)o(v)o(e)e(2000)g(ELO,)i +(tactical)e(abilit)o(y)g(b)q(ecomes)h(less)h(imp)q(ortan)o(t)d(and)i(go)q(o)q +(d)262 1638 y(p)q(ositional)h(sense)k(is)f(vital.)i(Curren)o(tly)m(,)d(the)h +(b)q(est)h(programs)d(are)i(m)o(uc)o(h)e(closer)i(to)f(w)o(orld)262 +1688 y(c)o(hampionship)f(strength)j(tactically)e(than)g(they)i(are)f(p)q +(ositionally)e(sp)q(eaking.)324 1773 y(In)18 b(m)o(y)f(pro)r(ject,)j(I)e +(will)f(giv)o(e)g(an)h(o)o(v)o(erview)g(of)g(the)h(sub)r(ject)h(and)e +(explain)f(v)n(arious)262 1823 y(tec)o(hniques)i(used)h(in)e(curren)o(t)i +(programs.)30 b(I)19 b(will)e(lo)q(ok)g(in)o(to)h(w)o(a)o(ys)g(of)g(dev)o +(eloping)g(an)262 1873 y(ev)n(aluation)13 b(function)i(that)g(displa)o(ys)f +(the)h(p)q(ositional)f(abilit)o(y)f(of)i(an)f(exp)q(ert)j(lev)o(el)d(c)o +(hess)262 1923 y(pla)o(y)o(er)f(\(appro)o(ximately)e(ELO)i(2000\).)k(I)d +(will)e(also)g(lo)q(ok)h(in)o(to)f(fresh)j(w)o(a)o(ys)e(of)f(impro)o(ving)262 +1972 y(the)20 b(tactical)f(strength)h(of)f(a)g(c)o(hess)i(program.)33 +b(This)19 b(is)h(particularly)e(imp)q(ortan)o(t)g(for)262 2022 +y(programs)9 b(running)h(on)h(standard)g(micropro)q(cessors)h(whic)o(h)e(ob)o +(viously)g(cannot)h(comp)q(ete)262 2072 y(with)16 b(the)i(ra)o(w)f(sp)q(eed)h +(of)f(sp)q(ecial)g(purp)q(ose)h(hardw)o(are.)28 b(I)17 b(then)g(in)o(tend)h +(to)e(implemen)o(t)262 2122 y(certain)i(asp)q(ects)h(of)e(m)o(y)f(\014ndings) +h(in)g(a)h(c)o(hess)h(program)d(and)h(ev)n(aluate)g(them)g(against)262 +2172 y(b)q(oth)f(h)o(uman)e(and)i(computer)f(opp)q(osition.)24 +b(I)16 b(also)f(in)o(tend)h(to)g(use)h(the)g(Bratk)o(o-Kop)q(ec)262 +2221 y(exp)q(erimen)o(t)10 b([12)o(])f(to)i(test)g(the)g(relativ)o(e)f +(tactical)g(and)g(p)q(ositional)f(abilit)o(y)f(of)i(the)h(program.)324 +2307 y(The)h(reader)g(is)f(assumed)g(to)g(ha)o(v)o(e)h(a)f(reasonable)g(kno)o +(wledge)g(of)g(c)o(hess)i(and)e(algebraic)262 2357 y(c)o(hess)16 +b(notation)e(in)h(order)h(that)f(c)o(hess)h(concepts)h(can)e(b)q(e)h +(explained)f(to)f(a)h(high)g(enough)262 2406 y(lev)o(el.)957 +2574 y(10)p eop +%%Page: 11 13 +11 12 bop 262 619 a Fn(Chapter)34 b(2)262 826 y Fo(Basic)40 +b(Ov)m(erview)262 1042 y Fp(In)11 b(later)g(c)o(hapters)h(of)f(this)g(rep)q +(ort)h(I)f(will)e(explain)i(and)g(put)g(forw)o(ard)g(complex)e(ideas)j(con-) +262 1092 y(cerning)g(v)n(arious)e(asp)q(ects)j(of)e(computer)h(c)o(hess.)18 +b(In)12 b(order)g(to)f(help)h(the)g(reader)h(cop)q(e)f(with)262 +1142 y(these)i(ideas,)e(this)h(c)o(hapter)h(will)d(giv)o(e)h(a)h(basic)g(o)o +(v)o(erview)f(of)g(v)n(arious)g(tec)o(hniques)i(used)g(in)262 +1191 y(a)h(con)o(v)o(en)o(tional)f(c)o(hess)j(program.)k(I)16 +b(w)o(ould)e(also)h(advise)h(the)g(reader)h(to)e(follo)o(w)e(up)j(the)262 +1241 y(references)h(giv)o(en)e(for)f(a)h(more)e(complete)i(explanation)e(of)i +(the)g(tec)o(hniques)h(men)o(tioned,)262 1291 y(as)d(this)h(c)o(hapter)h(is)f +(b)o(y)g(no)f(means)g(in)o(tended)i(to)f(co)o(v)o(er)g(all)f(areas)h(in)g +(detail.)262 1427 y Fr(2.1)69 b(Mac)n(hine)22 b(Represen)n(tation)262 +1554 y Fp(A)c(vital)f(elemen)o(t)g(of)h(an)o(y)g(c)o(hess)i(program)c(is)i +(ho)o(w)g(the)h(c)o(hess)g(b)q(oard)g(and)f(pieces)h(are)262 +1603 y(represen)o(ted)d(in)e(the)g(mac)o(hine.)p 641 1697 673 +5 v 641 2361 5 665 v 646 1780 a Fg(0Z0Z0Z0Z)646 1863 y(Z0Z0Z0Z0)646 +1946 y(0Z0Z0Z0Z)646 2029 y(Z0Z0Z0Z0)646 2112 y(0Z0Z0Z0Z)646 +2195 y(Z0Z0Z0Z0)646 2278 y(0Z0Z0Z0Z)646 2361 y(Z0Z0Z0Z0)p 1310 +2361 V 641 2365 673 5 v 675 1749 a Fl(70)35 b(71)f(72)h(73)g(74)f(75)h(76)g +(77)675 1832 y(60)g(61)f(62)h(63)g(64)f(65)h(66)g(67)675 1914 +y(50)g(51)f(52)h(53)g(54)f(55)h(56)g(57)675 1997 y(40)g(41)f(42)h(43)g(44)f +(45)h(46)g(47)675 2080 y(30)g(31)f(32)h(33)g(34)f(35)h(36)g(37)675 +2163 y(20)g(21)f(22)h(23)g(24)f(25)h(26)g(27)675 2246 y(10)g(11)f(12)h(13)g +(14)f(15)h(16)g(17)675 2329 y(00)g(01)f(02)h(03)g(04)f(05)h(06)g(07)500 +2449 y Fp(Figure)14 b(2.1:)j(A)d(Chess)h(Board)f(indexed)h(b)o(y)e +(Co-ordinates.)957 2574 y(11)p eop +%%Page: 12 14 +12 13 bop 262 307 a Fp(Claude)16 b(Shannon)h(suggested)i(in)e(his)g(famous)e +(1949)h(pap)q(er)i([53)o(],)f(that)g(a)g(c)o(hess)i(b)q(oard)262 +357 y(could)f(b)q(e)i(represen)o(ted)h(in)e(64)f(b)o(ytes,)j(one)e(for)f(eac) +o(h)i(square)f(on)g(the)h(b)q(oard.)33 b(It)19 b(w)o(as)262 +407 y(prop)q(osed)13 b(that)f(eac)o(h)h(square)h(could)e(b)q(e)h(addressed)h +(b)o(y)e(the)h(co-ordinate)g(sc)o(heme)g(sho)o(wn)262 457 y(in)f(\014gure)i +(2.1.)j(Eac)o(h)d(square)g(also)e(had)h(an)g(asso)q(ciated)h(co)q(de)g(whic)o +(h)g(iden)o(ti\014es)f(the)h(t)o(yp)q(e)262 506 y(of)f(piece)i(\(if)e(an)o +(y\))h(o)q(ccup)o(ying)g(that)g(square.)20 b(The)14 b(suggested)i(piece)f(co) +q(des)g(can)g(b)q(e)f(seen)262 556 y(in)f(\014gure)h(2.2.)p +691 644 574 2 v 690 694 2 50 v 716 679 a Fm(Oc)n(cupie)n(d)h(by)p +956 694 V 50 w(White)p 1114 694 V 50 w(Black)p 1263 694 V 691 +695 574 2 v 690 743 2 50 v 716 729 a Fp(Empt)o(y)d(Sq)p 956 +743 V 129 w(0)p 1114 743 V 132 w(0)p 1263 743 V 691 745 574 +2 v 690 793 2 50 v 716 778 a(P)o(a)o(wn)p 956 793 V 210 w(1)p +1114 793 V 125 w(-1)p 1263 793 V 691 795 574 2 v 690 843 2 +50 v 716 828 a(Knigh)o(t)p 956 843 V 184 w(2)p 1114 843 V 125 +w(-2)p 1263 843 V 691 845 574 2 v 690 893 2 50 v 716 878 a(Bishop)p +956 893 V 186 w(3)p 1114 893 V 125 w(-3)p 1263 893 V 691 895 +574 2 v 690 943 2 50 v 716 928 a(Ro)q(ok)p 956 943 V 214 w(4)p +1114 943 V 125 w(-4)p 1263 943 V 691 944 574 2 v 690 993 2 +50 v 716 978 a(Queen)p 956 993 V 196 w(5)p 1114 993 V 125 w(-5)p +1263 993 V 691 994 574 2 v 690 1042 2 50 v 716 1027 a(King)p +956 1042 V 222 w(6)p 1114 1042 V 125 w(-6)p 1263 1042 V 691 +1044 574 2 v 616 1149 a(Figure)i(2.2:)j(A)d(table)g(sho)o(wing)f(piece)i(co)q +(des)262 1273 y(This)20 b(metho)q(d)g(is)h(kno)o(wn)f(as)h(the)h("mailb)q(o)o +(x")17 b(represen)o(tation.)40 b(By)22 b(storing)e(one)h(of)262 +1322 y(these)g(co)q(des)h(in)e(eac)o(h)g(square's)h(address,)i(an)o(y)d(c)o +(hess)i(p)q(osition)d(can)i(b)q(e)g(represen)o(ted)262 1372 +y(successfully)m(.)d(The)13 b(op)q(ening)f(c)o(hess)j(p)q(osition,)c(enco)q +(ded)j(using)f(this)f(format)f(can)i(b)q(e)g(seen)262 1422 +y(in)g(\014gure)h(2.3.)p 641 1516 673 5 v 641 2180 5 665 v +646 1599 a Fg(0Z0Z0Z0Z)646 1682 y(Z0Z0Z0Z0)646 1765 y(0Z0Z0Z0Z)646 +1848 y(Z0Z0Z0Z0)646 1931 y(0Z0Z0Z0Z)646 2014 y(Z0Z0Z0Z0)646 +2097 y(0Z0Z0Z0Z)646 2180 y(Z0Z0Z0Z0)p 1310 2180 V 641 2184 +673 5 v 663 1572 a Ff(\000)p Fl(4)27 b Ff(\000)p Fl(2)f Ff(\000)p +Fl(3)h Ff(\000)p Fl(5)g Ff(\000)p Fl(6)f Ff(\000)p Fl(3)h Ff(\000)p +Fl(2)g Ff(\000)p Fl(4)663 1655 y Ff(\000)p Fl(1)g Ff(\000)p +Fl(1)f Ff(\000)p Fl(1)h Ff(\000)p Fl(1)g Ff(\000)p Fl(1)f Ff(\000)p +Fl(1)h Ff(\000)p Fl(1)g Ff(\000)p Fl(1)663 1738 y(0)59 b(0)f(0)h(0)g(0)f(0)h +(0)g(0)663 1821 y(0)g(0)f(0)h(0)g(0)f(0)h(0)g(0)663 1904 y(0)g(0)f(0)h(0)g(0) +f(0)h(0)g(0)663 1986 y(0)g(0)f(0)h(0)g(0)f(0)h(0)g(0)663 2069 +y(+1)22 b(+1)f(+1)h(+1)g(+1)f(+1)h(+1)g(+1)663 2152 y(+4)g(+2)f(+3)h(+5)g(+6) +f(+3)h(+2)g(+4)425 2276 y Fp(Figure)14 b(2.3:)j(Mailb)q(o)o(x)12 +b(Represen)o(tation)j(of)e(the)i(Op)q(ening)f(P)o(osition.)324 +2399 y(Most)d(implemen)o(tati)o(ons)d(of)i(the)i(mailb)q(o)o(x)c(idea)i +(actually)g(use)h(a)g(10)f(x)h(12)f(b)q(oard.)17 b(This)262 +2449 y(10)12 b(x)i(12)f(sc)o(heme)g(giv)o(es)h(a)f(2)g(square)h(edge)g +(around)g(the)g(b)q(oard,)f(eac)o(h)h('o\013)f(b)q(oard')g(square)957 +2574 y(12)p eop +%%Page: 13 15 +13 14 bop 262 307 a Fp(con)o(taining)16 b(a)h(co)q(de)h(whic)o(h)g(iden)o +(ti\014es)g(it)f(as)g(not)h(b)q(eing)f(on)h(the)g(con)o(v)o(en)o(tional)e(b)q +(oard.)262 357 y(This)11 b(is)h(done)g(in)f(order)h(to)g(detect)h(mo)o(v)o +(es)e(o\013)g(the)i(edge)f(of)f(the)h(b)q(oard)g(simply)e(b)o(y)h(testing)262 +407 y(the)i(co)q(de)i(of)d(the)i(square)g(b)q(eing)f(mo)o(v)o(ed)f(to.)18 +b(The)c(2)f(square)h(edge)g(is)f(necessary)i(to)e(allo)o(w)262 +457 y(for)g(knigh)o(t)g(mo)o(v)o(es.)324 542 y(A)18 b(generally)g(more)f +(e\016cien)o(t)i(metho)q(d)e(of)h(represen)o(ting)i(a)e(c)o(hess)h(b)q(oard)g +(w)o(as)f(\014rst)262 592 y(suggested)f(b)o(y)g(a)f(Russian)g(group)g(in)g +(1970)g([2)o(].)25 b(It)17 b(in)o(v)o(olv)o(es)e(using)i(64)f(bits,)g(1)h +(bit)f(p)q(er)262 641 y(square,)d(to)f(represen)o(t)j(a)e(single)f(piece)h +(of)f(information)e(ab)q(out)j(all)e(squares.)19 b(Eac)o(h)13 +b(64)f(bit)262 691 y(represen)o(tation)g(is)g(kno)o(wn)e(as)i(a)f(bitmap.)k +(A)d(bitmap)d(could,)i(for)g(example,)f(represen)o(t)k(all)262 +741 y(squares)f(o)q(ccupied)g(b)o(y)g(a)f(white)g(knigh)o(t.)17 +b(Bit\(s\))c(b)q(eing)g(set)g(corresp)q(onding)g(to)g(whatev)o(er)262 +791 y(squares)e(are)g(o)q(ccupied)g(b)o(y)f(white)h(knigh)o(ts.)16 +b(Using)11 b(12)e(suc)o(h)j(bitmaps,)d(6)h(for)g(white)g(pieces)262 +841 y(and)j(6)h(for)f(blac)o(k)h(pieces,)g(an)o(y)g(p)q(osition)f(can)h(b)q +(e)h(represen)o(ted.)262 1013 y Fr(2.2)69 b(Mo)n(v)n(e)24 b(Generation)262 +1140 y Fp(Using)14 b(a)g(10)g(x)h(12)f(mailb)q(o)o(x)d(represen)o(tation,)16 +b(mo)o(v)o(es)d(are)i(generated)h(b)o(y)e(doing)g(a)g(series)262 +1190 y(of)d(adds)h(and)g(tests.)19 b(F)m(or)12 b(example,)f(to)h(generate)h +(all)e(white)i(knigh)o(t)e(mo)o(v)o(es)g(from)f(a)i(giv)o(en)262 +1239 y(square)j(the)g(o\013sets:)20 b(+8,)15 b(+19,)f(+21,)g(+12,)g +Ff(\000)p Fp(8,)g Ff(\000)p Fp(19,)g Ff(\000)p Fp(21)g(and)g +Ff(\000)p Fp(12)h(m)o(ust)e(b)q(e)i(added)262 1289 y(to)e(the)i(knigh)o(t's)e +(original)f(lo)q(cation,)g(see)j(\014gure)g(2.4.)p 641 1383 +673 5 v 641 2047 5 665 v 646 1466 a Fg(0Z0Z0Z0Z)646 1549 y(Z0Z0Z0Z0)646 +1632 y(0Z0Z0Z0Z)646 1715 y(Z0Z0Z0Z0)646 1798 y(0Z0Z0Z0Z)646 +1881 y(Z0Z0M0Z0)646 1964 y(0Z0Z0Z0Z)646 2047 y(Z0Z0Z0Z0)p 1310 +2047 V 641 2051 673 5 v 899 1692 a Fl(+19)81 b(+21)817 1775 +y(+8)269 b(+12)817 1941 y Ff(\000)p Fl(12)250 b Ff(\000)p Fl(8)899 +2024 y Ff(\000)p Fl(21)86 b Ff(\000)p Fl(19)447 2151 y Fp(Figure)14 +b(2.4:)j(Mo)o(v)o(e)d(generation)g(of)f(knigh)o(t)h(mo)o(v)o(es)e(using)i +(o\013sets.)262 2277 y(Eac)o(h)g(of)f(these)i(p)q(oten)o(tial)f("to-squares") +g(m)o(ust)f(b)q(e)h(tested)i(for)d(2)h(p)q(ossibilities:)324 +2360 y Ff(\017)20 b Fp(Is)14 b(the)h(to-square)f(on)g(the)h(b)q(oard)e(?)324 +2443 y Ff(\017)20 b Fp(Is)14 b(the)h(to-square)f(uno)q(ccupied)h(b)o(y)f(a)g +(friendly)f(piece)i(?)957 2574 y(13)p eop +%%Page: 14 16 +14 15 bop 262 307 a Fp(If)9 b(b)q(oth)h(these)h(tests)g(pro)o(v)o(e)f(to)g(b) +q(e)g(true,)h(then)g(a)e(pseudo)i(legal)e(mo)o(v)o(e)f(has)i(b)q(een)h +(generated.)262 357 y(Note)i(that)g(this)g(do)q(es)h(not)e(determine)h +(whether)i(the)e(mo)o(v)o(e)e(actually)h(lea)o(v)o(es)h(the)h(king)e(in)262 +407 y(c)o(hec)o(k,)h(hence)h(it)e(is)h(called)g(pseudo)g(legal.)k(Nearly)12 +b(all)g(programs)f(lea)o(v)o(e)i(this)g(calculation)262 457 +y(un)o(til)h(a)h(more)f(con)o(v)o(enien)o(t)i(time.)21 b(As)15 +b(y)o(ou)g(can)h(see)g(this)g(metho)q(d)e(of)h(mo)o(v)o(e)e(generation)262 +506 y(is)g(quiet)h(simple.)324 592 y(Using)f(a)f(bitmap)g(represen)o(tation,) +i(mo)o(v)o(e)d(generation)j(is)e(m)o(uc)o(h)g(more)g(e\016cien)o(t)i(with)262 +641 y(resp)q(ect)h(to)f(time,)e(than)h(with)g(the)h(previous)g(metho)q(d.)j +(The)d(reason)h(for)e(this)g(adv)n(an)o(tage)262 691 y(lies)e(in)g(the)h +(fact)g(that)f(mo)o(v)o(es)f(are)i(generated)h(b)o(y)f(using)f(bit)o(wise)g +(logical)f(op)q(erations)i(suc)o(h)262 741 y(as)h("and",)g("or")h(and)f +("not".)324 826 y(In)k(order)h(for)g(this)f(metho)q(d)g(to)g(generate)i(all)d +(white)h(knigh)o(t)g(mo)o(v)o(es)f(from)g(a)h(giv)o(en)262 +876 y(square,)f(a)g(bitmap)e(needs)j(to)f(b)q(e)h(fetc)o(hed)g(whic)o(h)f +(represen)o(ts)i(all)d(mo)o(v)o(es)g(a)g(knigh)o(t)g(can)262 +926 y(mak)o(e)10 b(from)g(the)i(giv)o(en)f(square,)i(call)e(this)h(bitmap)e +(1.)17 b(Next,)12 b(a)f(bitmap)f(is)i(fetc)o(hed)h(whic)o(h)262 +976 y(represen)o(ts)19 b(the)e(lo)q(cation)f(of)h(all)e(friendly)h(pieces.)29 +b(This)16 b(bitmap)f(is)i(negated)g(and)g(the)262 1026 y(result)d(is)h +(logically)c(and-ed)k(with)f(bitmap)e(1.)19 b(The)14 b(result)h(is)f(a)g +(bit,)g(set)h(in)f(the)h(lo)q(cation)262 1075 y(of)g(ev)o(ery)i(pseudo-legal) +f(mo)o(v)o(e)e(p)q(ossible)j(b)o(y)f(a)g(white)g(knigh)o(t)g(from)e(the)j +(giv)o(en)e(original)262 1125 y(square.)324 1210 y(As)i(can)g(b)q(e)h(seen)g +(this)f(metho)q(d)f(is)h(extremely)g(fast.)27 b(It)17 b(do)q(es)g(ho)o(w)o +(ev)o(er,)h(use)g(m)o(uc)o(h)262 1260 y(more)11 b(memory)e(than)k(the)f +(mailb)q(o)o(x)e(based)i(metho)q(d)g(b)q(ecause)i(the)e(mo)o(v)o(es)f(of)h +(ev)o(ery)h(piece)262 1310 y(from)h(an)o(y)i(giv)o(en)g(square)h(m)o(ust)f(b) +q(e)h(pre-stored.)27 b(The)17 b(metho)q(d)f(also)g(relies)h(on)f(a)g(large) +262 1360 y(w)o(ord)d(size,)h(suc)o(h)g(as)f(64)g(bits.)18 b(Although)13 +b(it)g(is)g(still)g(feasible)g(with)g(a)g(16)g(or)g(32)g(bit)g(w)o(ord,)262 +1410 y(it)j(is)i(signi\014can)o(tly)e(less)i(e\016cien)o(t.)29 +b(Also)17 b(it)g(is)g(v)o(ery)g(imp)q(ortan)o(t)f(for)h(the)h(computer)f(to) +262 1460 y(ha)o(v)o(e)11 b(a)h(mac)o(hine)f(instruction)h(whic)o(h)g(can)h +(giv)o(e)e(the)i(lo)q(cation)e(of)g(the)i(\014rst)g(bit)f(set)g(in)g(an)o(y) +262 1509 y(w)o(ord;)18 b(without)f(this,)h(the)g(metho)q(d)e(ma)o(y)f(b)q(e)j +(to)q(o)g(ine\016cien)o(t.)28 b(F)m(or)17 b(a)g(more)f(complete)262 +1559 y(explanation)c(of)i(this)g(tec)o(hnique)g(see)i([15)o(].)324 +1644 y(In)10 b(b)q(oth)g(metho)q(ds)f(the)h(mo)o(v)o(es)f(of)g(v)o(ector)i +(pieces)g(suc)o(h)f(as)g(bishops,)h(ro)q(oks)f(and)f(queens)262 +1694 y(are)14 b(more)f(complex)g(to)h(generate.)20 b(P)o(a)o(wn)14 +b(mo)o(v)o(es)f(and)h(sp)q(ecial)g(mo)o(v)o(es)f(suc)o(h)i(as)f(castling)262 +1744 y(and)c(en-passan)o(t)g(are)h(also)f(more)f(complicated,)g(but)i(can)f +(still)f(b)q(e)i(generated)h(using)e(either)262 1794 y(represen)o(tation.)262 +1967 y Fr(2.3)69 b(Ev)l(aluation)23 b(F)-6 b(unctions)262 2093 +y Fp(Giv)o(en)11 b(that)h(mo)o(v)o(es)f(can)i(b)q(e)g(generated)g(ho)o(w)f +(can)h(the)f(relativ)o(e)g(merits)g(of)g(eac)o(h)g(mo)o(v)o(e)f(b)q(e)262 +2143 y(determined)i(?)18 b(That)c(is)g(the)g(purp)q(ose)h(of)f(the)g +Fm(Evaluation)i(F)m(unction)p Fp(.)324 2228 y(Shannon)f(prop)q(osed)g(that)g +(an)g(ev)n(aluation)f(function)g(should)h(tak)o(e)g(accoun)o(t)h(of)e(suc)o +(h)262 2278 y(features)j(as)f(material,)e(mobilit)o(y)m(,)f(p)q(osition)j(of) +f(pieces)j(and)e(pa)o(wn)g(structure.)27 b(Eac)o(h)16 b(of)262 +2328 y(these)21 b(factors)f(required)i(an)d(imp)q(ortance)h(w)o(eigh)o(ting)f +(to)h(b)q(e)g(asso)q(ciated)h(with)f(them.)262 2377 y(Eac)o(h)e(factor)g(w)o +(ould)f(then)i(b)q(e)f(v)n(alued)g(dep)q(ending)g(on)g(its)g(presence)j(or)d +(absence)h(in)f(a)262 2427 y(giv)o(en)11 b(p)q(osition,)h(and)g(the)h(asso)q +(ciated)g(w)o(eigh)o(tings)f(applied.)17 b(All)12 b(the)h(v)n(alues)f(could)g +(then)957 2574 y(14)p eop +%%Page: 15 17 +15 16 bop 262 307 a Fp(b)q(e)14 b(added)h(together)g(to)f(giv)o(e)g(a)f +(single)h(discrete)i(v)n(alue)e(for)g(the)g(p)q(osition.)k(The)d(mo)o(v)o(e)e +(or)262 357 y(series)j(of)e(mo)o(v)o(es)g(whic)o(h)h(pro)q(duce)i(the)e(most) +f(desirable)i(p)q(osition)e(from)f(the)j(ev)n(aluation)262 +407 y(function's)d(p)q(oin)o(t)g(of)h(view)f(can)h(then)h(b)q(e)g(c)o(hosen.) +324 492 y(Almost)9 b(all)g(ev)n(aluation)g(functions)h(use)i(material)c(as)j +(an)f(o)o(v)o(erriding)f(factor,)i(it)f(is)g(v)o(ery)262 542 +y(rare)k(for)f(ev)o(en)i(the)f(sum)f(of)g(all)f(other)j(factors)f(to)g +(exceed)h(the)f(v)n(alue)f(of)h(one)g(pa)o(wn.)j(The)262 592 +y(reason)11 b(for)g(this)f(is)h(that)g(b)q(ecause)i(the)e(p)q(ositional)f(v)n +(alues)g(are)i(so)f(crude,)h(if)e(material)f(w)o(ere)262 641 +y(to)15 b(b)q(e)h(giv)o(en)f(a)o(w)o(a)o(y)f(in)h(exc)o(hange)h(for)g(p)q +(ositional)e(comp)q(ensation,)g(the)i(mac)o(hine)e(w)o(ould)262 +691 y(more)c(than)h(lik)o(ely)f(lose)h(b)q(ecause)i(its)e(ev)n(aluation)f(of) +h(the)h(comp)q(ensation)e(w)o(as)h(inaccurate.)324 777 y(In)k(the)g(fort)o(y) +g(y)o(ears)h(since)f(Shannon's)g(pap)q(er,)h(man)o(y)d(additional)g(ev)n +(aluation)h(func-)262 826 y(tion)19 b(factors)h(ha)o(v)o(e)f(b)q(een)i +(suggested)g(and)e(built)g(up)q(on.)36 b(They)20 b(include)g(king)e(safet)o +(y)m(,)262 876 y(o)q(ccupation)e(of)g(w)o(eak)g(squares,)i(dev)o(elopmen)o +(t,)e(piece)i(exc)o(hange)f(term)f(etc.)27 b(Ho)o(w)o(ev)o(er,)262 +926 y(ev)o(en)16 b(to)q(da)o(y)f(v)o(ery)g(few)h(ev)n(aluation)e(functions)h +(w)o(ould)g(ev)o(en)h(consider)g(exc)o(hanging)f(ma-)262 976 +y(terial)e(for)h(other)g(factors)g(suc)o(h)h(as)f(activ)o(e)g(pla)o(y)m(.)324 +1061 y(In)c(programs)e(whic)o(h)i(searc)o(h)h(only)e(a)g(few)h(p)q(ositions,) +g(the)g(ev)n(aluation)f(function)g(can)h(b)q(e)262 1111 y(quite)15 +b(complex)e(and)i(time)f(consuming.)19 b(Ho)o(w)o(ev)o(er,)d(all)d +(successful)k(programs)d(searc)o(h)i(a)262 1161 y(large)d(n)o(um)o(b)q(er)f +(of)h(p)q(ositions)g(and)h(therefore)g(can)g(only)f(sp)q(end)h(a)f(small)f +(amoun)o(t)f(of)i(time)262 1210 y(ev)n(aluating)i(eac)o(h)j(p)q(osition.)28 +b(F)m(or)17 b(this)h(reason)f(man)o(y)f(of)h(the)h(originally)d(simple)g +(ideas)262 1260 y(ha)o(v)o(e)d(remained)g(to)g(the)h(presen)o(t)i(da)o(y)d +(in)g(most)f(programs.)17 b(Some)11 b(ev)n(aluation)h(functions)262 +1310 y(do)i(not)h(ev)o(en)h(ev)n(aluate)f(the)h(whole)f(p)q(osition,)f(but)h +(rather)h(the)g(v)n(alue)f(of)f(a)h(mo)o(v)o(e)e(itself.)262 +1360 y(This)g(do)q(es)h(not,)f(ho)o(w)o(ev)o(er,)h(consider)g(other)h(in)o +(teractions)f(that)f(a)h(mo)o(v)o(e)d(ma)o(y)h(ha)o(v)o(e)i(on)f(a)262 +1410 y(p)q(osition.)23 b(F)m(or)16 b(example,)e(a)i(knigh)o(t)f(that)h(mo)o +(v)o(es)f(rev)o(ealing)h(a)f(bishop)h(pin)g(of)f(a)h(queen)262 +1460 y(to)i(a)g(king.)31 b(The)18 b(T)m(ec)o(hnology)g(program)f([22)o(],)h +(is)g(an)g(extreme)h(example)e(whic)o(h)h(only)262 1509 y(ev)n(aluates)c +(material)e(during)i(its)g(searc)o(h.)20 b(A)14 b(one)h(ply)e(p)q(ositional)g +(v)n(alue)h(is)g(com)o(bined)f(at)262 1559 y(the)h(end)g(of)g(the)g(searc)o +(h)h(to)f(distinguish)f(b)q(et)o(w)o(een)j(mo)o(v)o(es)c(of)h(equal)h +(material)e(outcome.)324 1644 y(A)f(go)q(o)q(d)h(explanation)e(of)h(a)g(con)o +(v)o(en)o(tional)g(c)o(hess)i(ev)n(aluation)d(function)h(can)h(b)q(e)g(found) +262 1694 y(in)j([4)o(].)24 b(Ev)n(aluation)15 b(functions)h(will)e(b)q(e)j +(lo)q(ok)o(ed)f(at)f(in)h(m)o(uc)o(h)f(greater)i(detail)e(in)h(future)262 +1744 y(c)o(hapters.)262 1917 y Fr(2.4)69 b(Lo)r(ok)24 b(Ahead)262 +2043 y Fp(In)16 b(order)h(to)f(lo)q(ok)g(ahead)g(in)o(to)g(p)q(ossibilities)g +(whic)o(h)g(ma)o(y)e(dev)o(elop)j(in)f(the)h(game,)e(it)h(is)262 +2093 y(necessary)c(generate)g(what)f(is)g(called)f(a)h("Game)d(tree".)18 +b(A)11 b(game)e(tree)j(is)f(a)f(diagrammati)o(c)262 2143 y(represen)o(tation) +i(of)e(p)q(ossible)h(mo)o(v)o(e)e(sequences.)20 b(This)11 b(is)f(ac)o(hiev)o +(ed)h(b)o(y)g(generating)g(mo)o(v)o(es)262 2193 y(for)k(the)h(side)f(to)g +(pla)o(y)m(,)f(then)i(replies)g(for)f(the)h(opp)q(onen)o(t,)g(then)g(coun)o +(ter)g(replies)g(and)g(so)262 2242 y(on,)c(dep)q(ending)h(on)g(the)g(depth)h +(of)e(lo)q(ok)g(ahead)g(required.)19 b(Figure)13 b(2.5)f(sho)o(ws)h(a)f(p)q +(ossible)957 2574 y(15)p eop +%%Page: 16 18 +16 17 bop 262 307 a Fp(lo)q(ok)12 b(ahead)i(game)f(tree)i(from)d(the)j(op)q +(ening)e(c)o(hess)j(p)q(osition.)623 1489 y(Figure)e(2.5:)j(A)d(P)o(ossible)g +(lo)q(ok)f(ahead)h(tree.)324 1607 y(Strictly)i(sp)q(eaking)g(the)h(game)e +(tree)j(is)e(not)g(a)g(tree,)i(but)e(rather)i(a)e(directed)h(graph.)262 +1657 y(This)12 b(is)h(b)q(ecause)i(some)d(no)q(des)i(can)f(b)q(e)h(reac)o +(hed)g(through)f(di\013eren)o(t)h(paths,)f(kno)o(wn)g(as)g(a)262 +1707 y(transp)q(osition)i(of)f(mo)o(v)o(es.)20 b(F)m(or)15 +b(the)h(purp)q(ose)g(of)f(consistency)h(with)f(other)h(material)d(on)262 +1757 y(the)h(sub)r(ject)h(I)f(will)f(also)g(use)i(the)f(term)f(searc)o(h)i +(or)f(game)f(tree.)324 1842 y(There)i(are)f(a)g(n)o(um)o(b)q(er)f(of)g(w)o(a) +o(ys)h(the)g(game)f(tree)i(can)f(b)q(e)g(expanded)h(and)f(searc)o(hed:)324 +1925 y Ff(\017)20 b Fl(Depth)c(\014rst)g(searc)o(h)p Fp(:)k(The)15 +b(\014rst)h(branc)o(h)g(is)f(explored)h(to)f(the)h(required)g(depth)365 +1975 y(b)q(efore)k(the)f(mac)o(hine)e(starts)j(on)e(the)h(next)h(unexplored)f +(branc)o(h)g(one)g(lev)o(el)f(up.)365 2024 y(This)c(con)o(tin)o(ues)g(un)o +(til)g(all)e(no)q(des)j(ha)o(v)o(e)f(b)q(een)h(explored)f(to)g(the)g +(required)h(depth.)324 2107 y Ff(\017)20 b Fl(Breadth)d(\014rst)f(searc)o(h)p +Fp(:)21 b(All)15 b(no)q(des)i(at)e(one)h(lev)o(el)g(are)g(examined)e(b)q +(efore)j(pro-)365 2157 y(gressing)i(one)f(lev)o(el)g(do)o(wn)f(the)i(tree)g +(and)f(examining)d(all)i(no)q(des)i(at)e(that)h(lev)o(el.)365 +2207 y(This)c(con)o(tin)o(ues)g(un)o(til)g(all)e(no)q(des)j(ha)o(v)o(e)f(b)q +(een)h(explored)f(to)g(the)g(required)h(depth.)324 2290 y Ff(\017)20 +b Fl(Best)13 b(\014rst)f(searc)o(h)p Fp(:)j(A)o(t)d(eac)o(h)g(step)h(the)f +(most)e(promising)g(no)q(de)i(is)f(selected)i(from)365 2340 +y(all)h(the)h(no)q(des)g(generated)h(so)f(far)f(in)g(the)h(tree.)22 +b(New)15 b(no)q(des)g(are)g(then)g(generated)365 2390 y(from)g(the)i +(selected)h(no)q(de,)g(and)e(again,)f(the)i(most)f(promising)e(no)q(de)j(is)f +(selected.)365 2440 y(A)f(no)q(de)g(can)f(b)q(e)h(selected)h(as)f(most)e +(promising)f(no)i(matter)g(where)h(in)f(the)h(tree)h(it)957 +2574 y(16)p eop +%%Page: 17 19 +17 18 bop 365 307 a Fp(o)q(ccurs.)19 b(Also)12 b(no)q(des)h(previously)f +(searc)o(hed,)i(but)f(rejected)h(as)e(unpromising,)f(ma)o(y)365 +357 y(again)i(b)q(ecome)h(promising)d(and)j(b)q(e)h(re-searc)o(hed.)324 +440 y(Note)20 b(that)g(the)h(required)f(depth)h(will)d(b)q(e)j(the)f +(limiting)d(factor)j(for)f(the)i(breadth)262 490 y(\014rst)e(and)g(depth)h +(\014rst)g(searc)o(hes.)36 b(The)20 b(b)q(est)g(\014rst)g(searc)o(h)g(m)o +(ust)e(ha)o(v)o(e)h(some)g(w)o(a)o(y)f(of)262 540 y(terminating,)11 +b(although)i(depth)i(ma)o(y)d(not)h(b)q(e)i(the)f(limiting)d(factor.)324 +625 y(I)g(kno)o(w)g(of)f(no)h(activ)o(e)h(programs)e(whic)o(h)h(uses)h(the)g +(breadth)g(\014rst)g(searc)o(h.)19 b(Most)11 b(c)o(hess)262 +675 y(programs)i(use)i(a)f(mo)q(di\014ed)f(v)o(ersion)i(of)f(the)h(depth)g +(\014rst)g(searc)o(h.)21 b(These)15 b(mo)q(di\014cations)262 +725 y(will)10 b(b)q(e)i(explained)g(in)f(c)o(hapter)i(3.)k(The)12 +b(b)q(est)h(\014rst)f(pro)q(cedure)i(is)e(used)g(in)g(some)f(selectiv)o(e)262 +774 y(searc)o(h)20 b(programs.)35 b(Of)20 b(particular)f(in)o(terest)i(is)f +(the)g(B*)g(tree)h(searc)o(h)g(algorithm)c([6],)262 824 y(a)g(dev)o(elopmen)o +(t)g(of)g(the)h(b)q(est)h(\014rst)g(searc)o(h.)30 b(This)18 +b(algorithm)d(attempts)i(to)h(allo)o(w)e(for)262 874 y(uncertain)o(t)o(y)e +(to)g(b)q(e)g(expressed)i(in)e(the)g(searc)o(h)h(tree.)324 +959 y(The)20 b(searc)o(h)g(of)f(a)g(t)o(w)o(o-pla)o(y)o(er)g(game)f(tree)i +(can)g(b)q(e)g(ac)o(hiev)o(ed)g(b)o(y)f(the)h(use)g(of)f(the)262 +1009 y(minim)o(ax)11 b(pro)q(cedure.)20 b(This)14 b(is)g(based)h(on)f(the)g +(idea)g(that)g(t)o(w)o(o)g(pla)o(y)o(ers)g(exist,)g(Max)g(and)262 +1059 y(Min.)23 b(Max)16 b(c)o(ho)q(oses)h(mo)o(v)o(es)e(leading)g(to)h(high)f +(scores,)j(where)f(as)f(Min)g(c)o(ho)q(oses)h(mo)o(v)o(es)262 +1109 y(leading)10 b(to)i(lo)o(w)f(scores.)19 b(Max)12 b(and)f(Min)h(c)o(ho)q +(ose)g(mo)o(v)o(es)f(at)h(alternate)g(lev)o(els)g(of)f(the)i(tree,)262 +1158 y(o)q(dd)g(and)h(ev)o(en)h(resp)q(ectiv)o(ely)m(.)262 +1331 y Fr(2.5)69 b(Selectiv)n(e)20 b(Searc)n(hing)262 1458 +y Fp(It)13 b(has)g(b)q(een)i(sho)o(wn)e(b)o(y)g(de)h(Gro)q(ot)f([16)o(,)f +(17])h(that)g(there)h(are)g(on)f(a)o(v)o(erage)g(38)g(mo)o(v)o(es)f(in)h(a) +262 1507 y(giv)o(en)d(p)q(osition,)h(y)o(et)g(only)f(an)h(a)o(v)o(erage)g(of) +g(1.76)e(go)q(o)q(d)i(mo)o(v)o(es)1229 1492 y Fk(1)1257 1507 +y Fp(exist)h(in)f(eac)o(h)g(p)q(osition.)17 b(A)262 1557 y(h)o(uman)11 +b(c)o(hess)k(master's)d(searc)o(h)j(tree)f(t)o(ypically)e(in)o(v)o(olv)o(es)g +(a)h(total)g(of)g(around)g(35)f(mo)o(v)o(es;)262 1607 y(v)n(ariations)18 +b(are)i(explored)h(to)e(an)h(a)o(v)o(erage)g(depth)g(of)g(7)f(plies.)36 +b(It)20 b(is)g(clear)g(from)e(the)262 1657 y(researc)o(h)e(of)f(de)g(Gro)q +(ot)g(that)g(the)h(h)o(uman)d(c)o(hess)k(master)d(is)h(v)o(ery)g(e\016cien)o +(t)h(at)f(selecting)262 1707 y(mo)o(v)o(es)8 b(to)h(explore)h(further.)17 +b(It)10 b(therefore)h(seems)e(logical)f(to)h(program)f(a)i(computer)f(whic)o +(h)262 1756 y(selects)18 b(the)g(most)e(plausible)g(mo)o(v)o(es)g(to)g(b)q(e) +i(explored)f(next)h(from)d(those)j(a)o(v)n(ailable.)25 b(If)262 +1806 y(suc)o(h)18 b(a)g(program)e(had)i(a)g(selection)h(mec)o(hanism)c(as)j +(sophisticated)h(as)f(a)g(master's,)g(it)262 1856 y(w)o(ould)c(almost)f +(certainly)i(pla)o(y)f(at)g(master)h(lev)o(el)g(or)f(ab)q(o)o(v)o(e.)21 +b(This)15 b(metho)q(d)f(is)h(kno)o(w)g(as)262 1906 y Fm(Sele)n(ctive)f(Se)n +(ar)n(ching)g Fp(or)g(a)g(Shannon)g(t)o(yp)q(e)g(B/C)g(strategy)m(.)324 +1991 y(The)j(Green)o(blatt)f(program)f(w)o(as)i(the)g(\014rst)g(successful)h +('selectiv)o(e')f(searc)o(hing)g(c)o(hess)262 2041 y(program)12 +b(whic)o(h)j(could)f(pla)o(y)f(at)h(a)h(reasonable)f(lev)o(el.)20 +b(The)14 b(program)f(placed)i(limits)d(on)262 2091 y(the)i(n)o(um)o(b)q(er)f +(of)g(mo)o(v)o(es)f(whic)o(h)i(could)f(b)q(e)i(searc)o(hed)g(at)e(di\013eren) +o(t)i(depths.)k(The)14 b(n)o(um)o(b)q(er)262 2141 y(of)h(branc)o(hes)j +(explored)f(in)f(the)i(\014rst)f(5)f(plies)h(w)o(ere)g(as)g(follo)o(ws:)22 +b(15,)16 b(15,)g(9,)g(9,)h(7.)26 b(This)262 2190 y(tap)q(ering)11 +b(of)h(the)g(searc)o(h)h(mean)o(t)e(that)h(deep)q(er)h(searc)o(hes)h(w)o(ere) +f(p)q(ossible)f(when)g(compared)262 2240 y(with)k(the)i(full)e(width)h +(approac)o(h)h(at)f(the)h(time.)26 b(In)18 b(the)g(early)f(1970's,)f(Hans)i +(Berliner)262 2290 y(considered)c(v)o(ery)g(selectiv)o(e)h(searc)o(hing)f(as) +f(the)i(w)o(a)o(y)d(forw)o(ard)h(and)h(exp)q(ected)h(the)f(searc)o(h)262 +2340 y(tree)j(w)o(ould)d(con)o(tain)i(less)g(than)g(500)f(no)q(des.)24 +b(It)16 b(is)g(ironic)f(that)h(Hans)g(is)f(no)o(w)h(a)f(ma)r(jor)p +262 2374 573 2 v 308 2401 a Fj(1)325 2413 y Fi(Grandmaster)8 +b(standard)h(mo)o(v)o(es)957 2574 y Fp(17)p eop +%%Page: 18 20 +18 19 bop 262 307 a Fp(force)11 b(b)q(ehind)g(Hitec)o(h,)h(a)f(v)o(ery)g +(strong)g(brute)h(force)g(searc)o(hing)f(program)e(from)h(Carnegie-)262 +357 y(Mellon)j(Univ)o(ersit)o(y)m(.)324 442 y(The)21 b(b)q(est)h(attempt)e +(at)g(selectiv)o(e)i(searc)o(hing)f(w)o(as)f(made)g(b)o(y)g(Wilkins)f([61],)i +(who)262 492 y(pro)q(duced)14 b(a)f(kno)o(wledge)g(based)h(program,)d(P)m +(ARADISE.)i(The)g(program)f(p)q(erformed)h(at)262 542 y(the)h(exp)q(ert)h +(lev)o(el)f(in)f(the)i(relativ)o(ely)e(narro)o(w)h(domain)d(of)j(tactical)f +(problems.)324 627 y(All)e(the)h(attempts)g(to)f(create)j(a)d(go)q(o)q(d)h +(selectiv)o(e)h(searc)o(h)g(program)d(to)i(pla)o(y)e(the)j(whole)262 +677 y(game)j(ha)o(v)o(e)j(hit)f(problems.)30 b(This)18 b(is)g(b)q(ecause)i +(it)e(is)g(vital)g(to)g(include)g(all)f(imp)q(ortan)o(t)262 +727 y(mo)o(v)o(es)f(in)g(the)i(selectiv)o(e)h(searc)o(h,)g(as)e(an)o(y)g(mo)o +(v)o(es)f(not)h(selected)i(can)f(nev)o(er)g(b)q(e)g(pla)o(y)o(ed)262 +777 y(o)o(v)o(er)13 b(the)i(b)q(oard.)j(This)c(can)g(cause)h(serious)f +(tactical)g(threats)h(to)f(b)q(e)g(o)o(v)o(erlo)q(ok)o(ed.)324 +862 y(Some)c(mo)o(v)o(es)h(ma)o(y)e(not)j(app)q(ear)g(immediately)c +(plausible,)j(although)g(they)h(ma)o(y)e(turn)262 912 y(out)16 +b(to)h(b)q(e)g(v)o(ery)g(strong)g(some)e(mo)o(v)o(es)h(later.)26 +b(F)m(or)16 b(these)i(reasons)g(man)o(y)d(go)q(o)q(d)h(mo)o(v)o(es)262 +961 y(are)d(o)o(v)o(erlo)q(ok)o(ed)f(and)h(not)g(selected)i(b)o(y)e(a)f +(plausible)g(mo)o(v)o(e)g(generator.)18 b(These)d(problems)262 +1011 y(are)f(b)q(est)h(illustrated)f(b)o(y)f(some)g(examples.)p +641 1105 673 5 v 641 1769 5 665 v 646 1188 a Fg(rm0Z0skZ)646 +1271 y(o0l0mpop)646 1354 y(bo0ZpZ0Z)646 1437 y(Z0opO0Z0)646 +1520 y(PZ0O0Z0Z)646 1603 y(Z0OBZNZ0)646 1686 y(0ZPZ0OPO)646 +1769 y(S0AQJ0ZR)p 1310 1769 V 641 1773 673 5 v 659 1892 a Fp(Figure)h(2.6:)j +(White)d(to)f(pla)o(y)g(and)h(win.)324 2010 y(In)g(\014gure)i(2.6,)d(white)i +(can)f(pla)o(y)g(1.)20 b(Bxh7+)15 b(Kxh7)f(2.)20 b(Ng5+)15 +b(Kg8)f(3.)20 b(Qh5)15 b(leading)262 2060 y(to)j(mate.)31 b(The)20 +b(initial)c(mo)o(v)o(e)h(ma)o(y)g(ho)o(w)o(ev)o(er,)j(not)e(app)q(ear)i +(plausible)e(to)g(a)h(selectiv)o(e)262 2110 y(searc)o(h)13 +b(program)e(b)q(ecause)k(it)d(app)q(ears)h(to)g(lose)f(the)i(bishop)e(for)g +(a)h(pa)o(wn.)k(An)o(y)12 b(plausible)262 2159 y(mo)o(v)o(e)i(generator)i +(whic)o(h)g(did)f(consider)h(Bxh7+)g(plausible)f(w)o(ould)g(need)i(to)f +('recognise')262 2209 y(in)e(\014gure)i(2.7,)e(an)h(almost)f(iden)o(tical)g +(p)q(osition,)h(that)g(1.)22 b(Bxh7+)16 b(Kxh7)f(2.)22 b(Ng5+)15 +b(Kg8)262 2259 y(3.)i(Qh5)d(fails)f(to)h(3.)j(...)g(Bd3.)957 +2574 y(18)p eop +%%Page: 19 21 +19 20 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rm0Z0skZ)646 +482 y(o0l0mpop)646 565 y(bo0ZpZ0Z)646 648 y(Z0opO0Z0)646 731 +y(PZ0O0Z0Z)646 814 y(Z0OBZNZ0)646 897 y(0O0Z0OPO)646 980 y(S0AQJ0ZR)p +1310 980 V 641 984 673 5 v 605 1101 a Fp(Figure)14 b(2.7:)j(White)c(to)h(pla) +o(y)m(,)e(no)i(forced)g(win.)324 1218 y(These)f(di\016culties)g(illustrate)f +(that)g(to)h(k)o(eep)g(the)g(branc)o(hing)f(factor)g(do)o(wn)g(the)h(plau-) +262 1268 y(sible)g(mo)o(v)o(e)f(generator)i(needs)h(to)e(b)q(e)h(v)o(ery)f +(selectiv)o(e,)i(while)d(not)i(excluding)f(k)o(ey)g(mo)o(v)o(es.)262 +1318 y(A)o(t)f(the)g(presen)o(t)i(time)c(w)o(e)i(do)g(not)g(ha)o(v)o(e)g(the) +g(capabilit)o(y)e(to)i(instill)f(enough)h(h)o(uman)e(c)o(hess)262 +1368 y(kno)o(wledge)j(in)o(to)g(a)h(program)e(to)i(mak)o(e)e(this)i(metho)q +(d)f(e\013ectiv)o(e)j(for)d(the)i(whole)e(game.)262 1540 y +Fr(2.6)69 b(F)-6 b(ull)22 b(Width)g(Searc)n(hing)262 1667 y +Fp(Instead)10 b(of)g(selecting)g(promising)e(lines)i(to)g(in)o(v)o(estigate)g +(further,)h(it)e(is)h(p)q(ossible)g(to)g(explore)262 1716 y(all)15 +b(mo)o(v)o(es)g(to)h(a)g(giv)o(en)f(depth.)26 b(This)16 b(Shannon)g(t)o(yp)q +(e)h(A)f(metho)q(d)g(is)g(kno)o(wn)g(as)g(a)g Fm(F)m(ul)r(l)262 +1766 y(Width)f(Se)n(ar)n(ch)f Fp(or)g(a)f Fm(Brute)i(F)m(or)n(c)n(e)f(Se)n +(ar)n(ch)p Fp(.)324 1851 y(This)f(metho)q(d)g(is)h(m)o(uc)o(h)e(easier)j(to)f +(implem)o(en)o(t)e(than)h(a)h(selectiv)o(e)h(searc)o(h.)k(Ho)o(w)o(ev)o(er,) +262 1901 y(in)g(order)i(for)f(pla)o(y)g(to)g(b)q(e)h(of)e(a)h(reasonable)h +(standard)g(a)f(relativ)o(ely)f(deep)i(searc)o(h)h(is)262 1951 +y(necessary)m(.)34 b(The)20 b(problem)d(here)j(is)f(that)g(the)h(n)o(um)o(b)q +(er)e(of)g(no)q(des)i(in)o(v)o(olv)o(ed)e(in)g(a)h(full)262 +2001 y(width)11 b(searc)o(h)i(gro)o(ws)e(exp)q(onen)o(tially)g(with)g(depth.) +18 b(In)12 b(a)f(tree)i(of)e(uniform)f(width)h(38,)g(the)262 +2051 y(searc)o(h)j(tree)h(will)d(con)o(tain)h(o)o(v)o(er)h(3)f(billion)f(no)q +(des)i(after)g(just)g(6)f(plies.)18 b(T)m(o)13 b(cut)h(do)o(wn)g(this)262 +2100 y(exp)q(onen)o(tial)c(explosion,)g(v)n(arious,)g(often)h(complicated)e +(tec)o(hniques)j(need)g(to)e(b)q(e)i(used.)18 b(In)262 2150 +y(fact,)c(a)g(go)q(o)q(d)g(full)f(width)h(searc)o(h)h(requires)h(man)o(y)c +(supp)q(ort)k(routines)f(to)f(enable)h(a)f(deep)262 2200 y(searc)o(h)h(to)f +(b)q(e)g(completed)g(in)g(a)g(reasonable)g(time)f(\(3)h(min)o(utes\).)k +(Using)c(the)g(tec)o(hniques)262 2250 y(curren)o(tly)g(a)o(v)n(ailable)c(it)j +(is)g(p)q(ossible)g(to)g(reduce)i(the)f(a)o(v)o(erage)f(branc)o(hing)g +(factor)g(of)f(a)h(full)262 2300 y(width)h(searc)o(h)i(from)d(38)i(to)g +(around)g(6)f(to)h(8)g(branc)o(hes.)22 b(This)15 b(is)g(ac)o(hiev)o(ed)g +(through)g(the)262 2350 y(use)f(of)g(bac)o(kw)o(ard)f(pruning)h(tec)o +(hniques)h(whic)o(h)f(will)e(b)q(e)j(explained)f(in)f(detail)g(in)h(a)g +(later)262 2399 y(c)o(hapter.)j(Some)10 b(selectiv)o(e)i(searc)o(h)g +(programs)d(actually)h(ha)o(v)o(e)h(a)f(branc)o(hing)h(factor)g(higher)262 +2449 y(than)j(8)g(e.g.)20 b(Green)o(blatt's)15 b(MacHac)o(k.)20 +b(In)15 b(suc)o(h)g(cases)h(a)f(full)e(width)h(searc)o(h)i(can)f(reac)o(h)957 +2574 y(19)p eop +%%Page: 20 22 +20 21 bop 262 307 a Fp(at)14 b(least)i(as)f(deep)h(as)f(the)h(selectiv)o(e)g +(searc)o(h,)g(without)f(an)o(y)g(of)f(the)i(p)q(ossible)f(dra)o(wbac)o(ks)262 +357 y(whic)o(h)e(w)o(ere)i(outlined)f(in)f(the)h(previous)h(section.)262 +530 y Fr(2.7)69 b(Quiescence)262 656 y Fp(A)19 b(p)q(osition)f(is)h +(considered)h Fm(Quiesc)n(ent)f Fp(if)f(it)g(is)h(quiet)g(\(inactiv)o(e\).)33 +b(A)19 b(quiet)g(p)q(osition)262 706 y(could)10 b(b)q(e)i(one)f(where)h(no)f +(imm)o(ediate)e(threats)j(exist.)17 b(It)11 b(is)g(v)o(ery)g(imp)q(ortan)o(t) +e(in)i(an)o(y)f(c)o(hess)262 756 y(program)k(to)h(determine)h(whether)h(a)f +(p)q(osition)f(is)g Fm(Quiesc)n(ent)h Fp(or)g(not,)f(b)q(efore)i(applying)262 +805 y(the)12 b(ev)n(aluation)f(function.)17 b(F)m(or)12 b(example,)f(it)h(w)o +(ould)f(b)q(e)i(wrong)f(to)g(apply)g(an)g(ev)n(aluation)262 +855 y(function)k(to)g(a)g(p)q(osition)g(where)i(a)e(capture)i(had)e(just)h +(tak)o(en)f(place)h(without)f(c)o(hec)o(king)262 905 y(if)f(a)h(piece)h(can)f +(b)q(e)h(recaptured.)26 b(P)o(ositions)16 b(can)h(also)e(b)q(e)i(un-quiescen) +o(t)g(on)f(p)q(ositional)262 955 y(grounds,)d(although)g(the)i(detection)g +(of)e(suc)o(h)i(p)q(ositions)f(is)f(far)h(more)f(complicated)g(than)262 +1005 y(for)g(quiescence)j(in)o(v)o(olving)c(tactics.)324 1090 +y(An)i(ev)n(aluation)f(function)h(should)g(only)g(b)q(e)g(applied)g(in)g +(quiescen)o(t)h(p)q(ositions.)k(Most)262 1140 y(curren)o(t)g(programs)d +(resolv)o(e)j(this)f(problem)e(of)h(quiescence)j(b)o(y)e(doing)f(what)g(is)h +(kno)o(wn)262 1190 y(as)c(a)g(quiescence)i(searc)o(h.)k(That)14 +b(is,)g(a)g(limited)e(searc)o(h)j(is)f(p)q(erformed)g(un)o(til)f(a)h +(quiescen)o(t)262 1239 y(p)q(osition)j(is)i(reac)o(hed.)33 +b(Only)19 b(at)f(that)h(stage)g(are)g(factors)g(suc)o(h)g(as)g(material)e +(balance)262 1289 y(ev)n(aluated.)h(In)c(principle)g(this)h(idea)f(is)g(an)g +(excellen)o(t)h(one.)k(Ho)o(w)o(ev)o(er,)14 b(in)g(practice)h(most)262 +1339 y(programs)e(only)h(p)q(erform)h(what)f(is)h(kno)o(wn)g(as)g(a)g +(capture)h(searc)o(h)g(at)f(horizon)f(no)q(des)i(of)262 1389 +y(their)d(main)e(searc)o(h)k(in)d(order)i(to)f(resolv)o(e)h(the)g(quiescence) +h(problem.)h(In)e(suc)o(h)g(a)e(capture)262 1439 y(searc)o(h)g(the)g(side)g +(to)f(mo)o(v)o(e)f(can)h(either)h(stop)g(the)g(searc)o(h)g(along)e(a)h(branc) +o(h)h(and)f(accept)i(the)262 1488 y(curren)o(t)i(ev)n(aluation)e(score)i(or)f +(mak)o(e)e(more)h(capture)j(mo)o(v)o(es.)h(When)d(no)g(captures)h(exist)262 +1538 y(for)j(the)i(side)g(to)f(mo)o(v)o(e,)f(the)i(p)q(osition)e(is)h +(considered)i(quiescen)o(t.)35 b(This)19 b("quiescence)262 +1588 y(searc)o(h")i(signi\014can)o(tly)e(impro)o(v)o(es)g(the)i(abilit)o(y)e +(of)h(the)h(c)o(hess)h(programs)d(that)h(use)h(it.)262 1638 +y(Ho)o(w)o(ev)o(er,)12 b(man)o(y)d(threats)k(can)f(b)q(e)g(o)o(v)o(erlo)q(ok) +o(ed)f(b)o(y)h(suc)o(h)g(a)g(searc)o(h,)g(for)g(example,)e(a)h(mo)o(v)o(e)262 +1688 y(forking)h(a)i(king)f(and)h(queen.)262 1860 y Fr(2.8)69 +b(Horizon)23 b(E\013ect)262 1987 y Fp(Chess)13 b(programs)e(t)o(ypically)f +(su\013er)j(from)e(what)h(is)g(kno)o(wn)f(as)h(the)h Fm(Horizon)g(E\013e)n +(ct)p Fp(.)18 b(This)262 2037 y(e\013ect)13 b(is)e(b)q(est)i(describ)q(ed)h +(using)d(an)g(example.)16 b(In)c(\014gure)g(2.8,)f(it)g(can)h(b)q(e)g(seen)h +(that)f(blac)o(k)262 2086 y(is)j(faced)i(with)e(the)i(certain)g(loss)f(of)f +(its)h(queen)h(for)f(at)g(most)f(a)g(white)h(ro)q(ok.)25 b(Ho)o(w)o(ev)o(er,) +262 2136 y(if)15 b(a)h(program)f(searc)o(hing)h(2)g(plies)h(w)o(ere)g(pla)o +(ying)d(blac)o(k)i(it)g(w)o(ould)g(think)f(it)h(could)g(sa)o(v)o(e)262 +2186 y(the)g(queen)h(b)o(y)e(pla)o(ying)f(Bxh2+.)24 b(This)16 +b(app)q(ears)h(to)e(the)i(program)d(to)h(sa)o(v)o(e)h(the)h(queen)262 +2236 y(b)q(ecause)e(its)f(loss)g(is)g(no)o(w)f(pushed)i(o)o(v)o(er)f(the)g +(program's)f(searc)o(h)i(horizon.)957 2574 y(20)p eop +%%Page: 21 23 +21 22 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZ0Z0skZ)646 +482 y(opZ0Zpop)646 565 y(0Z0apm0Z)646 648 y(Z0o0Z0Z0)646 731 +y(0Z0ZPZ0Z)646 814 y(ZPAPZ0Z0)646 897 y(qZPZBOPO)646 980 y(S0ZQZRJ0)p +1310 980 V 641 984 673 5 v 432 1102 a Fp(Figure)14 b(2.8:)j(Illustration)c +(of)h(the)g(Horizon)g(E\013ect,)h(Blac)o(k)f(to)f(Pla)o(y)m(.)324 +1221 y(This)g(horizon)g(e\013ect)i(is)f(particularly)e(prev)n(alen)o(t)i(in)f +(programs)f(whic)o(h)h(explore)h(v)n(ari-)262 1271 y(ations)k(to)g(a)g +(\014xed)h(depth.)32 b(This)19 b(is)f(b)q(ecause)i(mo)o(v)o(es)e(whic)o(h)g +(dela)o(y)g(the)h(loss)f(b)q(ey)o(ond)262 1320 y(the)f(depth)h(limit)c(are)j +(considered)i(go)q(o)q(d.)26 b(A)17 b(program)f(whic)o(h)g(can)i(extend)g +(its)e(searc)o(h)262 1370 y(depth)h(along)e(v)n(ariations)h(whic)o(h)g(lead)h +(to)f(non-quiescen)o(t)i(p)q(ositions)e(is)h(b)q(etter)h(able)f(to)262 +1420 y(a)o(v)o(oid)d(problems)h(caused)i(b)o(y)f(the)h(horizon)e(e\013ect.)27 +b(A)16 b(program's)e(abilit)o(y)g(to)i(minim)o(ise)262 1470 +y(the)f(horizon)h(e\013ect)h(is)e(therefore)i(largely)d(dep)q(enden)o(t)j(on) +e(its)h(de\014nition)f(of)f(quiescence)262 1520 y(and)f(ho)o(w)h +(non-quiescen)o(t)h(p)q(ositions)e(are)h(resolv)o(ed.)957 2574 +y(21)p eop +%%Page: 22 24 +22 23 bop 262 654 a Fn(Chapter)34 b(3)262 897 y Fo(Adv)-7 b(anced)39 +b(T)-10 b(opics)262 1148 y Fp(This)11 b(c)o(hapter)i(con)o(tains)f(b)q(oth)g +(an)f(explanation)g(and)g(review)i(of)e(some)g(of)g(the)h(tec)o(hniques)262 +1198 y(I)k(ha)o(v)o(e)h(researc)o(hed)i(during)e(m)o(y)e(in)o(v)o(estigation) +h(in)o(to)g(tactical)g(and)h(p)q(ositional)f(ev)n(alua-)262 +1248 y(tion.)26 b(Some)15 b(of)h(the)i(tec)o(hniques)g(represen)o(t)h(the)e +(state)h(of)e(the)h(art,)g(others)h(ha)o(v)o(e)e(b)q(een)262 +1298 y(rejected)h(b)o(y)e(the)h(computer)f(c)o(hess)i(comm)o(unit)o(y)12 +b(as)j(no)h(longer)f(b)q(eing)g(suitable.)22 b(These)262 1347 +y(older)11 b(tec)o(hniques)i(are)f(in)o(v)o(estigated)g(b)q(ecause)h(they)f +(ma)o(y)e(con)o(tain)h(ideas)h(relev)n(an)o(t)g(to)f(m)o(y)262 +1397 y(pro)r(ject,)i(and)f(ma)o(y)f(in)h(fact)h(still)f(b)q(e)h(useful)g +(when)g(com)o(bined)e(with)h(some)g(other)h(ideas)g(of)262 +1447 y(m)o(y)f(o)o(wn.)262 1620 y Fr(3.1)69 b(T)-6 b(ree)22 +b(Searc)n(hing)262 1746 y Fp(This)16 b(section)i(co)o(v)o(ers)g(tec)o +(hniques)g(for)e(searc)o(hing)h(the)h(game)d(tree.)28 b(The)18 +b(basic)f(alpha{)262 1796 y(b)q(eta)j(searc)o(h)g(algorithm)d(is)i(explained) +h(and)f(v)n(arious)g(enhancemen)o(ts)h(o)o(v)o(er)f(the)h(basic)262 +1846 y(algorithm)14 b(are)j(presen)o(ted.)28 b(These)18 b(bac)o(kw)o(ard)f +(pruning)f(algorithms)e(are)j(most)f(appli-)262 1896 y(cable)g(to)g(full)f +(width)h(searc)o(hing.)25 b(This)16 b(section)h(also)e(con)o(tains)h(a)g +(brief)g(description)h(of)262 1945 y(t)o(w)o(o)c(forw)o(ard)g(pruning)h(tec)o +(hniques)h(more)e(applicable)g(to)h(an)g(algorithmic)d(approac)o(h)j(to)262 +1995 y(selectiv)o(e)g(searc)o(hing.)262 2147 y Fu(3.1.1)55 +b(Alpha)19 b(Beta)f(Searc)n(h)h(Algorithm)262 2259 y Fp(In)11 +b(1958,)g(it)h(w)o(as)f(disco)o(v)o(ered)i([42)o(])f(that)g(large)f(sa)o +(vings)h(could)f(b)q(e)i(made)d(o)o(v)o(er)i(the)h(normal)262 +2309 y(minim)o(ax)f(pro)q(cedure)18 b(b)o(y)e(the)h(use)f(of)g(what)f(is)h +(no)o(w)g(kno)o(wn)f(as)h(the)h(Alpha-Beta)f(\()p Fh(\013\014)r +Fp(\))262 2359 y(searc)o(h)j(algorithm.)30 b(The)19 b Fh(\013\014)i +Fp(algorithm)16 b(uses)k(t)o(w)o(o)e(b)q(ounds,)i(a)e(lo)o(w)o(er)g(b)q(ound) +h(called)262 2408 y(alpha)d(and)h(an)g(upp)q(er)h(b)q(ound)f(called)g(b)q +(eta.)29 b(These)18 b(b)q(ounds)g(form)d(a)i(searc)o(h)h(windo)o(w)957 +2574 y(22)p eop +%%Page: 23 25 +23 24 bop 262 307 a Fp(within)18 b(whic)o(h)i(the)g(true)h(searc)o(h)g(tree)g +(v)n(alue)e(is)g(kno)o(wn)g(to)h(lie.)35 b(Kn)o(uth)20 b(and)f(Mo)q(ore)262 +357 y(giv)o(e)d(an)i(in)e(depth)j(analysis)d(of)h(this)g(bac)o(kw)o(ard)h +(pruning)f(algorithm)e(in)h([33)o(].)28 b(Figure)262 407 y(3.1)14 +b(illustrates)h(the)h(application)e(of)h(the)h Fh(\013\014)i +Fp(b)q(ounds.)23 b(The)16 b(\014gure)g(uses)g(the)g(negamax)262 +457 y(con)o(v)o(en)o(tion)d(where)j(eac)o(h)f(subtree)h(returns)g(its)e(v)n +(alue)f(negated.)20 b(This)14 b(allo)o(ws)f(eac)o(h)i(side)262 +506 y(to)g(maxim)o(ise)e(its)i(score)h(at)g(eac)o(h)f(lev)o(el)g(of)g(the)h +(tree,)g(simplifying)c(the)k(implemen)o(tation)262 556 y(of)d(the)h +(algorithm.)i Fh(\013)d Fp(and)h Fh(\014)i Fp(are)f(initially)c(set)k(to)f +Ff(\0001)f Fp(and)h(+)p Ff(1)g Fp(resp)q(ectiv)o(ely)m(.)557 +1447 y(Figure)g(3.1:)j(An)d(example)f(Negamax)f(Searc)o(h)j(tree.)324 +1542 y(In)e(the)h(\014gure,)f(no)q(des)h(C)g(and)f(D)g(are)g(searc)o(hed)i +(and)e(ev)n(aluated,)g(resulting)g(in)g(scores)262 1592 y(of)g +Ff(\000)p Fp(5)i(and)f Ff(\000)p Fp(2)h(resp)q(ectiv)o(ely)m(.)21 +b(Using)14 b(negamax)f(a)h(score)i(of)e(+2)h(is)f(bac)o(k)o(ed)h(up)g(to)f +(no)q(de)262 1642 y(B.)j(This)g(v)n(alue)g(then)i(replaces)f(the)h +Fh(\013)e Fp(v)n(alue)g(at)g(ply)g(1)g(b)q(ecause)j(it)d(is)g(larger)h(than)f +Fh(\013)p Fp(.)262 1691 y(No)q(de)d(F)f(is)h(then)g(searc)o(hed,)h(whic)o(h)f +(pro)q(duces)h(a)e(v)n(alue)g(of)g(+1.)18 b(This)c(v)n(alue)f(is)g(not)h +(large)262 1741 y(enough)f(to)f(a\013ect)i(the)g Fh(\013)e +Fp(v)n(alue)g(at)h(ply)f(1)h(ab)q(o)o(v)o(e.)k(Hence,)e(there)f(is)f(no)f +(reason)i(to)e(searc)o(h)262 1791 y(no)q(de)18 b(G)g(since)h(the)g(resulting) +f(v)n(alue)g(of)g(no)q(de)g(E)h(can)f(only)g(b)q(e)h Ff(\024)g(\000)p +Fp(1)f(\(negamaxed\).)262 1841 y(Therefore,)h(no)q(de)f(G)f(is)g(said)g(to)h +(b)q(e)g(cut)g(o\013)f(or)h(pruned)g(from)e(the)i(searc)o(h)h(tree.)30 +b(The)262 1891 y(negamax)12 b(approac)o(h)i(has)g(the)h(e\013ect)g(of)f +(making)d(all)i(cut)i(o\013s,)e Fh(\014)k Fp(cut)e(o\013s.)j(The)d(pseudo)262 +1940 y(co)q(de)f(for)g(the)g Fh(\013\014)i Fp(algorithm)c(can)i(b)q(e)g +(found)g(in)f(\014gure)i(3.2.)324 2026 y(The)10 b(normal)f(full)g(width)h +(minim)o(ax)d(pro)q(cedure,)12 b(applied)e(to)g(a)g(tree)h(of)f(uniform)e +(width)262 2075 y(W)15 b(and)h(depth)g(d,)g(w)o(ould)g(ha)o(v)o(e)f(to)h +(searc)o(h)h Fh(W)1020 2060 y Fe(d)1055 2075 y Fp(terminal)e(no)q(des.)25 +b(The)16 b Fh(\013\014)i Fp(algorithm)262 2125 y(under)13 b(optimal)e +(conditions)h(can)i(prune)g(a)e(tree)j(to)e(the)g(exten)o(t)h(that)f(only)g +(the)g(follo)o(wing)262 2175 y(terminal)f(no)q(des)i(need)h(to)f(b)q(e)g +(examined)f([13)o(]:)324 2248 y Ff(\017)20 b Fh(W)410 2233 +y Fk(\()p Fe(d)p Fk(+1\))p Fe(=)p Fk(2)540 2248 y Fp(+)10 b +Fh(W)627 2233 y Fk(\()p Fe(d)p Fd(\000)p Fk(1\))p Fe(=)p Fk(2)757 +2248 y Ff(\000)g Fp(1)k(at)f(o)q(dd)h(depths.)324 2326 y Ff(\017)20 +b Fp(2)9 b Ff(\001)g Fh(W)461 2311 y Fe(d=)p Fk(2)523 2326 +y Ff(\000)h Fp(1)j(at)h(ev)o(en)h(depths.)262 2399 y(This)g(is)h(kno)o(wn)f +(as)h(the)h(minim)o(al)12 b(searc)o(h)17 b(tree.)25 b(T)m(o)16 +b(ac)o(hiev)o(e)g(this)g(result,)g(most)f(mo)o(v)o(es)262 2449 +y(m)o(ust)10 b(b)q(e)h(searc)o(hed)i(in)e(a)g(descending)h(order)g(of)f +(merit.)16 b(Of)11 b(course)i(the)e(true)h(merit)e(of)h(an)o(y)957 +2574 y(23)p eop +%%Page: 24 26 +24 25 bop 262 503 a Fl(F)l(unction)11 b Fp(AlphaBeta\(P)j(:)g +Fl(p)q(osition)p Fp(;)c Fh(\013)p Fp(,)j Fh(\014)k Fp(:)h Fl(in)o(teger)p +Fp(\))11 b Fl(returns)j(in)o(teger)262 603 y(v)m(ar)321 653 +y Fp(m)82 b(:)18 b Fl(mo)o(v)o(e)321 702 y Fp(score,)321 752 +y(b)q(est)44 b(:)18 b Fl(in)o(teger)262 852 y(b)q(egin)321 +952 y(if)12 b Fp(\(T)m(erminal\(P\)\))446 b(/*)13 b Fm(Is)i(p)n(osition)g(P)g +(terminal)f(?)19 b Fp(*/)380 1001 y Fl(return)11 b Fp(\(Ev)n(aluate\(P)m(,)i +Fh(\013)p Fp(,)g Fh(\014)r Fp(\)\))189 b(/*)13 b Fm(R)n(eturn)i(sc)n(or)n(e)g +(at)f(le)n(af)h(no)n(des)f Fp(*/)321 1051 y Fl(endif)321 1151 +y Fp(GenerateMo)o(v)o(es\(P\))408 b(/*)13 b Fm(Gener)n(ate)i(al)r(l)f(moves)i +(in)e(p)n(osition)h(P)f Fp(*/)321 1201 y(b)q(est)h(:=)e Ff(\0001)524 +b Fp(/*)13 b Fm(b)n(est)i(move)g(sc)n(or)n(e)f(not)i(yet)e(known)h +Fp(*/)321 1250 y Fl(for)g(eac)o(h)g(mo)o(v)o(e)e Fp(m)f Fl(do)380 +1300 y Fp(/*)h Fm(Se)n(ar)n(ch)i(move)g(m)g(using)g(ne)n(gamax)h(c)n +(onvention)g(\(p)n(ar)n(ameters)e(r)n(everse)n(d\))f Fp(*/)380 +1350 y(score)i(:=)e Ff(\000)p Fp(AlphaBeta\()p Fh(P)810 1356 +y Fe(m)842 1350 y Fp(,)h Ff(\000)p Fh(\014)r Fp(,)g Ff(\000)p +Fl(max)p Fp(\()p Fh(\013)p Fp(,)g(b)q(est\)\))380 1400 y Fl(if)e +Fp(\(score)k Fh(>)e Fp(b)q(est\))439 1450 y(b)q(est)h(:=)e(score)391 +b(/*)13 b Fm(Stor)n(e)i(b)n(est)f(sc)n(or)n(e)h(found)f Fp(*/)439 +1499 y Fl(if)e Fp(\(b)q(est)k Ff(\025)11 b Fh(\014)r Fp(\))498 +1549 y Fl(return)g Fp(\(b)q(est\))315 b(/*)13 b Fh(\014)18 +b Fm(cut)d(o\013)g(:)k(r)n(eturn)14 b(b)n(est)h(sc)n(or)n(e)e +Fp(*/)439 1599 y Fl(endif)380 1649 y(endif)321 1699 y(endfor)321 +1798 y(return)e Fp(\(b)q(est\))492 b(/*)13 b Fm(R)n(eturn)i(sc)n(or)n(e)g(of) +f(b)n(est)h(move)g(found)g Fp(*/)262 1898 y Fl(end)d Fp(AlphaBeta)262 +2047 y(The)i Fl(max)p Fp(\()p Fh(\013)p Fp(,)f(b)q(est\))i(op)q(eration)f +(represen)o(ts)j(the)d('fail)e(soft')h(condition)h(whic)o(h)f(allo)o(ws)g +(the)262 2097 y(searc)o(h)i(at)e(eac)o(h)i(lev)o(el)e(to)h(return)h(the)g(b)q +(est)g(v)n(alue)e(found,)g(ev)o(en)h(if)f(this)h(is)g(less)h(than)f +Fh(\013)p Fp(.)552 2280 y(Figure)g(3.2:)j(Pseudo)d(co)q(de)h(for)f(the)g +Fh(\013\014)i Fp(Algorithm.)957 2574 y(24)p eop +%%Page: 25 27 +25 26 bop 262 307 a Fp(mo)o(v)o(e)12 b(is)j(not)f(kno)o(wn)g(b)q(efore)i(it)e +(is)g(searc)o(hed.)22 b(Therefore,)16 b(heuristics)g(m)o(ust)d(b)q(e)i(used)h +(to)262 357 y(ac)o(hiev)o(e)d(this)h(ordering.)k(In)13 b(practice)i(the)f +Fh(\013\014)i Fp(algorithm)11 b(searc)o(hes)16 b(a)d(tree)i(3)e(to)g(6)h +(times)262 407 y(larger)j(than)h(the)h(minim)o(al)14 b(tree)19 +b(b)q(ecause)h(of)d(sub{optimal)e(ordering.)30 b(Ho)o(w)o(ev)o(er,)19 +b(the)262 457 y(enormous)14 b(sa)o(vings)h(pro)q(duced)i(b)o(y)e(using)g(the) +h Fh(\013\014)i Fp(algorithm)13 b(are)j(suc)o(h)g(that)f(it)g(b)q(egins)262 +506 y(to)e(mak)o(e)g(full)f(width)i(searc)o(hing)g(a)g(plausible)f +(alternativ)o(e)h(to)f(selectiv)o(e)i(searc)o(hing.)262 656 +y Fu(3.1.2)55 b(Aspiration)18 b Fs(\013\014)k Fu(Searc)n(h)262 +768 y Fp(The)16 b(basic)g Fh(\013\014)j Fp(searc)o(h)e(is)f(carried)h(out)f +(with)g(initial)e Fh(\013\014)19 b Fp(v)n(alues)d(set)h(to)f +Ff(\0001)g Fp(and)g(+)p Ff(1)262 818 y Fp(resp)q(ectiv)o(ely)m(.)22 +b(The)15 b(aspiration)f Fh(\013\014)j Fp(searc)o(h)f(mak)o(es)e(assumptions)g +(ab)q(out)h(the)h(exp)q(ected)262 868 y(v)n(alue)d(of)i(the)g(searc)o(h)h +(tree.)21 b(The)15 b Fh(\013\014)i Fp(b)q(ounds)e(are)g(therefore)h +(initially)c(set)k(to)e(a)h(narro)o(w)262 917 y(windo)o(w)c(cen)o(tered)j +(around)d(the)i(exp)q(ected)h(searc)o(h)f(tree)g(v)n(alue,)e +Ff(\006)i Fp(a)e(pa)o(wn,)h(for)f(example.)324 1003 y(Unlik)o(e)j(the)i +(basic)f Fh(\013\014)i Fp(searc)o(h)f(whic)o(h)f(alw)o(a)o(ys)f(returns)i +(the)g(true)g(score)g(of)e(the)i(tree,)262 1053 y(an)d(aspiration)g +Fh(\013\014)j Fp(searc)o(h)f(can)g(pro)q(duce)g(3)e(p)q(ossible)h(outcomes:) +312 1126 y(1.)20 b Fl(A)f(true)e(score)p Fp(:)22 b(The)16 b(true)h(v)n(alue)f +(of)f(the)i(tree)g(lies)f(inside)g(the)h(searc)o(h)g(windo)o(w)365 +1176 y(and)d(w)o(as)g(therefore)h(found)f(b)o(y)f(the)i(searc)o(h.)312 +1254 y(2.)20 b Fl(A)c(fail)f(lo)o(w)p Fp(:)i(The)d(true)h(v)n(alue)e(of)g +(the)i(tree)g(is)f(smaller)e(than)i(the)g Fh(\013)g Fp(b)q(ound.)312 +1332 y(3.)20 b Fl(A)d(fail)d(high)p Fp(:)j(The)e(true)g(v)n(alue)e(of)h(the)h +(tree)g(is)f(larger)h(than,)e(or)i(equal)e(to,)h(the)h Fh(\014)365 +1382 y Fp(b)q(ound.)262 1455 y(In)i(case)i(1,)f(the)g(searc)o(h)h(has)f(b)q +(een)h(successful)g(b)q(ecause)g(the)g(b)q(est)f(mo)o(v)o(e)f(and)g(its)h +(true)262 1505 y(v)n(alue)12 b(has)g(b)q(een)i(found.)k(In)12 +b(cases)i(2)f(and)f(3)h(the)g(searc)o(h)h(has)f(failed)f(to)g(\014nd)h(a)g +(true)g(v)n(alue)262 1554 y(for)k(the)h(tree)g(b)q(ecause)h(of)e +Fh(\013\014)j Fp(cut)e(o\013s.)29 b(Ho)o(w)o(ev)o(er,)18 b(the)g(direction)f +(of)g(the)h(tree's)h(true)262 1604 y(v)n(alue)c(relativ)o(e)g(to)h(the)g +Fh(\013\014)i Fp(b)q(ounds)f(is)e(no)o(w)h(kno)o(wn.)23 b(When)16 +b(the)h(searc)o(h)g(fails)d(lo)o(w)h(the)262 1654 y(true)f(v)n(alue)e(is)h +(kno)o(wn)g(to)g(lie)f(in)h(the)h(range)f(\()p Ff(\0001)p Fp(,)p +Fh(\013)p Fp(\),)f(and)h(when)h(it)f(fails)f(high,)g(the)i(true)262 +1704 y(v)n(alue)g(will)h(lie)g(in)g(the)h(range)g(\()p Fh(\014)r +Fp(,+)p Ff(1)p Fp(\).)23 b(Using)16 b(the)g(appropriate)g(new)g(searc)o(h)g +(windo)o(w)262 1754 y(the)e(tree)h(m)o(ust)e(b)q(e)i(re-searc)o(hed)h(to)d +(\014nd)h(the)h(true)g(score.)324 1839 y(This)k(approac)o(h)h(can)g(pro)q +(duce)g(a)g(noticeably)f(faster)h(searc)o(h)h(than)e(the)i(basic)e +Fh(\013\014)262 1889 y Fp(algorithm)c(if)i(the)h(initial)e(windo)o(w)h(is)g +(w)o(ell)h(c)o(hosen.)30 b(It)18 b(can,)h(ho)o(w)o(ev)o(er,)f(also)f(pro)q +(duce)262 1939 y(a)e(slo)o(w)o(er)g(searc)o(h)i(if)d(the)i(v)n(alue)f(of)g +(the)h(tree)h(lies)e(outside)h(the)g(initial)d(windo)o(w,)h(as)i(a)f(re-)262 +1988 y(searc)o(h)h(will)e(b)q(e)i(necessary)m(.)25 b(In)15 +b(c)o(hess,)i(material)d(is)h(rarely)h(w)o(on)f(or)g(lost.)23 +b(Therefore,)17 b(a)262 2038 y(windo)o(w)10 b(of)h(a)g(couple)h(of)e(pa)o +(wns)i(width)f(will)f(only)g(fail)g(o)q(ccasionally)g(to)i(\014nd)f(a)g(true) +h(score)262 2088 y(at)j(the)i(\014rst)f(attempt,)f(making)f(this)i(tec)o +(hnique)g(generally)g(faster)g(than)g(the)g(basic)g Fh(\013\014)262 +2138 y Fp(algorithm.)262 2287 y Fu(3.1.3)55 b(Principle)17 +b(V)-5 b(ariation)19 b Fs(\013\014)i Fu(Searc)n(h)262 2399 +y Fp(The)16 b(aspiration)g Fh(\013\014)i Fp(searc)o(h)g(is)e(e\013ectiv)o(e)i +(b)q(ecause)f(the)g(reduced)h Fh(\013\014)h Fp(windo)o(w)c(cuts)j(o\013)262 +2449 y(n)o(umerous)13 b(subtrees)k(on)d(the)h(assumption)e(that)i(something)e +(b)q(etter)j(exists.)k(If)14 b(w)o(e)h(to)q(ok)957 2574 y(25)p +eop +%%Page: 26 28 +26 27 bop 262 307 a Fp(this)13 b(reduced)j(windo)o(w)d(idea)h(to)g(its)f +(limits)f(w)o(e)i(w)o(ould)f(ha)o(v)o(e)h(a)f(minima)o(l)e(windo)o(w.)324 +392 y(A)17 b(minim)o(al)c(windo)o(w)k(uses)h Fh(\013)f Fp(and)f +Fh(\014)k Fp(v)n(alues)d(set)h(so)f(close)g(together)h(that)g(no)e(tree)262 +442 y(v)n(alue)8 b(can)i(b)q(e)g(enclosed)h(within)e(the)h(windo)o(w.)16 +b(Therefore,)11 b(the)f Fh(\013\014)i Fp(searc)o(h)e(will)e(de\014nitely)262 +492 y(fail)13 b(lo)o(w)h(or)h(high)f(dep)q(ending)h(on)g(where)h(the)g(true)f +(score)h(lies)f(relativ)o(e)g(to)g(the)g(minim)o(al)262 542 +y(windo)o(w,)10 b(thereb)o(y)i(iden)o(tifying)d(in)i(whic)o(h)f(direction)i +(the)f(true)h(score)g(lies.)17 b(The)11 b Fl(P)p Fp(rinciple)262 +592 y Fl(V)p Fp(ariation)i Fh(\013\014)18 b Fl(S)p Fp(earc)o(h)d(\()p +Fl(PVS)p Fp(\))g(uses)h(this)f(idea)g(b)o(y)g(\014rst)h(doing)e(a)h(basic)g +Fh(\013\014)j Fp(searc)o(h)e(to)262 641 y(\014nd)e(the)i(true)f(v)n(alue)f +(of)g(the)i(principle)e(v)n(ariation.)19 b(All)14 b(subsequen)o(t)i(searc)o +(hes)h(are)e(then)262 691 y(done)d(with)g(a)g(minima)o(l)d(windo)o(w)j(cen)o +(tered)i(on)e(the)h(curren)o(t)h(v)n(alue)e(of)f(the)i(principle)g(line.)262 +741 y(This)h(w)o(orks)g(on)g(the)h(idea)f(that)h(it)f(is)g(m)o(uc)o(h)f +(easier)i(to)f(sho)o(w)g(that)h(a)f(subtree)i(is)e(inferior)262 +791 y(than)h(determine)g(its)g(true)h(v)n(alue.)22 b(Therefore,)16 +b(when)g(a)f(minim)o(al)d(windo)o(w)i(searc)o(h)j(fails)262 +841 y(lo)o(w,)i(the)g(mo)o(v)o(e)f(is)h(discarded)h(as)f(b)q(eing)g(w)o(orse) +h(than)f(the)h(mo)o(v)o(e)e(already)h(found.)33 b(If)262 891 +y(ho)o(w)o(ev)o(er,)18 b(it)g(fails)f(high,)h(it)f(m)o(ust)g(b)q(e)i +(re-searc)o(hed)h(with)e(a)g(windo)o(w)f(wide)h(enough)g(to)262 +940 y(encompass)13 b(the)i(true)f(score.)324 1026 y(Figure)g(3.3)f(sho)o(ws)i +(the)g(pseudo)g(co)q(de)g(for)e(the)i(PVS)g(algorithm.)h(The)f(pseudo)g(co)q +(de)262 1075 y(includes)h(Reinefeld's)g(depth)h Ff(\024)g Fp(2)f(enhancemen)o +(t)h([46)o(].)25 b(This)16 b(enhancemen)o(t)g(uses)i(the)262 +1125 y(fact)12 b(that)h(the)g('fail-soft')d(max)h(op)q(eration)i(allo)o(ws)f +(true)h(scores)i(rather)e(than)g Fh(\014)i Fp(v)n(alues)e(to)262 +1175 y(b)q(e)f(returned)i(from)d(the)i(last)f(2)g(plies)g(of)f(the)i(tree.)19 +b(Hence,)14 b(at)e(the)g(b)q(ottom)f(2)h(plies)g(of)g(the)262 +1225 y(tree,)i(re-searc)o(hes)j(are)d(unnecessary)m(.)957 2574 +y(26)p eop +%%Page: 27 29 +27 28 bop 262 342 a Fl(F)l(unction)11 b Fp(PVS\(P)k(:)e Fl(p)q(osition)p +Fp(;)d Fh(\013)p Fp(,)j Fh(\014)r Fp(,)h(depth)h(:)j Fl(in)o(teger)p +Fp(\))11 b Fl(returns)j(in)o(teger)262 442 y(v)m(ar)321 491 +y Fp(m)82 b(:)18 b Fl(mo)o(v)o(e)321 541 y Fp(score,)321 591 +y(b)q(est)44 b(:)18 b Fl(in)o(teger)262 691 y(b)q(egin)321 +790 y(if)12 b Fp(\(depth)j(=)f(0\))380 840 y Fl(return)d Fp(\(Ev)n(aluate\(P) +m(,)i Fh(\013)p Fp(,)g Fh(\014)r Fp(\)\))189 b(/*)13 b Fm(Evaluate)i(le)n(af) +g(no)n(de)f Fp(*/)321 890 y Fl(endif)321 990 y Fp(GenerateMo)o(v)o(es\(P\)) +408 b(/*)13 b Fm(Gener)n(ate)i(al)r(l)f(moves)i(in)e(p)n(osition)h(P)f +Fp(*/)321 1039 y(/*)f Fm(Se)n(ar)n(ch)i(principle)f(variation)h(to)g(next)g +(depth)h(using)f(ne)n(gamax)h(c)n(onvention)f Fp(*/)321 1089 +y(b)q(est)g(:=)e Ff(\000)p Fp(PVS\()p Fh(P)624 1095 y Fk(1)643 +1089 y Fp(,)h Ff(\000)p Fh(\014)r Fp(,)g Ff(\000)p Fh(\013)p +Fp(,)f(depth)p Ff(\000)p Fp(1\))321 1139 y Fl(if)f Fp(\(b)q(est)j +Ff(\025)g Fh(\014)r Fp(\))380 1189 y Fl(return)c Fp(\(b)q(est\))433 +b(/*)13 b Fh(\014)k Fm(cut)e(o\013)g(:)k(r)n(eturn)14 b(b)n(est)h(sc)n(or)n +(e)e Fp(*/)321 1239 y Fl(endif)321 1289 y(for)i(eac)o(h)g(mo)o(v)o(e)e +Fp(m)f Fl(do)380 1338 y Fh(\013)h Fp(:=)h Fl(max)p Fp(\(b)q(est,)h +Fh(\013)p Fp(\))339 b(/*)13 b Fm(A)o(l)r(low)h(fail)g(soft)f +Fp(*/)380 1388 y(/*)g Fm(Se)n(ar)n(ch)i(move)g(m)g(to)g(next)g(depth)h(using) +f(ne)n(gamax)h(c)n(onvention)f Fp(*/)380 1438 y(score)g(:=)e +Ff(\000)p Fp(PVS\()p Fh(P)698 1444 y Fe(m)730 1438 y Fp(,)h +Ff(\000)p Fh(\013)9 b Ff(\000)h Fp(1,)j Ff(\000)p Fh(\013)p +Fp(,)g(depth)p Ff(\000)p Fp(1\))380 1488 y Fl(if)f Fp(\(score)k +Fh(>)e Fp(b)q(est\))439 1538 y(/*)f Fm(R)n(e-se)n(ar)n(ch)i(only)g(if)f(sc)n +(or)n(e)h(is)f(within)h Fh(\013\014)i Fm(window)d(and)i(not)f(a)g(true)f +Fp(*/)439 1587 y(/*)f Fm(sc)n(or)n(e)i(r)n(eturne)n(d)f(fr)n(om)g(de)n(ep)n +(est)h(2)g(levels)g(\(R)n(einefeld's)f(enhanc)n(ement\))h Fp(*/)439 +1637 y Fl(if)d Fp(\(\()p Fh(\013)g(<)i Fp(score\))h Fl(and)e +Fp(\(score)j Fh(<)11 b(\014)r Fp(\))k Fl(and)e Fp(\(depth)i +Fh(>)f Fp(2\)\))498 1687 y(b)q(est)h(:=)e Ff(\000)p Fp(PVS\()p +Fh(P)801 1693 y Fe(m)833 1687 y Fh(;)7 b Ff(\000)p Fh(\014)r(;)g +Ff(\000)p Fp(score,)15 b(depth)p Ff(\000)p Fp(1\))439 1737 +y Fl(else)498 1787 y Fp(b)q(est)g(:=)e(score)439 1836 y Fl(endif)439 +1886 y(if)f Fp(\(b)q(est)k Ff(\025)11 b Fh(\014)r Fp(\))498 +1936 y Fl(return)g Fp(\(b)q(est\))315 b(/*)13 b Fh(\014)k Fm(cut)e(o\013)g(:) +k(r)n(eturn)14 b(b)n(est)h(sc)n(or)n(e)e Fp(*/)439 1986 y Fl(endif)380 +2036 y(endif)321 2086 y(endfor)321 2185 y(return)e Fp(\(b)q(est\))492 +b(/*)13 b Fm(R)n(eturn)i(sc)n(or)n(e)g(of)f(b)n(est)h(move)g(found)g +Fp(*/)262 2285 y Fl(end)d Fp(PVS)537 2467 y(Figure)i(3.3:)j(Pseudo)d(co)q(de) +h(for)f(the)g(PVS)g(Algorithm.)957 2574 y(27)p eop +%%Page: 28 30 +28 29 bop 262 307 a Fu(3.1.4)55 b(Iterativ)n(e)17 b(Deep)r(ening)262 +419 y Fp(Iterativ)o(e)11 b(deep)q(ening)h([4)o(])f(is)g(a)g(metho)q(d)f(of)h +(impro)o(ving)d(mo)o(v)o(e)h(ordering,)j(thereb)o(y)g(increas-)262 +469 y(ing)h Fh(\013\014)j Fp(cut)e(o\013s.)19 b(It)14 b(also)f(enables)h(the) +h(exp)q(ected)h(principle)e(v)n(ariation)e(to)i(b)q(e)g(primed.)324 +554 y(Iterativ)o(e)e(deep)q(ening)h(is)f(ac)o(hiev)o(ed)g(b)o(y)g(p)q +(erforming)e(a)i(series)h(of)e(searc)o(hes)j(to)e(progres-)262 +604 y(siv)o(ely)e(greater)h(depths)h(e.g.)17 b(1)10 b(ply)m(,)g(2)g(ply)m(,)g +(3)g(ply)g(etc.)18 b(After)12 b(eac)o(h)f(searc)o(h)h(the)f(1)f(ply)g(mo)o(v) +o(e)262 654 y(list)j(can)h(b)q(e)h(re-ordered)g(to)f(increase)h(the)g +(e\016ciency)f(of)g(the)g(subsequen)o(t)i(iterations.)324 739 +y(It)h(migh)o(t)e(b)q(e)j(though)o(t)f(that)h(doing)e(an)h(iterativ)o(e)g +(searc)o(h)i(to)e(4)g(ply)g(w)o(ould)f(b)q(e)i(less)262 789 +y(e\016cien)o(t)c(than)g(a)g(direct)h(4)e(ply)h(searc)o(h,)h(whic)o(h)f +(after)g(all)f(will)f(b)q(e)j(done)f(an)o(yw)o(a)o(y)f(as)h(part)262 +839 y(of)d(an)h(iterativ)o(e)g(searc)o(h.)19 b(Ho)o(w)o(ev)o(er,)12 +b(there)i(exists)f(n)o(umerous)e(tec)o(hniques)j(for)d(impro)o(ving)262 +889 y(the)16 b(sp)q(eed)i(of)e(eac)o(h)h(subsequen)o(t)h(iteration)e(b)o(y)g +(making)e(b)q(est)k(use)f(of)f(the)h(information)262 938 y(gained)d(so)h +(far.)20 b(These)c(tec)o(hniques)h(include)e(refutation)f(tables,)h(transp)q +(osition)g(tables,)262 988 y(the)e(history)h(heuristic)g(etc.)19 +b(These)14 b(tec)o(hniques)h(will)d(b)q(e)i(explained)f(in)g(detail)g(later.) +k(An)262 1038 y(iterativ)o(e)h(PVS)g(com)o(bined)f(with)h(some)g(of)f(the)i +(tec)o(hniques)h(men)o(tioned)d(can)h(pro)q(duce)262 1088 y(trees)d(v)o(ery)f +(close)h(to)e(the)i(minim)o(al)10 b(tree)15 b([40)o(].)324 +1173 y(An)j(iterativ)o(e)f(deep)q(ening)i Fh(\013\014)h Fp(searc)o(h)e(also)f +(has)h(another)g(imp)q(ortan)o(t)e(b)q(ene\014t;)k(the)262 +1223 y(b)q(est)f(mo)o(v)o(e)e(found)h(so)g(far)h(is)f(alw)o(a)o(ys)f(kno)o +(wn.)32 b(As)18 b(all)g(mo)o(v)o(es)f(are)i(searc)o(hed)h(at)e(eac)o(h)262 +1273 y(iteration,)d(this)g(mo)o(v)o(e)f(is)i(lik)o(ely)e(to)i(b)q(e)g +(reasonable.)24 b(Therefore,)16 b(if)f(the)i(a)o(v)n(ailable)c(time)262 +1323 y(expires,)h(the)g(b)q(est)h(mo)o(v)o(e)d(found)i(so)g(far)f(could)h(b)q +(e)g(pla)o(y)o(ed)f(with)h(con\014dence.)20 b(In)13 b(a)h(non{)262 +1372 y(iterativ)o(e)h(searc)o(h,)i(ho)o(w)o(ev)o(er,)f(if)f(the)h(time)f +(expires,)i(the)f(mo)o(v)o(e)e(selected)k(as)e(b)q(est)g(w)o(ould)262 +1422 y(dep)q(end)f(on)f(what)h(mo)o(v)o(es)e(had)h(b)q(een)h(searc)o(hed)h +(so)f(far.)k(If)14 b(only)g(p)q(o)q(or)g(mo)o(v)o(es)f(had)h(b)q(een)262 +1472 y(searc)o(hed,)j(only)e(a)h(p)q(o)q(or)g(mo)o(v)o(e)e(could)h(b)q(e)i(c) +o(hosen.)25 b(This)15 b(is)h(an)g(imp)q(ortan)o(t)e(b)q(ene\014t)j(for)262 +1522 y(comp)q(etitiv)o(e)12 b(c)o(hess)k(programs)c(b)q(ecause)k(they)e(m)o +(ust)f(con)o(trol)h(their)g(o)o(wn)g(time)e(usage.)262 1673 +y Fu(3.1.5)55 b(Mo)n(v)n(e)19 b(Ordering)262 1785 y Fp(As)g(stressed)i +(earlier,)e(the)g(order)h(in)e(whic)o(h)g(mo)o(v)o(es)g(are)h(examined)e(is)h +(critical)h(to)f(the)262 1835 y(e\016ciency)e(of)f Fh(\013\014)r +Fp(.)23 b(The)16 b(mo)o(v)o(es)e(from)g(eac)o(h)i(no)q(de)g(can)g(b)q(e)g +(ordered)h(using)e(a)g(v)n(ariet)o(y)g(of)262 1885 y(heuristics:)324 +1968 y Ff(\017)20 b Fp(An)f(iterativ)o(e)f(searc)o(h)h(is)f(a)g(go)q(o)q(d)g +(basis)g(for)g(impro)o(ving)d(mo)o(v)o(e)i(ordering)h(as)g(the)365 +2018 y(mo)o(v)o(es)12 b(at)g(the)h(ro)q(ot)g(of)f(the)h(tree)h(are)f +(directly)g(ordered)g(b)o(y)g(a)f(searc)o(h)i(to)e(a)h(depth)g(1)365 +2067 y(ply)f(less)h(than)f(the)h(curren)o(t)h(searc)o(h)g(depth.)k(As)13 +b(the)g(subtree)h(b)q(elo)o(w)e(mo)o(v)o(es)f(at)h(the)365 +2117 y(\014rst)17 b(ply)d(is)i(usually)e(larger)i(than)f(subtrees)j(at)d +(greater)h(depths,)h(mo)o(v)o(e)d(ordering)365 2167 y(at)g(ply)f(1)h(is)g +(lik)o(ely)e(to)i(ha)o(v)o(e)g(the)g(greatest)h(e\013ect)h(on)e(o)o(v)o +(erall)e(tree)j(size.)324 2250 y Ff(\017)20 b Fp(Storing)11 +b(mo)o(v)o(es)f(in)g(a)h(transp)q(osition)g(table)g(represen)o(ts)j(p)q +(erhaps)e(the)g(b)q(est)g(metho)q(d)365 2300 y(of)k(ordering)h(mo)o(v)o(es)e +(in)h(an)g(iterativ)o(e)h Fh(\013\014)i Fp(searc)o(h)e([18)o(].)26 +b(This)16 b(is)h(b)q(ecause)h(mo)o(v)o(es)365 2350 y(found)c(to)g(b)q(e)h(b)q +(est)h(at)e(iteration)g(n)g(are)h(v)o(ery)f(lik)o(ely)f(to)i(remain)d(b)q +(est)k(at)e(iteration)365 2399 y(n+1.)28 b(Therefore)18 b(mo)o(v)o(es)e +(stored)i(in)e(the)i(transp)q(osition)f(table)g(should)g(b)q(e)g(tried)365 +2449 y(\014rst)e(if)e(the)i(no)q(de)f(is)g(re-visited.)957 +2574 y(28)p eop +%%Page: 29 31 +29 30 bop 324 307 a Ff(\017)20 b Fp(Capture)d(mo)o(v)o(es)d(are)i(w)o(orth)f +(searc)o(hing)h(b)q(efore)h(other)f(less)g(dynamic)e(mo)o(v)o(es)g(b)q(e-)365 +357 y(cause)h(they)f(are)h(more)d(lik)o(ely)h(to)h(refute)g(the)h(curren)o(t) +g(line)e(of)h(pla)o(y)f(and)g(therefore)365 407 y(cause)i(a)e(cut)h(o\013.)k +(Capturing)13 b(the)h(piece)g(just)f(mo)o(v)o(ed)f(is)h(generally)g(v)o(ery)h +(e\013ectiv)o(e)365 457 y(at)g(refuting)g(a)f(giv)o(en)h(line)f(of)g(pla)o(y) +g([4].)324 539 y Ff(\017)20 b Fp(A)12 b(mo)o(v)o(e)e(that)i(causes)h(a)e(cut) +i(o\013)e(at)h(a)f(giv)o(en)h(depth)g(should)g(b)q(e)g(tried)g(early)g(as)f +(part)365 589 y(of)16 b(another)g(v)n(ariation)f(at)h(the)g(same)g(depth.)25 +b(This)16 b(tec)o(hnique)h(is)f(kno)o(wn)g(as)g(the)365 638 +y Fm(Kil)r(ler)d Fp(heuristic)h([4].)324 721 y Ff(\017)20 b +Fp(The)14 b Fm(History)f Fp(heuristic)h(pro)o(vides)f(a)g(metho)q(d)g(of)g +("recording)g(eac)o(h)h(mo)o(v)o(es)e(abilit)o(y)365 770 y(to)17 +b(cause)g(a)f(refutation")h([50)o(].)25 b(This)16 b(information)e(can)j(then) +g(b)q(e)g(used)g(to)g(order)365 820 y(mo)o(v)o(es)c(according)h(to)g(the)g +(lik)o(eliho)q(o)q(d)e(of)h(them)h(causing)f(a)h(refutation.)324 +902 y Ff(\017)20 b Fp(Metho)q(ds)c(whic)o(h)f(use)g(the)h(ev)n(aluation)d +(function)i(to)f(score)i(and)f(order)h(mo)o(v)o(es)d(are)365 +952 y(quite)g(accurate,)h(but)f(exp)q(ensiv)o(e;)h(prohibitiv)o(ely)e(so)h +(at)f(the)i(deep)q(est)h(lev)o(els)e(of)f(the)365 1002 y(tree.)262 +1083 y(The)g(ob)r(jectiv)o(e)g(of)f(mo)o(v)o(e)g(ordering)h(is)f(therefore)j +(to)d(searc)o(h)i(mo)o(v)o(es)e(in)g(a)h(b)q(est)h(\014rst)f(order.)262 +1133 y(Therefore)21 b(\014nding)f(go)q(o)q(d)g Fh(\013)g Fp(v)n(alues)h(quic) +o(kly)e(and)h(causing)h(early)f Fh(\014)j Fp(cut)e(o\013s.)38 +b(The)262 1183 y(time)13 b(sp)q(en)o(t)j(ordering)f(mo)o(v)o(es)f(m)o(ust)g +(b)q(e)h(small)e(or)i(the)h(pro)q(cess)g(will)e(b)q(e)h(self{defeating.)262 +1233 y(Therefore)f(the)g(\014rst)h(\014v)o(e)f(metho)q(ds)f(are)h(most)e +(common)f(in)i(con)o(temp)q(orary)g(brute)h(force)262 1283 +y(c)o(hess)h(programs.)262 1434 y Fu(3.1.6)55 b(Null)18 b(Mo)n(v)n(es)262 +1546 y Fp(In)d(c)o(hess,)j(unlik)o(e)d(some)g(other)i(games,)e(the)h(option)g +(of)f(not)h(pla)o(ying)e(a)i(mo)o(v)o(e)e(do)q(es)j(not)262 +1596 y(exist.)h(Ho)o(w)o(ev)o(er,)13 b(this)f(option)g(can)h(b)q(e)h(used)g +(to)e(go)q(o)q(d)h(e\013ect)h(as)f(part)g(of)f(the)h(searc)o(h)h(tree)262 +1645 y(in)f(order)i(to)e(detect)j(tactical)d(mo)o(v)o(es.)324 +1731 y(The)k(idea)f(is)h(that)g(b)o(y)f(giving)f(up)i(the)h(righ)o(t)e(to)g +(mo)o(v)o(e,)g(it)g(allo)o(ws)g(the)h(opp)q(onen)o(t)g(a)262 +1781 y(second)i(consecutiv)o(e)h(mo)o(v)o(e.)29 b(If)18 b(this)g(second)i(mo) +o(v)o(e)c(do)q(es)k(not)e(accomplish)f(an)o(ything)262 1830 +y(b)q(ene\014cial,)i(then)g(it)f(can)g(b)q(e)h(assumed)f(that)h(the)g +(\014rst)g(mo)o(v)o(e)d(did)i(not)g(represen)o(t)j(an)o(y)262 +1880 y(threat.)d(In)c(this)g(w)o(a)o(y)f(mo)o(v)o(es)g(whic)o(h)h(represen)o +(t)i(a)d(threat)i(can)f(b)q(e)h(iden)o(ti\014ed.)324 1965 y(This)d(metho)q(d) +f(assumes)h(that)g(it)g(is)f(alw)o(a)o(ys)g(b)q(etter)j(to)e(mak)o(e)e(a)i +(mo)o(v)o(e,)e(than)i(no)g(mo)o(v)o(e)262 2015 y(at)f(all)g(\(a)g +Fm(nul)r(l)i(move)p Fp(\).)18 b(In)12 b(fact)g(in)f(c)o(hess,)i(a)f +(situation)f(kno)o(wn)g(as)h("zugzw)o(ang")f(can)h(exist)262 +2065 y(where)k(all)e(a)o(v)n(ailable)f(mo)o(v)o(es)h(lead)h(to)g(a)f(loss)i +(of)e(some)h(sort;)g(whereas)i(if)d(no)h(mo)o(v)o(e)f(w)o(ere)262 +2115 y(made,)c(the)h(loss)h(could)f(b)q(e)h(a)o(v)o(oided.)k(An)11 +b(algorithm)e(using)i(the)h(n)o(ull)e(mo)o(v)o(e)g(to)h(determine)262 +2165 y(threats)k(could)g(therefore)h(o)o(v)o(erlo)q(ok)e(mo)o(v)o(es)f(whic)o +(h)i(lea)o(v)o(e)f(the)i(opp)q(onen)o(t)f(in)f(zugzw)o(ang.)262 +2214 y(Ho)o(w)o(ev)o(er,)e(zugzw)o(ang)g(is)f(v)o(ery)h(rare)h(and)e(do)q(es) +i(not)f(cause)g(a)g(signi\014can)o(t)f(problem)g(for)g(the)262 +2264 y(tec)o(hnique.)324 2350 y(Don)j(Beal)h(has)g(done)f(a)h(lot)f(of)g(exp) +q(erimen)o(tation)g(in)o(to)g(the)h(use)h(of)e(n)o(ull)f(mo)o(v)o(es)h(in)g +(a)262 2399 y(normal)g Fh(\013\014)20 b Fp(minim)o(ax)14 b(searc)o(h.)28 +b(In)17 b(his)g(pap)q(er)h("Exp)q(erimen)o(ts)f(with)f(the)i(Null)e(Mo)o(v)o +(e")262 2449 y([5)o(],)i(he)g(prop)q(oses)h(an)f(algorithmic)d(approac)o(h)j +(to)f(selectiv)o(e)i(searc)o(hing)g(based)f(on)g(n)o(ull)957 +2574 y(29)p eop +%%Page: 30 32 +30 31 bop 262 653 a Fl(F)l(unction)11 b Fp(Quiescence\(P)17 +b(:)c Fl(p)q(osition)p Fp(;)d Fh(\013)p Fp(,)k Fh(\014)i Fp(:)i +Fl(in)o(teger)p Fp(\))11 b Fl(returns)j(in)o(teger)262 752 +y(v)m(ar)321 802 y Fp(m)82 b(:)18 b Fl(mo)o(v)o(e)321 852 y +Fp(score,)321 902 y(b)q(est)44 b(:)18 b Fl(in)o(teger)262 1001 +y(b)q(egin)321 1101 y Fp(/*)13 b Fm(Calculate)h(nul)r(l)h(move)g(sc)n(or)n +(e.)k(Note)c(:)j(Evaluate)e(may)f(itself)f(b)n(e)h(a)g(se)n(ar)n(ch)e +Fp(*/)321 1151 y(b)q(est)i(:=)c Ff(\000)p Fp(Ev)n(aluate\(P)m(,)i +Ff(\000)p Fh(\014)r Fp(,)h Ff(\000)p Fh(\013)p Fp(\))321 1250 +y(GenerateMo)o(v)o(es\(P\))321 1300 y Fl(for)h(eac)o(h)g(mo)o(v)o(e)e +Fp(m)f Fl(do)380 1350 y(if)g Fp(\(b)q(est)j Ff(\025)d Fh(\014)r +Fp(\))439 1400 y Fl(return)f Fp(\(b)q(est\))374 b(/*)13 b Fh(\014)18 +b Fm(cut)d(o\013)g(:)k(r)n(eturn)14 b(b)n(est)h(sc)n(or)n(e)e +Fp(*/)380 1450 y Fl(endif)380 1499 y Fp(/*)g Fm(Se)n(ar)n(ch)i(move)g(m)g(to) +g(next)g(depth)h(using)f(ne)n(gamax)h(c)n(onvention)f Fp(*/)380 +1549 y(score)g(:=)e Ff(\000)p Fp(Quiescence\()p Fh(P)812 1555 +y Fe(m)847 1549 y Fp(,)g Ff(\000)p Fh(\014)r Fp(,)h Ff(\000)p +Fp(b)q(est\))380 1599 y Fl(if)e Fp(\(score)k Fh(>)e Fp(b)q(est\))439 +1649 y(b)q(est)h(:=)e(score)391 b(/*)13 b Fm(Stor)n(e)i(b)n(est)f(sc)n(or)n +(e)h(found)f Fp(*/)380 1699 y Fl(endif)321 1749 y(endfor)321 +1848 y(return)d Fp(\(b)q(est\))492 b(/*)13 b Fm(R)n(eturn)i(sc)n(or)n(e)g(of) +f(b)n(est)h(move)g(found)g Fp(*/)262 1948 y Fl(end)d Fp(Quiescence)338 +2130 y(Figure)i(3.4:)j(Pseudo)e(co)q(de)g(for)e(a)h(Quiescence)i(searc)o(h)f +(based)g(on)e(Null)g(Mo)o(v)o(es.)957 2574 y(30)p eop +%%Page: 31 33 +31 32 bop 262 307 a Fp(mo)o(v)o(es.)15 b(In)c(particular)g(he)g(de\014nes)h +(a)e(n)o(ull)g(mo)o(v)o(e)f(quiescence)k(searc)o(h)f(whic)o(h)f(is)f(capable) +h(of)262 357 y("selecting)h(mo)o(v)o(es)e(suc)o(h)i(as)g(c)o(hec)o(ks,)h(mo)o +(v)o(es)d(out)i(of)f(c)o(hec)o(k,)h(attac)o(ks)g(on)f(pieces,)i(defences,)262 +407 y(blo)q(c)o(ks)j(and)h(other)g(t)o(yp)q(es)h(of)e(sharp)h(tactical)g(mo)o +(v)o(es)e(that)i(c)o(hess)h(pla)o(y)o(ers)f(concen)o(trate)262 +457 y(on".)g(This)d(is)g(ac)o(hiev)o(ed)g(with)f(no)h(more)f(c)o(hess)i(kno)o +(wledge)f(than)g(material)e(balance.)324 542 y(Beal)i(uses)g(the)h(score)g +(returned)g(from)d(a)h(quiescence)j(searc)o(h)f(follo)o(wing)c(a)j(n)o(ull)e +(mo)o(v)o(e)262 592 y(as)f(a)f(b)q(ound)i(to)e(guide)h(the)h(searc)o(h)g(and) +f(enable)g(forw)o(ard)g(pruning)g(of)f(inadequate)h(mo)o(v)o(es.)262 +641 y(Beal)j(sho)o(ws)h(that)f(suc)o(h)h(a)f(quiescence)j(searc)o(h)e(is)g +(capable)f(of)g(a)g(p)q(erformance)g(on)g(Rein-)262 691 y(\014eld's)f(300)h +(tactical)f(p)q(ositions)h([47)o(],)f(equiv)n(alen)o(t)g(to)h(that)g(of)f +(the)i(c)o(hess)g(mac)o(hine)e(Belle,)262 741 y(while)g(using)h(only)f(1)p +Fh(=)p Fp(15th)g(of)g(the)h(e\013ort)h(!)324 826 y(V)m(ery)e(recen)o(tly)m(,) +g(Hamlen)e([25)o(])i(extended)h(this)f(idea)g(b)o(y)f(applying)g(a)g(full)g +(width)h(2)f(ply)262 876 y(searc)o(h,)19 b(in)f(addition)f(to)h(the)h(normal) +d(quiescence)k(searc)o(h,)g(after)e(a)g(n)o(ull)f(mo)o(v)o(e.)29 +b(This)262 926 y(allo)o(w)o(ed)17 b(the)i(algorithm)d(to)i(additionally)f +(detect)j(tactical)e(plo)o(ys)g(suc)o(h)i(as)e(forks)h(and)262 +976 y(sk)o(ew)o(ers.)24 b(Other)17 b(programs,)d(notably)h(Kaissa)h([1)o(],)f +(ha)o(v)o(e)g(used)i(the)f(n)o(ull)e(mo)o(v)o(e)g(idea)i(to)262 +1026 y(pro)o(vide)e(faster)g(cut)h(o\013s,)f(without)g(using)g(it)g +(algorithmical)o(ly)d(to)j(select)h(mo)o(v)o(es)e(as)i(Beal)262 +1075 y(and)e(Hamlen)g(ha)o(v)o(e.)324 1161 y(Beal's)g(n)o(ull)f(mo)o(v)o(e)g +(quiescence)j(searc)o(h)g(can)e(b)q(e)h(seen)h(in)d(\014gure)i(3.4.)j(It)c +(is)g(imp)q(ortan)o(t)262 1210 y(to)20 b(realise)h(that)g(Ev)n(aluate)f(ma)o +(y)f(itself)h(b)q(e)i(a)e(searc)o(h)i(of)e(some)g(kind.)38 +b(In)21 b(fact)g(Beal)262 1260 y(adv)o(o)q(cates)d(the)g(use)h(of)e(a)h(2nd)f +(lev)o(el)h(n)o(ull)e(mo)o(v)o(e)g(quiescence)k(searc)o(h)f(supp)q(orted)g(b) +o(y)f(a)262 1310 y(1st)e(lev)o(el)g(quiescence)i(searc)o(h,)f(in)f(place)g +(of)g(Ev)n(aluate,)f(using)h(material)e(balance)i(as)h(its)262 +1360 y(ev)n(aluation.)262 1512 y Fu(3.1.7)55 b(Razoring)262 +1624 y Fp(Razoring)13 b(is)i(a)g(tec)o(hnique)h(devised)f(b)o(y)g(Birmingham) +c(and)k(Ken)o(t)h([11)o(].)k(The)c(tec)o(hnique)262 1673 y(uses)i(the)g +(assumption)e(that)h(a)g(pla)o(y)o(er)g(who)g(has)h(the)g(mo)o(v)o(e)d(can)j +(alw)o(a)o(ys)e(main)o(tain)f(or)262 1723 y(impro)o(v)o(e)d(his)h(p)q +(osition)h(b)o(y)f(pla)o(ying)g(a)g(mo)o(v)o(e.)324 1808 y(The)k(tec)o +(hnique)i(w)o(orks)e(b)o(y)g(using)g(a)g(static)g(ev)n(aluation)f(v)n(alue)h +(at)g(in)o(terior)g(as)g(w)o(ell)262 1858 y(as)i(terminal)f(no)q(des.)35 +b(This)19 b(v)n(alue)g(is)g(compared)g(to)g(the)h(curren)o(t)h +Fh(\013)e Fp(v)n(alue)g(with)g(the)262 1908 y(assumption)10 +b(that)h(the)h(opp)q(onen)o(t)g(can)g(alw)o(a)o(ys)e(main)o(tain)f(or)i +(impro)o(v)o(e)f(his)h(p)q(osition)g(with)262 1958 y(a)g(mo)o(v)o(e.)16 +b(Therefore,)d(the)f(static)h(score)g(is)f(treated)h(as)f(an)f(upp)q(er)i(b)q +(ound)f(on)g(the)g(p)q(ossible)262 2008 y(scores)j(resulting)f(from)e(the)j +(opp)q(onen)o(ts)g(a)o(v)n(ailable)d(mo)o(v)o(es.)17 b(Hence,)e(if)e(this)h +(static)g(v)n(alue)262 2058 y(is)f(no)h(greater)h(than)f(the)h +Fh(\013)e Fp(v)n(alue,)g(it)h(is)g(assumed)f(that)h(the)h(subtree)h(cannot)e +(a\013ect)h(the)262 2107 y Fh(\013)g Fp(v)n(alue)h(at)g(this)g(lev)o(el)g +(and)g(can)g(therefore)i(b)q(e)e(cut)h(o\013.)25 b(Note)16 +b(that)h(this)f(tec)o(hnique)h(is)262 2157 y(only)c(applied)g(from)f(the)j(p) +q(oin)o(t)e(of)g(view)h(of)f(the)i(pla)o(y)o(er)e(who)h(has)g(just)g(mo)o(v)o +(ed.)324 2242 y(Figure)h(3.5)e(illustrates)i(the)g(razoring)g(tec)o(hnique)g +(in)f(action.)20 b(The)15 b(n)o(um)o(b)q(ers)g(to)f(the)262 +2292 y(left)k(of)g(eac)o(h)h(no)q(de)g(represen)o(t)i(the)e(static)g(v)n +(alues,)h(while)e(the)h(n)o(um)o(b)q(ers)f(to)h(the)g(righ)o(t)262 +2342 y(represen)o(t)e(bac)o(k)o(ed)f(up)f(negamax)f(v)n(alues.)22 +b(No)q(de)15 b(B)h(is)f(examined)f(\014rst)i(giving)e(a)h(static)262 +2392 y(v)n(alue)e(of)h(+7.)21 b(No)q(des)15 b(C)g(and)f(D)g(are)h(then)g +(searc)o(hed,)h(resulting)f(in)f(v)n(alues)g(of)g Ff(\000)p +Fp(15)h(and)262 2442 y Ff(\000)p Fp(4)i(resp)q(ectiv)o(ely)m(.)31 +b(A)18 b(v)n(alue)f(of)h(+4)f(using)h(negamax)e(is)i(subsequen)o(tly)h(bac)o +(k)o(ed)f(up)g(to)957 2574 y(31)p eop +%%Page: 32 34 +32 33 bop 697 1103 a Fp(Figure)14 b(3.5:)j(Razoring)c(in)h(action.)262 +1236 y(no)q(de)g(B.)g(The)h Fh(\013)f Fp(v)n(alue)f(at)h(this)h(lev)o(el)e +(is)i(then)f(made)f(equal)h(to)g(+4.)19 b(The)c(mo)o(v)o(e)e(leading)262 +1286 y(to)h(no)q(de)h(E)g(is)g(no)o(w)f(examined)g(and)g(giv)o(en)h(a)f +(static)h(v)n(alue)f(of)g(+1.)21 b(Using)14 b(the)i(razoring)262 +1335 y(tec)o(hnique,)e(this)g(v)n(alue)f(represen)o(ts)k(an)d(upp)q(er)g(b)q +(ound,)g(b)q(ecause)i(the)e(opp)q(onen)o(ts)h(mo)o(v)o(es)262 +1385 y(leading)g(to)h(no)q(des)g(F)g(and)g(G)g(are)g(assumed)g(to)g(main)o +(tain)d(or)j(impro)o(v)o(e)e(the)j(opp)q(onen)o(ts)262 1435 +y(score)g(thereb)o(y)g(decreasing)h(the)e(score)i(at)e(this)g(lev)o(el.)25 +b(As)17 b(the)f(upp)q(er)i(b)q(ound)e(of)g(+1)g(is)262 1485 +y(already)d(less)h(than)f(the)h(curren)o(t)h Fh(\013)d Fp(v)n(alue)h(at)g +(ply)g(1,)g(no)q(des)h(F)f(and)g(G)g(cannot)h(a\013ect)g(the)262 +1535 y(searc)o(h)h(result)f(and)g(can)g(therefore)h(b)q(e)g(cut)f(o\013)g(b)o +(y)g(razoring.)324 1620 y(The)19 b(razoring)h(tec)o(hnique)g(can)f(b)q(e)h +(extended)h(b)o(y)e(using)g(the)h(assumption)e(that)h(a)262 +1670 y(pla)o(y)o(er)f(can)g(impro)o(v)o(e)f(his)h(curren)o(t)i(p)q(osition)e +(b)o(y)g(pla)o(ying)e(his)j(mo)o(v)o(e,)e(y)o(our)h(mo)o(v)o(e,)g(his)262 +1720 y(mo)o(v)o(e.)29 b(This)18 b(extension)g(of)g(the)h(idea)f(is)g(kno)o +(wn)f(as)i(deep)g(razoring.)30 b(It)18 b(causes)i(ev)o(en)262 +1769 y(more)12 b(razor)j(cut)f(o\013s,)g(but)g(at)g(a)f(m)o(uc)o(h)g(greater) +i(risk)f(of)f(cutting)h(out)g(a)g(vital)e(mo)o(v)o(e.)324 1855 +y(Birmingham)h(and)j(Ken)o(t)i(also)e(prop)q(osed)h(a)f(further)i(enhancemen) +o(t)f(where)h(b)o(y)e(the)262 1904 y(assumption)f(is)h(made)f(that)i(there)g +(alw)o(a)o(ys)f(exists)h(a)f(mo)o(v)o(e)f(whic)o(h)h(not)g(only)g(impro)o(v)o +(es)262 1954 y(a)e(pla)o(y)o(ers)h(p)q(osition,)e(but)i(impro)o(v)o(es)e(it)i +(b)o(y)f(at)h(least)f(3)p Fh(=)p Fp(10ths)h(of)f(a)g(pa)o(wn,)g(for)g +(example.)262 2004 y(This)e('enhancemen)o(t')f(further)i(increases)h(razored) +f(cut)g(o\013s,)f(but)g(at)g(the)h(cost)g(of)e(missing)262 +2054 y(p)q(ossibly)i(more)g(vital)g(mo)o(v)o(es.)324 2139 y(I)20 +b(b)q(eliev)o(e)g(the)h(tec)o(hnique)g(w)o(ould)e(b)q(e)i(b)q(etter)g +(enhanced)h(b)o(y)d(taking)h(an)f(opp)q(osite)262 2189 y(view)14 +b(to)g(the)h(enhancemen)o(t)g(ab)q(o)o(v)o(e.)20 b(F)m(or)14 +b(example,)f(assume)h(that)h(there)g(alw)o(a)o(ys)f(exists)262 +2239 y(a)g(mo)o(v)o(e)g(that)h(will)e(not)i(deteriorate)h(the)g(p)q(osition)e +(b)o(y)h(more)f(than)h(a)g(threshold,)g(of)g(sa)o(y)262 2289 +y(half)i(a)h(pa)o(wn.)31 b(Di\013eren)o(t)19 b(thresholds)h(could)e(b)q(e)h +(applied)f(at)g(eac)o(h)h(lev)o(el)f(of)g(the)h(tree,)262 2338 +y(p)q(erhaps)14 b(w)o(eigh)o(ted)f(so)g(that)g(as)g(the)h(searc)o(h)g +(progresses)h(more)d(deeply)h(do)o(wn)g(the)g(searc)o(h)262 +2388 y(tree,)i(more)e(cut)i(o\013s)f(are)h(made.)i(This)e(enhancemen)o(t)f(w) +o(ould)g(decrease)i(the)f(n)o(um)o(b)q(er)e(of)262 2438 y(cut)h(o\013s,)g +(but)g(impro)o(v)o(e)e(the)i(lik)o(eliho)q(o)q(d)f(of)g(including)g(go)q(o)q +(d)g(mo)o(v)o(es)g(in)g(the)i(searc)o(h)g(tree,)957 2574 y(32)p +eop +%%Page: 33 35 +33 34 bop 262 307 a Fp(particularly)13 b(at)g(shallo)o(w)o(er)h(depths)h +(where)g(missing)d(suc)o(h)i(mo)o(v)o(es)f(can)h(b)q(e)g(fatal.)324 +392 y(I)j(b)q(eliev)o(e)g(the)h(assumption)d(made)h(b)o(y)h(the)h(Razoring)e +(tec)o(hnique)h(is)g(m)o(uc)o(h)f(w)o(eak)o(er)262 442 y(than)f(that)h(of)f +(the)i(Null)e(mo)o(v)o(e)f(tec)o(hnique,)i(whic)o(h)g(only)f(assumes)h(that)f +(it)h(is)f(b)q(etter)j(to)262 492 y(mak)o(e)12 b(a)i(mo)o(v)o(e,)d(than)j(no) +g(mo)o(v)o(e)e(at)i(all.)262 665 y Fr(3.2)69 b(Ev)l(aluation)262 +791 y Fp(This)11 b(section)h(describ)q(es)i(a)d(n)o(um)o(b)q(er)g(of)g(tec)o +(hniques)i(for)e(heuristic)i(p)q(ositional)d(ev)n(aluation)262 +841 y(of)j(c)o(hess)j(p)q(ositions.)k(Most)15 b(of)e(these)j(tec)o(hniques)g +(are)f(b)q(est)h(used)f(in)f(com)o(bination)e(with)262 891 +y(eac)o(h)i(other.)324 976 y(The)g(imp)q(ortance)g(of)f(the)i(ev)n(aluation)d +(function)i(cannot)h(b)q(e)f(to)q(o)g(highly)f(stressed)k(as)262 +1026 y(it)12 b(is)h(this)g(that)g(giv)o(es)g(a)g(program)e(its)i(distinctiv)o +(e)g(st)o(yle.)18 b(Ac)o(hieving)13 b(a)g(go)q(o)q(d)f(p)q(osition)h(is)262 +1076 y(often)g(a)h(prelude)h(to)e(a)h(winning)f(tactical)g(com)o(bination.) +365 1159 y("T)m(actics)h(\015o)o(w)g(from)e(a)h(go)q(o)q(d)h(p)q(osition")970 +1225 y Fm(R)n(ob)n(ert)g(J.)h(Fischer.)262 1377 y Fu(3.2.1)55 +b(Piece)17 b(Square)i(T)-5 b(ables)262 1489 y Fp(Piece)12 b(Square)f +(\(Pc/Sq\))h(tables)f(are)g(used)h(to)f(hold)f(v)n(alues)h(for)f(pieces)j(o)q +(ccup)o(ying)d(squares)262 1539 y(on)h(the)h(b)q(oard.)18 b(F)m(or)11 +b(example,)f(a)i(knigh)o(t)f(square)h(table)g(w)o(ould)f(con)o(tain)g(a)h +(score)h(for)e(eac)o(h)262 1588 y(square)16 b(indicating)e(the)i(merits)e(of) +h(ha)o(ving)f(a)h(knigh)o(t)f(on)h(that)h(square.)23 b(T)m(ables)15 +b(can)g(b)q(e)262 1638 y(used)g(for)g(eac)o(h)g(t)o(yp)q(e)h(of)e(piece)i +(and)e(can)h(b)q(e)h(pre-loaded)f(b)q(efore)g(the)h(searc)o(h)g(b)q(egins,)f +(b)o(y)262 1688 y(doing)i(some)h(preliminary)f(p)q(ositional)g(analysis.)32 +b(Using)19 b(suc)o(h)h(tables,)f(it)g(b)q(ecomes)g(a)262 1738 +y(simple)c(matter)i(to)g(p)q(erform)f(a)h(p)q(ositional)f(ev)n(aluation)g(at) +h(a)f(giv)o(en)h(no)q(de.)28 b(Giv)o(en)17 b(the)262 1788 y(lo)q(cation)e(of) +h(eac)o(h)i(piece)f(on)g(the)g(b)q(oard,)g(a)f(v)n(alue)g(can)h(b)q(e)g(lo)q +(ok)o(ed)f(up)h(in)f(the)i(relev)n(an)o(t)262 1837 y(table)13 +b(and)f(added)i(to)f(the)h(p)q(ositional)d(total)i(for)f(the)i(appropriate)f +(side,)g(white)h(or)f(blac)o(k.)262 1887 y(Finally)c(the)i(di\013erence)i(b)q +(et)o(w)o(een)f(the)f(t)o(w)o(o)g(totals)f(is)h(calculated)g(giving)e(an)i(o) +o(v)o(erall)e(v)n(alue)262 1937 y(for)k(the)i(p)q(osition.)324 +2022 y(The)e(main)e(adv)n(an)o(tage)i(of)f(using)h(these)i(tables)e(is)g(sp)q +(eed.)20 b(The)13 b(w)o(orlds)g(fastest)h(c)o(hess)262 2072 +y(mac)o(hines,)c(Hitec)o(h)j(and)e(Deep)i(Though)o(t,)e(mak)o(e)g(extensiv)o +(e)h(use)h(of)e(Pc/Sq)h(tables.)18 b(Ho)o(w-)262 2122 y(ev)o(er,)13 +b(b)q(ecause)h(these)g(tables)f(are)g(generally)g(pre-loaded)f(b)q(efore)i +(the)f(searc)o(h)h(b)q(egins)f(and)262 2172 y(applied)h(n)h(ply)g(further)h +(do)o(wn)e(the)i(tree)g(at)f(leaf)g(no)q(des,)g(man)o(y)f(p)q(ositional)f +(asp)q(ects)k(are)262 2222 y(no)10 b(longer)h(applicable.)16 +b(The)11 b(tables)h(also)e(do)g(not)h(re\015ect)i(up)e(to)g(date)g(piece)h +(in)o(teractions.)324 2307 y(These)20 b(problems)e(are)h(exasp)q(erated)i(b)o +(y)d(deep)i(searc)o(hing.)33 b(It)19 b(is)g(therefore)h(ironic)262 +2357 y(that)14 b(the)h(tables)g(are)g(used)h(for)e(the)i(express)g(purp)q +(ose)g(of)e(deep)h(searc)o(hing)h(due)f(to)f(their)262 2406 +y(e\016ciency)m(.)22 b(It)15 b(is)g(in)o(teresting)h(that)f(the)h(Hitec)o(h)f +(team)f(at)h(CMU)h(are)f(no)o(w)g(\014nding)g(that)957 2574 +y(33)p eop +%%Page: 34 36 +34 35 bop 262 307 a Fp(as)14 b(their)h(program)e(impro)o(v)o(es,)g(more)h +(kno)o(wledge)g(m)o(ust)g(b)q(e)h(migrated)e(from)g(the)i(Pc/Sq)262 +357 y(tables)f(to)f(the)i(leaf)e(no)q(de)h(static)h(ev)n(aluation)d(pro)q +(cess)k([7)o(].)262 508 y Fu(3.2.2)55 b(Static)18 b(Ev)m(aluation)262 +620 y Fp(In)11 b(most)g(programs,)g(a)g(static)h(ev)n(aluation)f(is)g(p)q +(erformed)h(at)g(the)g(leaf)f(no)q(des)i(of)e(the)i(main)262 +670 y(searc)o(h.)32 b(In)18 b(full)g(width)g(searc)o(hes,)j(a)d(quiescence)i +(searc)o(h)g(is)e(usually)f(also)h(applied)g(at)262 720 y(these)f(leaf)e(no)q +(des,)i(th)o(us)g(creating)f(new)g(leaf)g(no)q(des)g(at)g(a)g(deep)q(er)i +(lev)o(el)d(whic)o(h)h(are)h(not)262 770 y(usually)c(p)q(ositionally)f(ev)n +(aluated)h(for)h(e\016ciency)g(reasons.)324 855 y(The)19 b(static)g(ev)n +(aluation)e(pro)q(cess)j(in)o(v)o(olv)o(es)e(computing)f(the)i(existence)h +(of)e(v)n(arious)262 905 y(p)q(ositional)11 b(factors.)17 b(Dep)q(ending)c +(on)f(the)h(degree)h(to)e(whic)o(h)h(these)h(factors)e(exist,)h(appro-)262 +955 y(priate)h(v)n(alues)g(are)h(calculated.)k(Finally)13 b(the)i(v)n(alues)f +(are)g(w)o(eigh)o(ted)h(according)f(to)g(their)262 1004 y(relativ)o(e)f(imp)q +(ortance.)324 1090 y(In)20 b(c)o(hess,)j(determining)c(the)i(factors)g(whic)o +(h)f(con)o(tribute)h(to)f(a)g(go)q(o)q(d)g(p)q(osition)g(is)262 +1139 y(v)o(ery)c(di\016cult.)25 b(Standard)17 b(criteria)g(ha)o(v)o(e)f(b)q +(een)i(dev)o(elop)q(ed)f(o)o(v)o(er)f(the)h(y)o(ears)g(b)o(y)g(whic)o(h)262 +1189 y(a)f(program)g(can)h(judge)g(a)f(p)q(osition.)27 b(Using)17 +b(suc)o(h)g(criteria)h(curren)o(t)g(programs)e(pla)o(y)g(a)262 +1239 y(reasonable)d(game.)k(Ho)o(w)o(ev)o(er,)c(it)h(is)f(still)f(clear)i +(from)e(their)i(p)q(ositional)e(pla)o(y)m(,)g(that)h(some)262 +1289 y(subtle)j(factors)g(are)h(still)e(not)h(b)q(eing)f(included.)25 +b(I)16 b(will)e(try)i(to)g(unco)o(v)o(er)h(some)e(of)g(these)262 +1339 y(in)h(the)h(next)g(c)o(hapter.)27 b(The)17 b(most)e(di\016cult)h(task)h +(remains)e(determining)h(the)h(relativ)o(e)262 1389 y(imp)q(ortance)c(of)g +(eac)o(h)i(factor)f(or)f(criterion.)19 b(An)14 b(attempt)g(w)o(as)f(made)g +(to)h(determine)g(the)262 1438 y(relativ)o(e)f(imp)q(ortance)g(of)h(a)f(n)o +(um)o(b)q(er)g(of)h(ev)n(aluation)e(criteria)i(in)g([51)o(].)k(I)13 +b(think)h(the)g(basic)262 1488 y(idea)9 b(of)h(this)g(researc)o(h)i(is)e(an)g +(excellen)o(t)h(one,)g(ho)o(w)o(ev)o(er,)f(I)h(feel)f(the)h(sp)q(eci\014c)g +(order)g(in)f(whic)o(h)262 1538 y(the)k(ev)n(aluation)e(criteria)j(w)o(ere)g +(tested,)g(in\015uenced)g(the)f(result)h(of)e(the)h(exp)q(erimen)o(ts.)324 +1623 y(Sev)o(eral)e(attempts)g(ha)o(v)o(e)g(b)q(een)i(made)d(to)h(generate)h +(a)f('b)q(est)h(\014t')f(ev)n(aluation)f(function)262 1673 +y([27)o(,)i(39].)19 b(Most)c(of)f(these)h(studies)h(are)f(based)g(on)f(an)g +(analysis)g(of)g(grandmaster)f(mo)o(v)o(es.)262 1723 y(The)g(ob)r(jectiv)o(e) +h(is)f(to)g(\014nd)h(a)f(function)g(whic)o(h)g(selects)i(grandmaster)e(mo)o +(v)o(es)f(as)h(often)h(as)262 1773 y(p)q(ossible.)j(Suc)o(h)11 +b(attempts)f(ha)o(v)o(e)h(hit)f(serious)h(problems)f(b)q(ecause,)j(as)e(I)f +(see)i(it,)f(5)f(problem)262 1823 y(areas)k(exist:)312 1904 +y(1.)20 b(A)c(b)q(est)h(\014t)f(can)g(only)e(b)q(e)j(attempted)e(for)h(the)g +(kno)o(wn)f(functions.)24 b(If)15 b(a)g(program)365 1954 y(do)q(es)d(not)e +(kno)o(w)g(ab)q(out)h(a)f(particular)h(asp)q(ect)h(of)e(c)o(hess,)i(for)e +(example)g(w)o(eak)g(pa)o(wns,)365 2003 y(it)j(cannot)g(include)g(suc)o(h)g +(considerations)h(in)e(its)h(ev)n(aluation)e(pro)q(cess.)20 +b(Therefore,)365 2053 y(p)q(ossibly)14 b(in)o(tro)q(ducing)f(side)i +(e\013ects)h(in)o(to)d(existing)g(functions.)312 2135 y(2.)20 +b(The)c(criteria)g(b)o(y)g(whic)o(h)f(a)h(h)o(uman)e(c)o(hess)j(pla)o(y)o(er) +e(ev)n(aluates)h(a)g(p)q(osition)f(are)h(not)365 2185 y(m)o(utually)11 +b(exclusiv)o(e,)j(but)f(subtly)h(link)o(ed.)j(Iden)o(tifying)c(these)i(links) +d(is)i(v)o(ery)g(di\016-)365 2235 y(cult.)312 2317 y(3.)20 +b(So)11 b(m)o(uc)o(h)g(dep)q(ends)i(on)e(the)h(phase)g(of)f(the)h(game)e +(e.g.)17 b(middle)9 b(game)h(or)i(end)g(game,)365 2367 y(that)i(I)g(b)q +(eliev)o(e)g(sp)q(eci\014c)i(functions)e(are)g(required)h(for)e(eac)o(h)i +(game)d(phase.)312 2449 y(4.)20 b(P)o(ositionally)12 b(mo)o(v)o(es)h(v)n(ary) +g(with)h(pla)o(y)o(er)f(st)o(yle)h(and)g(mo)q(o)q(d.)957 2574 +y(34)p eop +%%Page: 35 37 +35 36 bop 312 307 a Fp(5.)20 b(Some)e(mo)o(v)o(es)f(are)i(tactically)f +(conditioned.)33 b(Suc)o(h)19 b(mo)o(v)o(es)e(m)o(ust)h(b)q(e)h(iden)o +(ti\014ed)365 357 y(b)q(ecause)d(they)e(a\013ect)h(the)g(p)q(ositional)d(c)o +(hoice)i(a)o(v)n(ailable.)262 440 y(Ob)o(viously)e(this)i(area)f(w)o(ould)g +(b)q(ene\014t)i(from)c(more)i(in)o(v)o(olv)o(emen)o(t)e(b)o(y)i(strong)h(c)o +(hess)h(pla)o(y-)262 490 y(ers.)324 575 y(In)f(practice,)i(static)f(ev)n +(aluation)e(functions)h(tend)i(to)e(b)q(e)h(primitiv)o(e,)d(particularly)i +(in)262 625 y(brute)j(force)g(programs,)f(to)g(enable)h(deep)h(searc)o(hing.) +26 b(Pc/Sq)17 b(tables)g(are)g(used)g(where)262 675 y(p)q(ossible)11 +b(to)g(impro)o(v)o(e)f(e\016ciency)m(.)17 b(Information)9 b(whic)o(h)i +(cannot)h(b)q(e)g(stored)g(in)f(the)h(tables,)262 725 y(suc)o(h)k(as)g +(pinned)g(piece)h(information,)c(m)o(ust)i(b)q(e)h(calculated.)24 +b(The)16 b(ev)n(aluation)f(pro)q(cess)262 774 y(can)j(b)q(e)h(supp)q(orted)h +(b)o(y)e(sp)q(eci\014c)i(hash)e(tables)h(e.g.)31 b(pa)o(wn)18 +b(structure)j(hashing.)31 b(This)262 824 y(enables)15 b(m)o(uc)o(h)f(faster)i +(ev)n(aluation)e(b)q(ecause)j(calculations)d(do)h(not)g(ha)o(v)o(e)g(to)g(b)q +(e)h(re-done)262 874 y(when)d(p)q(ositions)g(with)g(iden)o(tical)g(pa)o(wn)g +(structure,)i(for)e(example,)f(are)i(encoun)o(tered.)20 b(In)262 +924 y(selectiv)o(e)12 b(searc)o(h)h(programs)d(the)j(ev)n(aluation)d(pro)q +(cess)j(can)f(b)q(e)g(far)f(more)g(complex)f(as)i(the)262 974 +y(reduced)j(n)o(um)o(b)q(er)d(of)h(no)q(des)i(examined)d(allo)o(ws)g(more)g +(time)h(to)g(b)q(e)h(sp)q(en)o(t)g(at)g(eac)o(h)g(no)q(de.)262 +1023 y(The)j(di\016cult)o(y)f(here)j(is)e(that)g(kno)o(wledge)g(de\014ciency) +i(cannot)e(b)q(e)h(easily)f(made)f(up)h(b)o(y)262 1073 y(searc)o(hing.)g +(Therefore,)d(c)o(hess)f(kno)o(wledge)f(acquisition)f(from)f(grandmasters)i +(m)o(ust)f(pla)o(y)262 1123 y(a)f(vital)g(role)h(in)f(suc)o(h)i(programs.)j +(A)o(t)c(the)h(presen)o(t)g(time,)e(tec)o(hniques)i(do)f(not)f(exist)i(whic)o +(h)262 1173 y(w)o(ould)i(allo)o(w)g(grandmaster)h(though)o(t)g(pro)q(cesses)j +(to)d(b)q(e)h(captured)h(and)e(understo)q(o)q(d)i(in)262 1223 +y(detail,)12 b(let)i(alone,)f(allo)o(w)f(suc)o(h)j(kno)o(wledge)f(to)f(b)q(e) +i(transferred)h(to)d(the)i(mac)o(hine.)324 1308 y(It)f(should)h(b)q(e)g +(realised)g(that)f(static)h(ev)n(aluation)e(is)h(not)h(adequate)g(in)f +(dynamic)e(tac-)262 1358 y(tical)18 b(situations.)33 b(Suc)o(h)20 +b(tactical)f(problems)f(are)h(b)q(etter)i(resolv)o(ed)f(b)o(y)e(some)h(kind)f +(of)262 1408 y(quiescence)i(searc)o(h.)32 b(I)18 b(b)q(eliev)o(e)h(it)f(is)g +(the)h(job)f(of)f(the)i(static)g(ev)n(aluation)e(function)h(to)262 +1457 y(realise)13 b(when)g(a)g(p)q(osition)f(is)h(unsuitable)f(for)h(static)g +(ev)n(aluation)f(and)g(inform)f(the)i(searc)o(h)262 1507 y(pro)q(cess,)i(so)f +(it)f(can)h(attempt)f(to)h(resolv)o(e)h(the)f(tactical)g(uncertain)o(t)o(y)m +(.)262 1659 y Fu(3.2.3)55 b(Incremen)n(tal)16 b(Ev)m(aluation)262 +1771 y Fp(Static)e(ev)n(aluation)f(at)i(leaf)e(no)q(des)j(is)e(exp)q(ensiv)o +(e)i(in)e(terms)g(of)g(time;)f(and)h(Pc/Sq)h(tables)262 1821 +y(do)e(not)h(re\015ect)h(the)g(true)g(merits)e(of)g(a)g(p)q(osition,)g(esp)q +(ecially)h(as)g(the)h(searc)o(h)f(deep)q(ens.)21 b(A)262 1870 +y(third)12 b(option)g(is)h(a)o(v)n(ailable,)d(that)j(of)g(incremen)o(tally)e +(up)q(dating)h(the)i(p)q(ositional)d(totals)i(as)262 1920 y(mo)o(v)o(es)f +(are)i(made.)j(The)e(p)q(ositional)d(totals)i(could)f(b)q(e)i(up)q(dated)f +(as)g(follo)o(ws:)312 2003 y(1.)20 b(Calculate)9 b(the)h(p)q(ositional)e(v)n +(alue,)h(for)g(the)h(piece)g(just)g(mo)o(v)o(ed,)e(on)h(its)g(from{square.) +312 2086 y(2.)20 b(Decremen)o(t)15 b(this)e(v)n(alue)h(from)e(the)i(p)q +(ositional)f(total)g(for)h(the)g(relev)n(an)o(t)g(side.)312 +2169 y(3.)20 b(Calculate)14 b(the)g(p)q(ositional)e(v)n(alue,)h(for)h(the)g +(piece)h(just)f(mo)o(v)o(ed,)d(on)j(its)g(to{square.)312 2252 +y(4.)20 b(Incremen)o(t)14 b(this)g(new)h(v)n(alue)e(to)h(the)g(p)q(ositional) +f(total)g(for)g(the)i(relev)n(an)o(t)f(side.)262 2335 y(This)e(pro)q(cess)i +(is)e(quite)g(simple)f(and)h(therefore)i(fast,)e(but)h(do)q(es)g(not)f(tak)o +(e)g(accoun)o(t)h(of)f(the)262 2385 y(e\013ects)j(mo)o(ving)10 +b(a)j(piece)i(ma)o(y)c(ha)o(v)o(e)i(on)g(the)h(p)q(ositional)e(v)n(alue)g(of) +h(the)h(pieces)g(around)f(it.)262 2435 y(F)m(or)g(example,)f(mo)o(ving)f(a)j +(piece)h(ma)o(y)c(rev)o(eal)j(or)g(blo)q(c)o(k)g(a)f(n)o(um)o(b)q(er)g(of)h +(p)q(ossible)g(attac)o(ks.)957 2574 y(35)p eop +%%Page: 36 38 +36 37 bop 262 307 a Fp(Therefore,)13 b(if)g(the)g(pro)q(cess)i(is)e(to)f(b)q +(e)i(truly)f(incremen)o(tal)f(it)g(m)o(ust)g(tak)o(e)h(accoun)o(t)h(of)e(suc) +o(h)262 357 y(factors.)18 b(Ho)o(w)o(ev)o(er,)12 b(suc)o(h)i(a)e(detailed)h +(incremen)o(tal)f(ev)n(aluation)f(will)g(b)q(e)j(costly)f(in)f(terms)262 +407 y(of)h(time,)f(p)q(erhaps)j(prohibitiv)o(ely)d(so.)324 +492 y(In)i(practice)h(incremen)o(tal)e(ev)n(aluation)f(is)i(used)h(in)e +(conjunction)h(with)g(a)f(static)h(ev)n(al-)262 542 y(uation)i(at)h(the)h +(horizon)f(no)q(des)i(of)d(the)i(main)e(searc)o(h.)29 b(Incremen)o(tal)17 +b(ev)n(aluations)f(can)262 592 y(also)e(b)q(e)h(useful)h(during)e(a)h +(quiescence)i(searc)o(h)f(where)g(there)h(is)e(not)f(enough)i(time)d(for)i(a) +262 641 y(full)f(static)i(ev)n(aluation.)23 b(This)16 b(is)g(b)q(ecause)h(a)f +(quiescence)i(searc)o(h)f(also,)e(usually)g(o)q(ccurs)262 691 +y(at)e(the)i(horizon)e(no)q(des)i(of)e(the)i(main)d(searc)o(h.)324 +777 y(The)20 b(Pc/Sq)h(tables)f(explained)g(earlier)g(can)g(also)g(b)q +(ene\014t)h(from)e(an)h(incremen)o(tal)262 826 y(approac)o(h,)13 +b(to)h(close)g(the)h(gap)e(b)q(et)o(w)o(een)i(kno)o(wledge)f(storage)g(and)g +(application.)262 976 y Fu(3.2.4)55 b(Phases)19 b(of)g(Pla)n(y)262 +1088 y Fp(The)14 b(game)e(of)i(c)o(hess)h(consists)g(of)e(3)h(main)d(game)i +(phases:)324 1163 y Ff(\017)20 b Fp(The)15 b(Op)q(ening.)324 +1242 y Ff(\017)20 b Fp(The)15 b(Middle)e(game.)324 1321 y Ff(\017)20 +b Fp(The)15 b(Endgame.)262 1396 y(Di\013eren)o(t)22 b(ev)n(aluation)f +(criteria)h(are)g(applicable)f(at)h(di\013eren)o(t)h(phases)g(of)e(the)i +(game.)262 1446 y(Therefore,)f(it)e(is)g(imp)q(ortan)o(t)f(for)g(a)h(c)o +(hess)i(program)d(to)h(recognise)h(what)f(phase)h(the)262 1496 +y(game)12 b(is)i(in,)f(so)h(the)g(correct)i(ev)n(aluation)c(criteria)i(or)g +(w)o(eigh)o(tings)f(can)h(b)q(e)h(applied.)324 1581 y(In)i(practice)i(the)f +(game)e(phases)i(need)h(to)e(b)q(e)h(brok)o(en)g(do)o(wn)f(in)o(to)g(more)f +(detail,)i(so)262 1631 y(that)e(the)g(transition)g(b)q(et)o(w)o(een)i(phases) +f(is)f(not)g(large.)24 b(If)16 b(this)g(is)g(not)g(done,)h(there)g(will)262 +1681 y(b)q(e)e(cli\013s)f(in)h(the)g(ev)n(aluation)e(surface)j(where)f(a)g +(program)e(suddenly)i(b)q(ecomes)g(a)o(w)o(are)f(of)262 1731 +y(some)f(asp)q(ect)k(of)d(the)h(p)q(osition.)20 b(F)m(or)14 +b(example,)g(early)g(in)h(the)g(game)e(the)j(king)e(needs)i(to)262 +1781 y(sta)o(y)c(near)i(the)f(edge)h(of)e(the)i(b)q(oard)f(protected)i(b)o(y) +d(its)h(pieces.)19 b(As)14 b(the)f(game)f(progresses)262 1830 +y(ho)o(w)o(ev)o(er,)h(the)h(king)f(should)g(b)q(egin)h(to)f(b)q(e)i(mo)o(v)o +(ed)d(to)h(an)g(activ)o(e)h(p)q(osition)f(ready)h(for)f(the)262 +1880 y(endgame.)j(If)11 b(this)g(pro)q(cess)j(is)d(not)g(p)q(erformed)g +(gradually)m(,)f(the)i(program)e(ma)o(y)f(\014nd)j(itself)262 +1930 y(in)f(an)h(endgame)g(with)g(its)g(king)f(misplaced,)g(and)h(a)g(sudden) +h(realisation)f(that)g(things)g(are)262 1980 y(not)f(as)h(go)q(o)q(d)f(as)h +(predicted)h(b)o(y)f(the)g(ev)n(aluation)f(function)g(at)h(the)g(previous)g +(game)e(phase.)324 2065 y(Assume,)15 b(for)g(example,)e(w)o(e)j(ha)o(v)o(e)f +(8)f(game)g(phases,)i(then)g(new)g(ev)n(aluation)d(criteria)262 +2115 y(could)g(b)q(e)g(in)o(tro)q(duced)h(gen)o(tly)m(,)e(or)i(existing)f +(criteria)g(could)g(b)q(e)h(scaled)g(according)f(to)g(the)262 +2165 y(phase.)324 2250 y(The)h(game)e(phase)j(is)e(a)h(factor)f(of)g(the)i +(material)d(remaining)f(on)j(the)g(b)q(oard)g(and)f(can)262 +2300 y(therefore)f(b)q(e)f(easily)f(calculated,)h(although)f(deciding)h(when) +g(one)g(phase)g(should)g(end)g(and)262 2350 y(another)i(should)g(start)h(is)f +(more)g(di\016cult.)k(This)c(recognition)g(of)g(the)h(game)e(phase)i(m)o(ust) +262 2399 y(also)e(include)h(realising)f(when)i(p)q(ositional)d(factors)j(can) +f(b)q(e)h(ignored)e(and)h(the)h(opp)q(onen)o(ts)262 2449 y(king)f(can)h(b)q +(e)g(driv)o(en)g(to)g(c)o(hec)o(kmate.)957 2574 y(36)p eop +%%Page: 37 39 +37 38 bop 324 307 a Fp(The)14 b(game)f(phase)i(can)f(also)f(b)q(e)i(used)g +(to)f(encourage)h(the)f(program)f(to)h(trade)g(pieces)262 357 +y(when)g(ahead)g(in)f(material.)262 509 y Fu(3.2.5)55 b(Planning)262 +621 y Fp(Planning)19 b(pla)o(ys)h(an)g(imp)q(ortan)o(t)f(role)i(in)f(h)o +(uman)e(c)o(hess.)40 b(It)21 b(could)f(b)q(e)h(said)f(that)h(a)262 +670 y(program)d(is)i(con)o(tin)o(ually)f(planning)f(to)i(maximi)o(se)e(its)i +(ev)n(aluation)f(function's)h(score.)262 720 y(Ho)o(w)o(ev)o(er,)c(this)g +(often)g(leads)g(to)g(aimless)e(pla)o(y)m(,)h(w)o(aiting)f(for)i(the)g(opp)q +(onen)o(t)h(to)e(mak)o(e)g(a)262 770 y(mistak)o(e.)324 855 +y(A)20 b(plan)f(could)h(b)q(e)g(conceiv)o(ed)h(at)e(the)i(ro)q(ot)f(of)f(the) +h(tree)h(b)o(y)f(an)g(analysis)f(of)g(the)262 905 y(p)q(osition.)29 +b(Sp)q(eci\014c)19 b(goals)d(can)j(b)q(e)f(iden)o(ti\014ed,)g(suc)o(h)h(as)f +(a)f(king)g(side)h(pa)o(wn)g(rush,)h(for)262 955 y(example.)d(The)f(relev)n +(an)o(t)f(Pc/Sq)g(tables)g(and)g(static)h(ev)n(aluation)d(criteria)i(can)h(b) +q(e)f(giv)o(en)262 1005 y(w)o(eigh)o(tings)c(to)h(encourage)h(ac)o(hiev)o +(emen)o(t)f(of)f(these)j(goals.)j(F)m(or)11 b(example,)f(increasing)h(the)262 +1055 y(b)q(on)o(us)k(for)g(pushing)h(pa)o(wns)f(on)h(the)g(king)e(side.)23 +b(The)16 b(subsequen)o(t)i(searc)o(h)e(w)o(ould)f(then)262 +1104 y(b)q(e)h(biased)f(to)o(w)o(ards)h(selecting)g(mo)o(v)o(es)e(whic)o(h)h +(ac)o(hiev)o(e)h(these)h('sub{goals'.)k(T)m(o)15 b(further)262 +1154 y(encourage)20 b(the)g(use)g(of)e(a)h(consisten)o(t)i(plan,)e(the)h +(principle)f(v)n(ariation)f(from)f(the)j(last)262 1204 y(searc)o(h)15 +b(can)g(b)q(e)g(used)h(to)e(direct)h(the)h(curren)o(t)g(searc)o(h.)21 +b(Deviations)14 b(only)f(b)q(eing)i(allo)o(w)o(ed)262 1254 +y(when)f(they)g(are)h(clearly)e(sup)q(erior.)324 1339 y(Chess)k(programs)e +(generally)h(ha)o(v)o(e)f(no)h(problem)f(in)g(\014nding)h(the)h(correct)g(mo) +o(v)o(es)e(of)262 1389 y(com)o(binations)i(leading)i(to)g(a)h(gain)e(in)i +(material.)33 b(Ho)o(w)o(ev)o(er,)21 b(they)f(\014nd)g(it)f(far)h(more)262 +1439 y(di\016cult)13 b(to)g(create)j(p)q(ositions)d(where)i(suc)o(h)g(com)o +(binations)d(exist.)262 1611 y Fr(3.3)69 b(Learning)262 1738 +y Fp(The)14 b(Learning)g(pro)q(cess)h(can)f(b)q(e)h(split)e(in)o(to)g(5)h +(main)e(categories:)324 1821 y Ff(\017)20 b Fp(Rote)14 b(Learning.)324 +1904 y Ff(\017)20 b Fp(Advice)15 b(T)m(aking.)324 1987 y Ff(\017)20 +b Fp(Induction.)324 2070 y Ff(\017)g Fp(Learning)14 b(b)o(y)g(Analogy)m(.)324 +2153 y Ff(\017)20 b Fp(P)o(arameter)14 b(Adjustmen)o(t.)262 +2236 y(The)e(\014rst)h(four)f(categories)h(are)g(directly)g(related)g(to)f +(the)h(w)o(a)o(y)e(h)o(umans)g(learn.)18 b(The)12 b(\014nal)262 +2286 y(category)f(is)g(deriv)o(ed)g(more)f(from)f(the)i(w)o(a)o(y)g(programs) +e(mak)o(e)h(decisions)h(than)g(the)g(h)o(uman)262 2336 y(learning)i(pro)q +(cess.)957 2574 y(37)p eop +%%Page: 38 40 +38 39 bop 262 307 a Fu(3.3.1)55 b(Rote)18 b(Learning)262 419 +y Fp(This)12 b(is)h(the)g(simplest)e(form)g(of)h(mac)o(hine)g(learning.)17 +b(It)12 b(in)o(v)o(olv)o(es)g(the)h(recording)g(of)f(data,)262 +469 y(and)h(use)i(of)e(that)h(same)f(data)h(when)g(faced)g(with)g(exactly)g +(the)g(same)f(situation)h(again.)324 554 y(Most)i(c)o(hess)h(programs)e(use)i +(what)e(is)h(kno)o(wn)f(as)h(an)g("Op)q(ening)g(Bo)q(ok".)23 +b(This)16 b(is)g(a)262 604 y(database)i(of)g(pre-stored)h(op)q(ening)f(lines) +h(of)e(pla)o(y)g(whic)o(h)i(are)f(lo)q(ok)o(ed)g(up)g(and)g(pla)o(y)o(ed)262 +654 y(automatically)12 b(while)k(the)g(t)o(w)o(o)g(pla)o(y)o(ers)g(stic)o(k)g +(to)g(the)h(stored)g(op)q(ening)e(line)h(of)f(mo)o(v)o(es.)262 +704 y(In)h(more)g(sophisticated)i(c)o(hess)g(programs,)e(p)q(ositions)h(and)g +(mo)o(v)o(es)e(are)j(stored,)g(rather)262 754 y(than)c(lines)h(of)g(mo)o(v)o +(es.)20 b(This)15 b(enables)g(a)g(transp)q(osition)g(of)f(mo)o(v)o(es)g(to)h +(b)q(e)h(detected)h(and)262 803 y(allo)o(ws)11 b(mo)o(v)o(es)f(to)j(b)q(e)f +(pla)o(y)o(ed)g(whenev)o(er)i(a)e('kno)o(wn')f(p)q(osition)g(is)h(reac)o +(hed.)19 b(The)13 b(op)q(ening)262 853 y(b)q(o)q(ok)i(is)g(v)o(ery)g(useful)h +(for)f(a)o(v)o(oiding)e(op)q(ening)i(traps,)h(sa)o(ving)e(time)g(and)h +(making)e(mo)o(v)o(es)262 903 y(of)h(a)h(v)o(ery)g(high)g(standard)g(whic)o +(h)g(ha)o(v)o(e)g(y)o(ears)h(of)f(theory)g(and)g(practice)h(b)q(ehind)g +(them.)262 953 y(Ob)o(viously)i(this)i(tec)o(hnique)g(can)f(only)g(co)o(v)o +(er)h(the)g(\014rst)g(few)f(mo)o(v)o(es)f(of)h(a)g(game,)g(an)o(y)262 +1003 y(deviation)13 b(causing)g(the)i(program)d(to)i('think')e(for)i(itself.) +324 1088 y(V)m(arious)i(endgame)f(databases)i(ha)o(v)o(e)f(also)g(b)q(een)i +(created)g(for)e(elemen)o(tary)f(endings)262 1138 y(suc)o(h)g(as)f(king)g +(and)g(pa)o(wn)h(against)e(king.)20 b(When)14 b(database)h(p)q(ositions)f +(are)h(reac)o(hed)h(the)262 1187 y(program)f(can)i(simply)e(lo)q(ok)i(up)g +(the)h(correct)g(mo)o(v)o(e)e(and)h(pla)o(y)f(it.)28 b(I)17 +b(b)q(eliev)o(e)g(for)g(suc)o(h)262 1237 y(simple)12 b(endings,)i(heuristics) +i(can)e(b)q(e)h(dev)o(elop)q(ed)g(whic)o(h)f(will)e(allo)o(w)h(correct)j(pla) +o(y)d(using)262 1287 y(searc)o(h)i(rather)f(than)g(massiv)o(e)f(storage.)324 +1372 y(A)h(more)e(v)o(ersatile)i(tec)o(hnique)h(has)f(b)q(een)g(suggested)i +(b)o(y)d(Da)o(vid)f(Slate)i([58)o(])f(of)g(Chess)262 1422 y(4.5)h(fame.)20 +b(Slate)15 b(suggests)h(a)f(metho)q(d)f(b)o(y)h(whic)o(h)g(a)g(transp)q +(osition)g(table)g(can)g(b)q(e)h(used)262 1472 y(to)d(enable)g(a)g(c)o(hess)i +(program)d(to)h(learn)g(from)f(its)h(exp)q(erience.)20 b(The)14 +b(idea)f(b)q(eing)g(to)h(store)262 1522 y(p)q(ositions)e(where)h(the)h +(program's)c(ev)n(aluation)i(c)o(hanges)h(dramatically)m(.)h(This)f(allo)o +(ws)e(the)262 1572 y(program)h(to)j(a)o(v)o(oid)e(falling)f(in)o(to)i(the)h +(same)f(trap)g(again.)19 b(This)14 b(is)h(of)e(most)h(use)h(in)f(non{)262 +1621 y(b)q(o)q(ok)i(op)q(ening)h(p)q(ositions)g(whic)o(h)f(ma)o(y)f(b)q(e)j +(encoun)o(tered)h(in)d(another)i(game.)26 b(Fidelit)o(y)262 +1671 y(Electronics)14 b(are)f(using)g(a)f(similar)f(tec)o(hnique)i(in)g(one)g +(of)f(their)i(latest)f(commercial)d(c)o(hess)262 1721 y(mac)o(hines)i([21].) +262 1873 y Fu(3.3.2)55 b(Advice)18 b(T)-5 b(aking)262 1985 +y Fp(Advice)16 b(taking)f(c)o(hess)i(programs)e(require)h(the)h(gap)e(b)q(et) +o(w)o(een)i(the)g(programmi)o(ng)c(lev)o(el)262 2035 y(and)e(a)h(c)o(hess)i +(masters)e(kno)o(wledge)g(to)f(b)q(e)i(bridged)f(b)o(y)g(some)f(high)h(lev)o +(el)f(c)o(hess)j(language.)324 2120 y(Most)c(notably)g(Zobrist)g(and)g +(Carlson)g([64)o(])g(dev)o(elop)q(ed)g(suc)o(h)h(a)f(t)o(yp)q(e)h(of)e +(advice)h(taking)262 2170 y(program.)15 b(The)e(program)e(w)o(as)h(tutored)h +(b)o(y)g(Charles)f(Kalme,)f(a)h(US)h(Senior)f(Chess)i(Mas-)262 +2219 y(ter.)22 b(The)15 b('Chess)h(Language')e(used)i(w)o(as)f(relativ)o(ely) +g(sophisticated,)g(but)h(still)e(required)262 2269 y(mathematical)f(w)o(eigh) +o(ts)18 b(to)f(b)q(e)g(assigned)h(to)f(patterns.)29 b(Ho)o(w)o(ev)o(er,)18 +b(c)o(hess)h(masters)e(do)262 2319 y(not)d(consciously)h(conceptualise)h(p)q +(ositions)f(in)f(this)h(w)o(a)o(y)m(.)20 b(Therefore,)c(the)g(advice)f(that) +262 2369 y(can)f(b)q(e)g(giv)o(en)g(is)f(somewhat)g(di\016cult)g(to)h(assign) +g(discrete)h(w)o(eigh)o(tings)f(to.)957 2574 y(38)p eop +%%Page: 39 41 +39 40 bop 324 307 a Fp(The)21 b(program)d(only)i(con)o(tained)g(50)g +(patterns.)39 b(Researc)o(h)22 b(done)e(b)o(y)g(Simon)f(and)262 +357 y(Gilmarti)o(n)13 b([55)o(])j(indicates)g(that)g(a)f(grandmaster)h(has)g +(a)f(v)o(o)q(cabulary)g(of)h(ab)q(out)f(50,000)262 407 y(c)o(hess)i +(patterns.)26 b(Therefore,)17 b(it)f(is)g(not)g(surprising)g(that)h(Zobrist)f +(and)g(Carlson's)g(pro-)262 457 y(gram)c(only)h(p)q(erformed)g(at)h(the)h(no) +o(vice)e(lev)o(el.)262 608 y Fu(3.3.3)55 b(Induction)262 720 +y Fp(A)10 b(n)o(um)o(b)q(er)g(of)g(attempts)g(ha)o(v)o(e)g(b)q(een)i(made)d +(to)h(use)i(induction)e(in)g(c)o(hess)i(programs.)j(Most)262 +770 y(in)o(v)o(olv)o(ed)f(the)j(narro)o(w)f(domain)e(of)i(simple)f(endings)h +(suc)o(h)h(as)g(king)e(and)h(pa)o(wn)g(against)262 820 y(king)11 +b([54)o(].)17 b(Giv)o(en)12 b(a)g(relativ)o(ely)g(large)g(n)o(um)o(b)q(er)g +(of)g(training)f(ev)o(en)o(ts,)j(suc)o(h)f(programs)e(are)262 +870 y(able)16 b(to)g(use)i(induction)e(on)g(a)g(set)i(of)e(kno)o(wn)g +(predicates)i(in)e(order)h(to)g(deriv)o(e)g(a)f(set)h(of)262 +919 y(form)o(ulas.)e(The)d(programs)f(are)h(then)h(able)f(to)f(deal)h(with)g +(suc)o(h)g(endings)h(with)e(80)h(to)g(90\045)262 969 y(success.)21 +b(Ho)o(w)o(ev)o(er,)15 b(a)f(10)g(to)g(20\045)f(lev)o(el)i(of)e(incorrect)j +(pla)o(y)m(,)d(esp)q(ecially)h(in)g(suc)o(h)h(simple)262 1019 +y(endings,)e(is)h(not)g(adequate)g(in)g(tournamen)o(t)f(programs.)324 +1104 y(Stev)o(en)f(Skiena)g(states)h(in)e([57)o(],)g("When)h(more)f(complex)f +(endgames)h(are)i(considered,)262 1154 y(increasingly)19 b(larger)i(n)o(um)o +(b)q(er)e(of)h(predicates)h(will)e(b)q(e)i(needed,)i(un)o(til)c(forms)g(of)h +(con-)262 1204 y(structiv)o(e)d(induction)e(or)h(feature)h(formation)c(are)j +(necessary)m(.)26 b(Systems)16 b(for)f(signi\014can)o(t)262 +1254 y(constructiv)o(e)g(induction)e(simply)f(do)i(not)g(exist.".)262 +1405 y Fu(3.3.4)55 b(Learning)18 b(b)n(y)g(Analogy)262 1517 +y Fp(Learning)10 b(b)o(y)g(analogy)e(is)j(probably)e(the)i(most)e(p)q(o)o(w)o +(erful)h(metho)q(d)g(applicable)f(to)h(pla)o(ying)262 1567 +y(c)o(hess.)19 b(Unfortunately)14 b(it)f(is)h(also)f(v)o(ery)i(di\016cult)e +(to)g(ac)o(hiev)o(e)i(on)e(a)h(mac)o(hine.)324 1652 y(It)h(has)f(b)q(een)i +(found)e(b)o(y)h(de)g(Gro)q(ot)f([16)o(])h(that)f(grandmasters)h(notice)g +(similarities)d(in)262 1702 y(piece)20 b(placemen)o(t,)f(square)h(con)o(trol) +e(and)h(pressure.)36 b(These)21 b(concepts)g(are)e(kno)o(wn)g(to)262 +1752 y(strong)14 b(pla)o(y)o(ers)g(in)g(the)h(form)e(of)h(patterns,)h(mo)o(v) +o(es)e(and)h(goals.)19 b(No)14 b(ma)r(jor)e(w)o(ork)i(seems)262 +1802 y(to)k(ha)o(v)o(e)g(b)q(een)i(done)e(in)g(this)h(imp)q(ortan)o(t)d +(area.)32 b(This)19 b(seems)f(to)g(me)g(to)g(b)q(e)h(a)f(ma)r(jor)262 +1851 y(omission,)11 b(if)i(kno)o(wledge)h(based)g(programs)f(are)h(to)g +(succeed)i(in)d(reac)o(hing)h(master)g(lev)o(el.)262 2003 y +Fu(3.3.5)55 b(P)n(arameter)17 b(Adjustmen)n(t)262 2115 y Fp(This)9 +b(t)o(yp)q(e)i(of)e(learning)g(in)o(v)o(olv)o(es)g(adjusting)g(the)i(w)o +(eigh)o(ts)f(applied)f(to)h(ev)n(aluation)e(criteria)262 2165 +y(in)h(the)h(ligh)o(t)f(of)g(exp)q(erience.)19 b(Those)10 b(criteria)g(whic)o +(h)g(lead)f(to)h(impro)o(v)o(ed)e(p)q(erformance)h(are)262 +2214 y(increased,)18 b(whereas)f(those)h(criteria)f(whic)o(h)f(deteriorate)i +(p)q(erformance)e(are)h(decreased)262 2264 y(or)c(discarded)i(altogether.)324 +2350 y(The)22 b(most)e(notable)h(example)f(of)h(this)g(t)o(yp)q(e)h(of)f(mac) +o(hine)f(learning)g(is)h(Sam)o(uel's)262 2399 y(draugh)o(ts)c(program)f([48)o +(,)h(49)o(].)29 b(Ho)o(w)o(ev)o(er,)18 b(c)o(hess)h(is)e(a)g(far)g(more)g +(complex)f(game)g(than)262 2449 y(draugh)o(ts.)26 b(In)17 b(1961,)e(Max)i(Eu) +o(w)o(e,)g(ex{w)o(orld)f(c)o(hess)i(c)o(hampion,)d(set)j(up)e(a)h(commi)o +(ttee)957 2574 y(39)p eop +%%Page: 40 42 +40 41 bop 262 307 a Fp([20)o(])15 b(to)h(explore)g(the)h(p)q(ossibilities)f +(of)f(applying)g(Sam)o(uel's)f(tec)o(hniques)j(to)f(c)o(hess.)26 +b(The)262 357 y(commi)o(ttee)16 b(concluded)j(that)f(for)f(c)o(hess)j(Sam)o +(uel's)c(tec)o(hniques)j("w)o(ould)e(ha)o(v)o(e)g(to)h(deal)262 +407 y(not)f(with)h(31)g(comp)q(onen)o(t)f(n)o(um)o(b)q(ers)g(but)i(with)e(31) +h(millio)o(n)d(or)j(ev)o(en)h(more")e([28)o(].)30 b(In)262 +457 y(other)14 b(w)o(ords)g(the)h(tec)o(hniques)g(are)f(impractical)e(for)i +(c)o(hess.)324 542 y(More)h(recen)o(tly)h(Thomas)d(Nitsc)o(he)j([45)o(])e +(has)h(exp)q(erimen)o(ted)g(with)g(a)f(learning)g(c)o(hess)262 +592 y(program)9 b(whic)o(h)i(adjusts)h(its)f(o)o(wn)g(parameters)g(using)g +(linear)g(regression.)19 b(The)11 b(program)262 641 y(is)i(capable)h(of)f +(learning)h(from)e(three)j(di\013eren)o(t)g(sources:)324 725 +y Ff(\017)20 b Fp(Analysing)13 b(Master)i(Games.)324 808 y +Ff(\017)20 b Fp(Pla)o(ying)13 b(against)g(Human)f(Opp)q(osition.)324 +891 y Ff(\017)20 b Fp(Pla)o(ying)13 b(against)g(itself.)262 +974 y(Suc)o(h)18 b(tec)o(hniques)i(ha)o(v)o(e)e(not)g(b)q(een)h(generally)f +(successful)i(in)e(comp)q(etitiv)o(e)f(c)o(hess)j(pro-)262 +1023 y(grams.)k(I)17 b(b)q(eliev)o(e)g(the)g(reason)g(for)g(this)f(is)h(that) +f(most)g(ev)n(aluation)f(functions)i(are)g(not)262 1073 y(made)e(up)j(of)e +(simple)f(linear)i(features)h(as)f(used)h(b)o(y)f(Nitsc)o(he.)29 +b(Therefore)18 b(making)d(this)262 1123 y(t)o(yp)q(e)f(of)f(learning)g(m)o +(uc)o(h)g(more)g(di\016cult)g(to)h(apply)m(.)324 1208 y(In)9 +b(conclusion,)h(I)f(think)h(the)g(amoun)o(t)d(of)i(learning)g(necessary)i +(for)f(a)f(program)f(to)h(reac)o(h)262 1258 y(a)i(high)h(lev)o(el)g(of)g +(abilit)o(y)e(has)j(b)q(een)g(sev)o(erely)g(under{estimated.)18 +b(Simon)10 b(and)i(Chase)h([56)o(])262 1308 y(found)19 b(that)h(it)g(tak)o +(es)g(a)g(pla)o(y)o(er)f(ab)q(out)h(a)g(decade)h(of)e(in)o(tense)i(pre{o)q +(ccupation)g(with)262 1358 y(pla)o(ying)11 b(c)o(hess)j(to)f(b)q(ecome)g(a)g +(grandmaster.)k(Humans)12 b(are)h(sup)q(erb)i(learners,)f(mac)o(hines)262 +1408 y(are)19 b(clearly)h(not.)34 b(It)20 b(therefore)g(follo)o(ws)e(that)i +(it)f(will)f(tak)o(e)h(success)j(in)d(most)f(of)h(the)262 1457 +y(categories)e(outlined)f(in)g(this)g(section)i(together)f(with)f(at)g(least) +h(a)f(decade)i(of)e(full)f(time)262 1507 y(w)o(ork,)9 b(advice)h(and)f +(training)g(to)g(pro)q(duce)i(a)e(learning,)g(kno)o(wledge{based)h(c)o(hess)h +(program)262 1557 y(an)o(ywhere)j(near)g(the)h(grandmaster)e(lev)o(el.)262 +1730 y Fr(3.4)69 b(Time)21 b(Con)n(trol)262 1856 y Fp(Chess)11 +b(clo)q(c)o(ks)g(are)g(used)h(in)e(comp)q(etitiv)o(e)g(c)o(hess)i(to)e(allo)o +(w)f(fair)h(allo)q(cation)f(of)h(time)g(to)g(eac)o(h)262 1906 +y(pla)o(y)o(er)j(for)h(the)h(game.)i(Both)d(pla)o(y)o(ers)g(m)o(ust)f(then)i +(conform)d(to)i(a)g(set)h(of)e(time)g(con)o(trols.)262 1956 +y(In)f(tournamen)o(t)g(c)o(hess)h(the)h(general)e(time)f(con)o(trol)i(is)f +(40)g(mo)o(v)o(es)f(in)h(2)g(hours)h(follo)o(w)o(ed)e(b)o(y)262 +2005 y(20)g(mo)o(v)o(es)g(in)h(ev)o(ery)h(subsequen)o(t)g(hour.)18 +b(Some)11 b(time)g(con)o(trols)h(can)g(b)q(e)h("sudden)g(death",)262 +2055 y(e.g.)k(all)c(mo)o(v)o(es)g(in)g(30)g(min)o(utes.)324 +2141 y(An)o(y)j(c)o(hess)h(program)e(written)h(to)g(comp)q(ete)g(with)g(h)o +(umans)f(or)h(other)g(programs)f(in)262 2190 y(tournamen)o(t)e(games)h(m)o +(ust)g(therefore)i(ha)o(v)o(e)e(an)h(algorithm)d(to)i(con)o(trol)h(its)f +(time)g(usage.)262 2240 y(The)g(time)f(sp)q(en)o(t)i(on)e(eac)o(h)i(mo)o(v)o +(e)d(do)q(es)j(not)f(ha)o(v)o(e)f(to)h(b)q(e)h(constan)o(t,)f(in)f(fact)h(it) +g(is)g(prefer-)262 2290 y(able)g(that)h(it)f(is)h(not.)20 b(It)15 +b(is)g(wise)g(to)g(pla)o(y)e(ob)o(vious)h(or)h(forced)h(mo)o(v)o(es)d(quic)o +(kly)h(and)h(tak)o(e)262 2340 y(longer)i(on)h(more)f(di\016cult)g(mo)o(v)o +(es.)28 b(Therefore,)20 b(a)d(sophisticated)i(time)d(con)o(trol)i(algo-)262 +2390 y(rithm)11 b(m)o(ust)h(detect)i(these)g(cases)h(and)d(allo)q(cate)g(its) +h(time)f(appropriately)m(.)k(I)d(b)q(eliev)o(e)g(it)g(is)262 +2439 y(also)g(part)h(of)f(suc)o(h)i(an)f(algorithms)d(resp)q(onsibilit)o(y)j +(to)g(detect)h(when)g(the)f(horizon)g(e\013ect)957 2574 y(40)p +eop +%%Page: 41 43 +41 42 bop 262 307 a Fp(ma)o(y)11 b(b)q(e)j(o)q(ccurring)f(and)g(allo)q(cate)g +(enough)g(time)f(where)i(p)q(ossible)g(to)f(see)h(o)o(v)o(er)f(the)h(hori-) +262 357 y(zon.)k(T)m(o)13 b(ac)o(hiev)o(e)h(these)h(aims,)c(the)k(algorithm)c +(m)o(ust)h(kno)o(w)i(what)f(scores)j(the)e(searc)o(h)h(is)262 +407 y(calculating)10 b(at)i(eac)o(h)g(iteration)f(and)h(the)g(state)h(of)e +(the)i(searc)o(h)f(at)g(a)g(giv)o(en)f(p)q(oin)o(t)g(in)g(time.)324 +492 y(Time)j(con)o(trol)h(problems)f(are)i(eased)h(b)o(y)e(the)h(use)g(of)f +(iterativ)o(e)g(deep)q(ening)i(b)q(ecause)262 542 y(of)c(the)j(con)o(tin)o +(uous)e(a)o(v)n(ailabili)o(t)o(y)e(of)i(the)h(b)q(est)h(mo)o(v)o(e)d(found)h +(so)g(far.)20 b(The)15 b(time)e(used)j(up)262 592 y(thinking)g(ab)q(out)i +(the)h(curren)o(t)g(mo)o(v)o(e)d(m)o(ust)h(b)q(e)i(c)o(hec)o(k)o(ed)g +(regularly)e(against)g(the)i(time)262 641 y(allo)q(cation)14 +b(to)j(a)o(v)o(oid)e(the)i(p)q(ossibilities)f(of)g(o)o(v)o(er)g(using)h(time) +e(or)h(ev)o(en)i(losing)d(on)h(time.)262 691 y(Unfortunately)m(,)g(it)g(is)g +(not)h(enough)f(to)h(c)o(hec)o(k)g(the)g(time)f(after)g(eac)o(h)h(iteration)f +(or)h(ev)o(en)262 741 y(after)f(eac)o(h)h(\014rst)g(lev)o(el)g(branc)o(h.)26 +b(This)16 b(is)g(b)q(ecause)i(some)e(branc)o(hes)i(ma)o(y)c(tak)o(e)j(a)f +(large)262 791 y(amoun)o(t)c(of)j(time)e(to)h(searc)o(h.)22 +b(Therefore,)16 b(a)e(successful)j(time)c(con)o(trol)i(algorithm)d(m)o(ust) +262 841 y(b)q(e)g(closely)f(link)o(ed)g(to)h(the)g(actual)f(tree)i(searc)o(h) +g(mec)o(hanism)c(at)j(all)e(but)i(the)h(v)o(ery)f(deep)q(est)262 +891 y(lev)o(els)h(of)h(the)g(tree.)324 976 y(During)h(m)o(y)g(researc)o(h)j +(I)e(ha)o(v)o(e)g(noticed)g(a)g(distinct)h(lac)o(k)e(of)h(published)g +(material)e(in)262 1026 y(this)f(area.)18 b(The)13 b(articles)h(b)o(y)f(R.)f +(Hy)o(att)h([30])f(and)h(H.)g(Berliner)h([7])e(are)i(the)g(only)e(articles) +262 1075 y(of)j(an)o(y)g(substance)i(in)f(this)g(area.)23 b(I)16 +b(\014nd)g(this)g(rather)g(surprising)g(b)q(ecause)i(as)e(I)f(see)i(it,)262 +1125 y(this)c(is)h(an)g(imp)q(ortan)o(t)e(elemen)o(t)h(of)h(an)o(y)f(strong)h +(c)o(hess)i(program.)957 2574 y(41)p eop +%%Page: 42 44 +42 43 bop 262 654 a Fn(Chapter)34 b(4)262 897 y Fo(The)39 b(Ev)-7 +b(aluation)42 b(F)-10 b(unction)262 1148 y Fp(In)11 b(this)g(c)o(hapter)h(I)f +(will)f(de\014ne)i(and)f(explain)f(the)i(heuristics)g(I)g(consider)g(to)f(b)q +(e)g(imp)q(ortan)o(t)262 1198 y(in)h(assessing)j(the)f(merits)e(of)h(a)g(c)o +(hess)i(p)q(osition.)i(I)d(in)o(tend)f(to)g(implemen)o(t)e(these)k(ideas)e +(in)262 1248 y(a)g(new)h(c)o(hess)i(program)c(called)i("HIAR)o(CS)f(5.0".)324 +1333 y(I)e(hop)q(e)h(to)f(pro)q(duce)h(an)f(ev)n(aluation)f(function)h(whic)o +(h)g(has)g(the)h(p)q(ositional)e(kno)o(wledge)262 1383 y(at)j(or)g(near)g +(the)h(exp)q(ert)h(lev)o(el)e(\(2000)f(ELO\).)h(It)g(w)o(ould)g(normally)d +(tak)o(e)k(a)e(h)o(uman)g(pla)o(y)o(er)262 1433 y(some)17 b(5)h(y)o(ears)g +(of)g(in)o(tensiv)o(e)g(c)o(hess)i(exp)q(erience)g(and)e(learning)g(to)g(ac)o +(hiev)o(e)g(this)g(lev)o(el.)262 1483 y(Therefore,)f(m)o(y)e(aim)f(to)i +(instill)f(enough)i(kno)o(wledge)f(in)g(a)g(program)f(within)g(the)i(short) +262 1532 y(p)q(erio)q(d)12 b(of)f(time)f(a)o(v)n(ailable)g(for)h(this)h(pro)r +(ject)h(is)f(daun)o(ting.)k(Ho)o(w)o(ev)o(er,)c(I)g(can)g(dra)o(w)g(on)f(m)o +(y)262 1582 y(o)o(wn)j(exp)q(erience)j(of)e(tournamen)o(t)f(c)o(hess)j(and)e +(the)g(exp)q(eriences)j(of)c(some)h(great)g(master)262 1632 +y(pla)o(y)o(ers)e(who)f(ha)o(v)o(e)h(written)h(ab)q(out)f(c)o(hess)i +(strategy)m(.)j(In)13 b(particular,)f(the)i(famous)d(b)q(o)q(oks)262 +1682 y("My)j(System")h(and)g("Chess)h(Praxis")f(b)o(y)g(Aron)h(Nimzo)o(witsc) +o(h)e([43)o(,)g(44])h(con)o(tain)f(some)262 1732 y(v)o(ery)h(deep)g(though)o +(ts)g(on)g(p)q(ositional)e(and)i(strategic)h(pla)o(y)m(.)j(Therefore,)d(I)f +(will)e(use)j(suc)o(h)262 1781 y(ideas)e(to)f(help)h(dev)o(elop)g(heuristics) +h(to)f(ev)n(aluate)f(p)q(ositions.)324 1867 y(As)f(I)g(see)h(it,)e(there)i +(are)f(three)h(main)d(problems)g(facing)h(the)i(dev)o(elopmen)o(t)d(of)i(a)f +('go)q(o)q(d')262 1916 y(ev)n(aluation)h(function:)324 1999 +y Ff(\017)20 b Fp(Determining)13 b Fl(whic)o(h)f Fp(criteria)i(are)h(imp)q +(ortan)o(t.)324 2083 y Ff(\017)20 b Fp(Deciding)14 b Fl(when)f +Fp(the)h(criteria)h(are)f(imp)q(ortan)o(t.)324 2166 y Ff(\017)20 +b Fp(Deciding)14 b Fl(what)f Fp(the)i(relativ)o(e)e(merits)h(of)f(eac)o(h)h +(criterion)h(should)e(b)q(e.)262 2249 y(It)h(is)g(vital)e(to)i(get)h(all)d +(three)k(of)d(these)j(asp)q(ects)f('righ)o(t'.)i(F)m(or)d(example,)e(a)i +(program)f(ma)o(y)262 2298 y(kno)o(w)i(that)g(bishops)h(are)g(strong)g(in)f +(some)g(p)q(ositions.)22 b(Ho)o(w)o(ev)o(er,)16 b(if)f(it)g(do)q(es)i(not)e +(kno)o(w)262 2348 y(with)10 b(accuracy)j(when)f(those)g(p)q(ositions)f(o)q +(ccur,)h(it)f(cannot)h(apply)e(its)h(ev)n(aluation)f(criteria)262 +2398 y(e\013ectiv)o(ely)m(.)20 b(There)c(are)f(no)f(p)q(erfect)j(answ)o(ers,) +e(often)g(ev)n(aluation)e(criteria)i(ma)o(y)e(con)o(tra-)262 +2448 y(dict)j(eac)o(h)g(other)h(b)q(ecause)h(of)e(an)f(inevitable)h(in)o +(teraction)g(and)g(o)o(v)o(erlap)g(b)q(et)o(w)o(een)h(eac)o(h)957 +2574 y(42)p eop +%%Page: 43 45 +43 44 bop 262 307 a Fp(t)o(yp)q(e)15 b(of)g(c)o(hess)i(kno)o(wledge)e +(represen)o(ted.)25 b(Therefore,)17 b(eac)o(h)f(criterion)g(is)f(not)g(indep) +q(en-)262 357 y(den)o(t)i(in)f(its)h(o)o(wn)f(righ)o(t,)g(but)h(m)o(ust)f(b)q +(e)h(considered)h(with)e(all)g(other)h(relev)n(an)o(t)g(criteria.)262 +407 y(Hence,)e(the)h(relativ)o(e)e(w)o(eigh)o(ting)g(for)g(eac)o(h)h(asp)q +(ect)h(of)f(ev)n(aluation)e(is)h(imp)q(ortan)o(t.)19 b(Ho)o(w-)262 +457 y(ev)o(er,)f(the)g(criteria)f(can)h(only)e(b)q(e)i(considered)g(correct)h +(in)e(a)g(statistical)g(sense,)i(not)e(an)262 506 y(absolute)c(sense.)324 +592 y(These)k(three)f(main)e(problem)g(areas)i(m)o(ust)e(b)q(e)i(considered)h +(when)f(dev)o(eloping)f(eac)o(h)262 641 y(heuristic.)36 b(Dev)o(eloping)19 +b(an)h(ev)n(aluation)e(function)i(is)f(a)h(v)o(ery)g(iterativ)o(e)g(pro)q +(cess.)38 b(In)262 691 y(the)16 b(ligh)o(t)e(of)h(seeing)h(a)f(program)f(pla) +o(y)h(the)h(game,)e(the)i(heuristics)h(will)d(b)q(e)i(con)o(tin)o(ually)262 +741 y(ev)o(olv)o(ed.)22 b(This)15 b(\014ts)h(in)f(w)o(ell)g(with)g(the)h +(equiv)n(alen)o(t)e(h)o(uman)g(pro)q(cess)j(where)g(kno)o(wledge)262 +791 y(is)e(con)o(tin)o(ually)f(in)i(a)f(state)i(of)e(ev)o(olution,)g +(although)g(this)g(is)h(an)g(automatic)d(pro)q(cess)18 b(in)262 +841 y(the)c(case)h(of)e(a)h(h)o(uman)e(pla)o(y)o(er.)324 926 +y(The)f(ev)n(aluation)f(function)h(will)e(deal)i(with)f(the)i(op)q(ening,)f +(middle)e(game)h(and)g(general)262 976 y(endgame)15 b(to)i(allo)o(w)e(a)i +(program)e(to)i(pla)o(y)f(the)h(en)o(tire)h(game.)26 b(Kno)o(wledge)17 +b(for)f(sp)q(eci\014c)262 1026 y(endgames,)j(suc)o(h)h(as)g(bishop)f(v)o +(ersus)h(knigh)o(t)f(endings,)h(will)e(b)q(e)i(omitted)e(b)q(ecause)j(of)262 +1075 y(time)12 b(constrain)o(ts.)20 b(Ho)o(w)o(ev)o(er,)14 +b(their)g(implemen)o(tation)d(is)j(just)g(a)g(matter)g(of)f(applying)g(a)262 +1125 y(similar)e(approac)o(h)j(to)g(that)f(whic)o(h)h(I)g(am)e(applying)h(to) +g(the)i(more)e(general)h(cases.)324 1210 y(The)f(ev)n(aluation)f(criteria)i +(will)d(b)q(e)j(de\014ned)g(in)f(a)g(formal)d(manner,)i(using)h(b)q(oth)h +(func-)262 1260 y(tional)8 b(and)j(algorithmi)o(c)d(descriptions)j(where)h +(appropriate.)17 b(T)m(o)9 b(raise)i(the)g(lev)o(el)e(of)h(c)o(hess)262 +1310 y(kno)o(wledge)i(whic)o(h)h(can)g(b)q(e)g(concisely)g(represen)o(ted)j +(b)o(y)c(the)h(de\014nitions,)g(I)g(ha)o(v)o(e)f(written)262 +1360 y(a)k(large)g(n)o(um)o(b)q(er)g(of)f(pseudo)j(co)q(de)f(functions.)26 +b(These)17 b(pre-de\014ned)h(functions)f(will)e(b)q(e)262 1410 +y(used)j(extensiv)o(ely)h(in)e(the)h(de\014nition)g(of)f(ev)n(aluation)f +(criteria.)30 b(A)18 b(full)f(description)h(of)262 1460 y(these)d(functions)f +(can)g(b)q(e)g(found)g(in)f(app)q(endix)h(B.)324 1545 y(The)g(ev)n(aluation)e +(function)i(m)o(ust)f(b)q(e)h(considered)h(as)f(a)g(whole.)j(The)e(p)q +(ositional)d(fea-)262 1595 y(tures)19 b(for)e(ev)o(en)i(a)f(single)f(t)o(yp)q +(e)i(of)e(piece)i(are)g(ev)n(aluated)e(o)o(v)o(er)h(a)g(n)o(um)o(b)q(er)f(of) +h(criteria.)262 1644 y(Therefore,)i(remem)o(b)q(er)e(the)i(criteria)f(are)g +(not)g(indep)q(enden)o(t,)i(but)e(closely)g(link)o(ed)f(to-)262 +1694 y(gether.)25 b(The)16 b(ev)n(aluation)e(criteria)i(ha)o(v)o(e)g(an)g +(a\013ect)h(on)e(b)q(oth)h(sides.)25 b(Therefore,)17 b(while)262 +1744 y(w)o(eaknesses)g(are)f(discouraged)g(from)e(one)i(sides)h(p)q(oin)o(t)e +(of)g(view,)h(their)g(creation)g(in)f(the)262 1794 y(opp)q(onen)o(ts)f(p)q +(osition)f(is)h(activ)o(ely)f(encouraged.)957 2574 y(43)p eop +%%Page: 44 46 +44 45 bop 262 307 a Fr(4.1)69 b(De\014nition)21 b(1)i(:)31 +b(Material)262 434 y Fp(Lik)o(e)20 b(all)f(other)i(c)o(hess)h(programs,)e(m)o +(y)f(ev)n(aluation)f(function)j(will)d(hold)i(material)f(as)262 +483 y(the)13 b(main)e(comp)q(onen)o(t.)16 b(Ho)o(w)o(ev)o(er,)d(unlik)o(e)f +(most)g(other)h(programs)f(this)h(will)e(not)i(b)q(e)g(the)262 +533 y(o)o(v)o(erriding)d(factor.)17 b(In)11 b(fact,)g(I)g(in)o(tend)g(to)g +(mak)o(e)f(the)i(ev)n(aluation)d(function)i(sophisticated)262 +583 y(enough)j(to)f(b)q(e)i(willing)c(to)j(giv)o(e)g(up)g(material)d(for)j +(go)q(o)q(d)f(p)q(ositional)g(comp)q(ensation.)324 668 y(T)m(raditional)j(c)o +(hess)j(b)q(o)q(oks)f(for)g(b)q(eginners)h(adv)o(o)q(cate)f(the)h(follo)o +(wing)d(appro)o(ximate)262 718 y(v)n(alues)c(for)f(eac)o(h)i(piece)g(:-)f(P)o +(a)o(wn,)g(1)g(p)q(oin)o(t;)g(Knigh)o(t,)f(3)h(p)q(oin)o(ts;)h(Bishop,)f(3)g +(p)q(oin)o(ts;)g(Ro)q(ok,)262 768 y(5)18 b(p)q(oin)o(ts;)j(Queen,)g(9)d(p)q +(oin)o(ts)h(and)g(King,)g Ff(1)p Fp(.)33 b(Ho)o(w)o(ev)o(er,)20 +b(these)g(piece)g(v)n(alues)e(w)o(ould)262 818 y(require)j(p)q(ositional)e(v) +n(alues)i(ha)o(ving)e(a)i(non)f(in)o(teger)i(represen)o(tation)g(in)e(most)g +(cases.)262 867 y(F)m(or)e(reasons)h(of)f(e\016ciency)m(,)i(most)e(con)o +(temp)q(orary)g(c)o(hess)i(programs)d(use)j(in)o(tegers)f(for)262 +917 y(p)q(ositional)13 b(as)i(w)o(ell)f(as)h(material)d(v)n(alues.)20 +b(Therefore,)c(I)f(prop)q(ose)g(to)g(use)h(a)e(basic)h(pa)o(wn)262 +967 y(v)n(alue)e(of)h(100.)19 b(This)14 b(pro)o(vides)h(a)f(p)q(ositional)f +(resolution)h(to)g(1/100)f(th)i(of)f(a)g(pa)o(wn.)19 b(The)262 +1017 y(v)n(alues)13 b(of)g(the)i(other)f(pieces)i(will)c(b)q(e)i(assigned)h +(relativ)o(e)e(to)h(this)g(basic)g(pa)o(wn)g(v)n(alue.)344 +1150 y Fh(M)5 b(T)413 1156 y Fe(col)469 1150 y Fp(=)513 1119 +y Fc(P)556 1130 y Fk(64)556 1163 y Fe(sq)q Fk(=1)734 1150 y +Fl(if)13 b Fp(\(Occup)o(y\([An)o(y],col,sq\)\))793 1203 y Fl(case)h +Fp(On\(sq\))h Fl(of)852 1253 y Fp(P)o(a)o(wn)136 b(:)18 b(P)o(a)o(wnV)m(alue) +852 1303 y(Knigh)o(t)110 b(:)18 b(Knigh)o(tV)m(alue)852 1353 +y(Bishop)112 b(:)18 b(BishopV)m(alue)852 1403 y(Ro)q(ok)140 +b(:)18 b(Ro)q(okV)m(alue)852 1452 y(Queen)122 b(:)18 b(QueenV)m(alue)852 +1502 y(King)148 b(:)18 b(KingV)m(alue)793 1552 y Fl(endcase)734 +1602 y(endif)344 1702 y(where)380 1751 y Fp(P)o(a)o(wnV)m(alue)152 +b(=)14 b(100)380 1801 y(Knigh)o(tV)m(alue)126 b(=)14 b(325)380 +1851 y(BishopV)m(alue)128 b(=)14 b(340)380 1901 y(Ro)q(okV)m(alue)156 +b(=)14 b(520)380 1951 y(QueenV)m(alue)138 b(=)14 b(960)380 +2000 y(KingV)m(alue)164 b(=)14 b(10000)262 2115 y(F)m(ew)20 +b(pla)o(y)o(ers)g(agree)h(on)f(the)h(relativ)o(e)f(merits)f(of)h(a)g(knigh)o +(t)g(and)g(bishop.)37 b(Both)20 b(are)262 2165 y(suited)c(to)g(di\013eren)o +(t)h(t)o(yp)q(es)g(of)f(p)q(osition.)23 b(My)16 b(o)o(wn)g(view)g(is)g(that)g +(programs)f(generally)262 2214 y(use)g(bishops)f(more)g(e\013ectiv)o(ely)h +(than)f(knigh)o(ts.)20 b(This)14 b(is)g(b)q(ecause)i(programs)e(pla)o(y)f(op) +q(en)262 2264 y(p)q(ositions)g(b)q(etter)j(than)e(closed)g(ones.)19 +b(Bishops)c(are)f(usually)f(stronger)i(than)f(knigh)o(ts)g(in)262 +2314 y(op)q(en)i(p)q(ositions)f(and)h(inferior)f(in)g(closed)i(p)q(ositions.) +23 b(Therefore)17 b(I)f(prop)q(ose)h(to)e(set)i(the)262 2364 +y(knigh)o(t)c(and)g(bishop)h(v)n(alues)g(to)f(325)h(and)f(340)g(p)q(oin)o(ts) +h(resp)q(ectiv)o(ely)m(.)324 2449 y(Ro)q(oks)j(are)i(particularly)e(strong)h +(pieces)i(when)e(giv)o(en)g(scop)q(e)h(e.g.)30 b(on)18 b(op)q(en)h(\014les.) +957 2574 y(44)p eop +%%Page: 45 47 +45 46 bop 262 307 a Fp(They)12 b(are)h(generally)e(w)o(orth)h(ab)q(out)g(a)g +(knigh)o(t)g(and)g(t)o(w)o(o)f(pa)o(wns.)18 b(I)12 b(will)f(use)h(a)g(ro)q +(ok)g(v)n(alue)262 357 y(of)h(520)g(p)q(oin)o(ts.)324 442 y(The)h(queen)g(is) +f(the)i(most)d(p)q(o)o(w)o(erful)h(piece)h(on)g(the)g(b)q(oard.)k(Its)c(scop) +q(e)g(and)g(con)o(tribu-)262 492 y(tion)e(to)h(tactical)g(c)o(hess)h(mak)o +(es)e(it)h(ideal)f(for)h(c)o(hess)h(programs.)j(T)m(o)12 b(re\015ect)j(this,) +e(I)f(in)o(tend)262 542 y(to)h(use)i(a)f(queen)g(v)n(alue)g(of)f(960)g(p)q +(oin)o(ts.)324 627 y(The)e(king)g(is)g(ob)o(viously)e(the)j(most)e(imp)q +(ortan)o(t)f(piece.)18 b(It's)12 b(capture)g(will)d(nev)o(er)k(o)q(ccur)262 +677 y(in)j(an)h(actual)f(game.)25 b(Ho)o(w)o(ev)o(er,)18 b(it)e(remains)g +(useful)h(to)g(assign)g(a)f(v)n(alue)g(to)h(re\015ect)i(its)262 +727 y(ultimate)12 b(imp)q(ortance.)17 b(I)d(will)e(use)j(a)e(v)n(alue)h(of)f +(10000)f(p)q(oin)o(ts.)324 812 y(It)k(m)o(ust)g(b)q(e)h(remem)o(b)q(ered)f +(these)i(v)n(alues)e(only)g(represen)o(t)j(the)e(basic)g(piece)g(v)n(alues.) +262 862 y(When)9 b(p)q(ositions)g(particularly)g(suited)h(to)f(certain)h(t)o +(yp)q(es)g(of)f(pieces)h(o)q(ccur,)h(the)f(p)q(ositional)262 +912 y(v)n(alue)15 b(of)h(the)g(relev)n(an)o(t)h(piece)g(will)e(increase)i(to) +f(re\015ect)i(its)e(added)h(imp)q(ortance)e(in)h(the)262 961 +y(curren)o(t)f(p)q(osition.)324 1047 y(A)22 b(total)f(material)e(v)n(alue)j +(will)e(b)q(e)i(main)o(tained)e(incremen)o(tally)g(throughout)i(the)262 +1096 y(searc)o(h,)c(for)f(reasons)h(of)f(e\016ciency)m(.)28 +b(This)18 b(allo)o(ws)e(the)h(curren)o(t)i(material)c(v)n(alue)i(to)g(b)q(e) +262 1146 y(almost)12 b(instan)o(tly)h(a)o(v)n(ailable)e(at)j(all)f(no)q(des)h +(of)g(the)g(tree,)h(in)o(terior)f(and)f(leaf.)p 641 1240 673 +5 v 641 1904 5 665 v 646 1323 a Fg(0Z0ZrskZ)646 1406 y(Zpo0Zpop)646 +1489 y(0ZpZ0Z0Z)646 1572 y(o0Z0l0Z0)646 1655 y(0Z0ZPZnZ)646 +1738 y(Z0M0L0Z0)646 1821 y(POPZ0OPO)646 1904 y(Z0ZRS0J0)p 1310 +1904 V 641 1908 673 5 v 266 2027 a Fp(Figure)h(4.1:)j Fl(Fidelit)o(y)c(68030) +i(v)h(HIAR)o(CS)g(4.1)p Fp(,)d(1989)g(Olympiad,)e(White)j(to)g(Pla)o(y)m(.) +324 2145 y(In)g(\014gure)g(4.1,)f(the)h(Material)f(totals)h(for)f(white)h +(and)g(blac)o(k)f(are)i(as)f(follo)o(ws:)344 2242 y Fh(M)5 +b(T)413 2248 y Fe(W)t(hite)533 2242 y Fp(=)14 b(13025)344 2292 +y Fh(M)5 b(T)413 2298 y Fe(B)q(lack)533 2292 y Fp(=)14 b(13025)957 +2574 y(45)p eop +%%Page: 46 48 +46 47 bop 262 307 a Fr(4.2)69 b(De\014nition)21 b(2)i(:)31 +b(Game)22 b(Phase)262 434 y Fp(As)14 b(already)f(explained,)g(it)h(is)f(imp)q +(ortan)o(t)f(to)i(split)f(the)i(game)d(in)o(to)h(phases,)h(so)g(that)g(the) +262 483 y(ev)n(aluation)c(criteria)j(can)f(b)q(e)h(applied)f(smo)q(othly)m(,) +e(th)o(us)j(a)o(v)o(oiding)d(notorious)i(cli\013s)g(in)g(the)262 +533 y(ev)n(aluation)g(surface.)324 618 y(T)m(o)e(ac)o(hiev)o(e)i(this)g(smo)q +(oth)e(transition)h(b)q(et)o(w)o(een)i(di\013eren)o(t)f(ev)n(aluation)e +(criteria,)i(I)f(will)262 668 y(split)i(the)h(game)f(up)h(in)o(to)f(16)g +(separate)i(phases.)344 766 y(phase)g(=)f(PS)344 815 y(revPhase)i(=)e(17)f +Ff(\000)h Fp(phase)344 915 y Fl(where)380 965 y Fp(PS)g(:)159 +b(totalMtl)13 b(=)h Fh(M)5 b(tl)899 971 y Fe(W)t(hite)1005 +965 y Fp(+)10 b Fh(M)5 b(tl)1119 971 y Fe(B)q(lack)616 1015 +y Fl(if)13 b Fp(\(totalMtl)g Ff(\024)h Fp(21870\))658 1065 +y(1)616 1114 y Fl(else)658 1164 y Fp(\(totalMtl)f Ff(\000)h +Fp(21570\))e(/)i(300)616 1214 y Fl(endif)380 1314 y Fh(M)5 +b(tl)452 1320 y Fe(W)t(hite)563 1314 y Fp(:)41 b(T)m(otal)12 +b(non{pa)o(wn)i(white)g(material.)380 1413 y Fh(M)5 b(tl)452 +1419 y Fe(B)q(lack)556 1413 y Fp(:)48 b(T)m(otal)12 b(non{pa)o(wn)i(blac)o(k) +f(material.)324 1532 y(In)19 b(the)h(op)q(ening)f(p)q(osition)g(the)h(phase)g +(will)e(b)q(e)i(16.)34 b(The)20 b(phase)g(then)g(decreases)262 +1581 y(linearly)11 b(as)i(material)d(is)i(captured,)i(except)g(when)f(the)g +(total)f(non-pa)o(wn)g(material)e(v)n(alue)262 1631 y(falls)i(b)q(elo)o(w)h +(21870)f(units.)18 b(A)o(t)13 b(this)h(p)q(oin)o(t)f(the)h(phase)g(remains)e +(at)h(1)h(for)f(the)h(rest)g(of)f(the)262 1681 y(game,)h(unless)i(the)g +(material)e(v)n(alue)h(rises)h(again)1048 1666 y Fk(1)1066 +1681 y Fp(.)23 b(As)16 b(an)g(example,)e(in)h(\014gure)h(4.1)f(the)262 +1731 y(Game)d(Phase)i(is)g(calculated)g(b)o(y:)k(phase)d(=)f(\(24650)e +Ff(\000)j Fp(21570\))d(/)i(300)f(=)h(10.)324 1816 y(This)i(phase)i(concept)g +(will)d(not)i(b)q(e)g(used)h(to)f(decide)h(when)f(rapid)f(dev)o(elopmen)o(t)g +(of)262 1866 y(pieces)f(should)f(tak)o(e)h(place.)20 b(This)14 +b(will)f(b)q(e)i(left)f(to)g(sp)q(ecial)h(dev)o(elopmen)o(t)e(criteria.)20 +b(The)262 1916 y(concept)15 b(will)e(ho)o(w)o(ev)o(er,)i(b)q(e)g(used)g(to)f +(progressiv)o(ely)h(mo)q(dify)d(those)j(ev)n(aluation)e(criteria)262 +1966 y(whic)o(h)f(are)h(a\013ected)h(b)o(y)e(material)e(status.)18 +b(F)m(or)12 b(example,)f(passed)j(pa)o(wns)e(b)q(ecome)h(more)262 +2015 y(imp)q(ortan)o(t)f(as)i(the)g(material)e(on)i(the)g(b)q(oard)g +(diminishes.)324 2101 y(The)h(game)f(phase)i(is)f(based)h(on)f(non{pa)o(wn)g +(material)e(b)q(ecause)k(in)e(c)o(hess)i(it)d(is)i(gen-)262 +2150 y(erally)d(imp)q(ortan)o(t)f(to)i(trade)g(pieces)h(not)f(pa)o(wns)g +(when)g(ahead)g(in)g(material.)i(Therefore,)262 2200 y(the)e(phase)h(pro)o +(vides)g(a)f(metho)q(d)g(of)f(encouraging)i(the)g(program)d(to)i(trade)h +(pieces)h(when)262 2250 y(ahead)i(in)f(order)i(to)f(increase)h(some)f(fa)o(v) +o(ourable)f(p)q(ositional)f(criteria)j(suc)o(h)f(as)h(passed)262 +2300 y(pa)o(wn)f(v)n(alues.)34 b(T)m(rading)19 b(pa)o(wns)g(will)f(not)h(b)q +(e)h(encouraged)g(b)q(ecause)h(the)f(phase)g(will)262 2350 +y(remain)12 b(una\013ected.)p 262 2411 573 2 v 308 2437 a Fj(1)325 +2449 y Fi(b)q(ecause)e(of)h(pa)o(wn)g(promotions)957 2574 y +Fp(46)p eop +%%Page: 47 49 +47 48 bop 262 307 a Fr(4.3)69 b(General)22 b(P)n(ositional)g(Ev)l(aluation) +262 442 y Fu(4.3.1)55 b(De\014nition)17 b(3)i(:)24 b(Mobilit)n(y)262 +554 y Fp(Mobilit)o(y)8 b(is)i(the)h(degree)g(of)f(piece)h(freedom)e(in)h(a)g +(giv)o(en)g(p)q(osition.)16 b(Study)10 b(has)g(sho)o(wn)h(that)262 +604 y(there)k(is)g(a)f(clear)h(di\013erence)i(b)q(et)o(w)o(een)f(the)f +(mobilit)o(y)c(of)j(the)h(winning)f(and)g(losing)g(sides)262 +654 y(as)i(the)i(game)d(progresses.)28 b(This)17 b(is)g(to)f(b)q(e)h(exp)q +(ected)i(when)e(one)g(side)g(has)g(a)g(material)262 703 y(adv)n(an)o(tage.)23 +b(Ho)o(w)o(ev)o(er,)16 b(it)f(has)h(also)g(b)q(een)h(found)e(that)h(the)g +(side)h(whic)o(h)e(can)h(main)o(tain)262 753 y(the)e(highest)g(mobilit)o(y)d +(is)j(the)g(side)g(most)f(lik)o(ely)g(to)g(win)h(the)g(game)f([27)o(].)324 +838 y(This)e(sho)o(ws)h(that)f(maximi)o(sing)d(mobilit)o(y)h(is)i(an)g +(excellen)o(t)i(heuristic.)18 b(In)11 b(fact,)g(Slater)262 +888 y([59)o(])e(is)g(of)g(the)i(opinion)d(that)i(mobilit)o(y)c(in)j(itself)h +(is)f(a)h(su\016cien)o(t)g(measure)f(of)h(all)e(the)i(factors)262 +938 y(suggested)15 b(b)o(y)f(Shannon)h([53)o(].)k(I)14 b(also)g(consider)h +(mobilit)o(y)c(to)j(b)q(e)h(an)f(imp)q(ortan)o(t)f(factor,)262 +988 y(although)f(I)i(do)g(think)g(man)o(y)e(other)i(heuristics)h(are)f(also)g +(imp)q(ortan)o(t.)324 1073 y(In)g(1985,)e(Johnathon)i(Sc)o(hae\013er)i([51)o +(])d(did)h(some)f(researc)o(h)i(to)f(\014nd)g(the)h(relativ)o(e)f(im-)262 +1123 y(p)q(ortance)e(of)g(v)n(arious)f(ev)n(aluation)f(criteria.)18 +b(In)12 b(this)g(researc)o(h)h(Sc)o(hae\013er)h(found)d(that)h(the)262 +1173 y(mobilit)o(y)f(heuristic)16 b(con)o(tributed)g(more)e(than)h(an)o(y)g +(other)g(term)g(to)f(program)g(strength.)262 1223 y(In)i(fact,)i(when)f(a)g +(mobilit)o(y)d(criterion)j(w)o(as)g(added)g(to)g(a)g(program)e(without)h(an)o +(y)h(p)q(osi-)262 1272 y(tional)e(kno)o(wledge,)h(a)g(rating)g(increase)i(of) +e(310)f(p)q(oin)o(ts)i(o)q(ccurred.)27 b(This)16 b(w)o(as)h(the)g(\014rst)262 +1322 y(ev)n(aluation)12 b(criterion)i(added.)k(It)c(could)f(therefore)i(b)q +(e)g(exp)q(ected)g(to)f(mak)o(e)e(a)h(large)h(con-)262 1372 +y(tribution)c(to)h(program)e(p)q(erformance.)17 b(Ho)o(w)o(ev)o(er,)12 +b(suc)o(h)g(a)f(large)f(increase)j(is)e(exceptional)262 1422 +y(and)i(clearly)h(sho)o(ws)h(mobilit)o(y)c(should)j(b)q(e)h(one)f(of)g(the)g +(ma)r(jor)f(terms)h(in)f(an)o(y)h(ev)n(aluation)262 1472 y(function.)324 +1557 y(Normally)m(,)c(mobilit)o(y)g(is)j(tak)o(en)h(as)g(the)g(n)o(um)o(b)q +(er)e(of)h(legal)g(or)g(pseudo{legal)g(mo)o(v)o(es.)k(I)262 +1607 y(will)12 b(tak)o(e)i(a)f(sligh)o(tly)g(di\013eren)o(t)i(view)f(and)f +(use)i(the)f(follo)o(wing)e(de\014nition)h(of)h(mobilit)o(y)o(:)344 +1737 y Fh(M)5 b(B)420 1743 y Fe(col)476 1737 y Fp(=)520 1706 +y Fc(P)564 1716 y Fk(64)564 1749 y Fe(sq)q Fk(=1)640 1737 y +Fp(\()p Fh(A)687 1743 y Fe(col;sq)782 1737 y Fp(+)k Fh(P)850 +1743 y Fe(col;sq)936 1737 y Fp(\))344 1840 y Fl(where)380 1890 +y Fh(A)411 1896 y Fe(col;sq)510 1890 y Fp(:)47 b Fh(])p Fp(A)o(ttac)o(ks\([P) +o(a)o(wn,Knigh)o(t,Bishop,Ro)q(ok],)o(col,sq\))380 1989 y Fh(P)407 +1995 y Fe(col;sq)506 1989 y Fp(:)k Fl(if)12 b Fp(\(Occup)o(y\([P)o(a)o +(wn],col,sq\)\))628 2039 y Fh(])p Fp(Mo)o(v)o(es\([P)o(a)o(wn],col,sq\))569 +2089 y Fl(else)628 2139 y Fp(0)569 2188 y Fl(endif)262 2300 +y Fp(The)19 b(mobilit)o(y)e(of)i(the)h(king)e(is)h(not)h(included)f(in)g +(this)h(de\014nition)f(b)q(ecause)i(I)e(do)h(not)262 2350 y(consider)f(a)g +(kings)g(mobilit)o(y)d(mak)o(es)i(an)o(y)g(meaningful)f(con)o(tribution)h(to) +h(a)g(successful)262 2399 y(strategy)m(.)33 b(The)20 b(king)e(m)o(ust)g(b)q +(e)i(protected)h(in)e(the)g(op)q(ening)g(and)g(middle)e(game.)33 +b(In)262 2449 y(the)15 b(ending)h(it)f(should)g(b)q(e)h(used)g(activ)o(ely)m +(.)21 b(Ho)o(w)o(ev)o(er,)16 b(its)f(mobilit)o(y)e(should)i(neither)h(b)q(e) +957 2574 y(47)p eop +%%Page: 48 50 +48 49 bop 262 307 a Fp(minim)o(i)o(sed)12 b(nor)h(maxim)o(ised.)i(The)f +(queens)h(mobilit)o(y)10 b(is)j(also)g(not)g(included)g(although)g(a)262 +357 y(sp)q(ecialised)j(queen)i(mobilit)o(y)13 b(function)j(is)g(included)g +(in)g(de\014nition)g(27,)f(Queen)j(P)o(o)o(w)o(er.)262 407 +y(Other)13 b(non-pa)o(wn)f(pieces)i(are)f(giv)o(en)f(a)g(b)q(on)o(us)h(for)f +(eac)o(h)h(square)g(they)g(attac)o(k,)g(including)262 457 y(friendly)g +(pieces)i(defended.)324 542 y(Unlik)o(e)f(other)i(pieces,)f(pa)o(wns)g +(cannot)g(mo)o(v)o(e)f(to)g(squares)i(they)g(attac)o(k,)e(therefore)j(I)262 +592 y(ha)o(v)o(e)9 b(giv)o(en)g(pa)o(wns)h(a)f(b)q(on)o(us)h(for)g(squares)g +(they)h(can)f(mo)o(v)o(e)e(to.)16 b(This)10 b(in)f(e\013ect)i(encourages)262 +641 y(the)j(blo)q(c)o(k)n(ade)g(of)f(enem)o(y)g(pa)o(wns)h(b)o(y)g(pieces.)p +641 735 673 5 v 641 1399 5 665 v 646 818 a Fg(rZ0l0skZ)646 +901 y(o0o0apop)646 984 y(0ZpZpZ0Z)646 1067 y(Z0OnO0Z0)646 1150 +y(QZ0O0ZbZ)646 1233 y(Z0Z0ZNZ0)646 1316 y(PO0Z0ZPO)646 1399 +y(SNA0ZRJ0)p 1310 1399 V 641 1403 673 5 v 317 1522 a Fp(Figure)g(4.2:)j +Fl(HIAR)o(CS)f(4.1)g(v)g(Mephisto)p Fp(,)11 b(1989)i(Olympiad,)e(White)i(to)h +(Pla)o(y)m(.)324 1640 y(Applying)f(these)i(Mobilit)o(y)d(criteria)i(to)g(the) +h(p)q(osition)e(in)g(\014gure)i(4.2)e(giv)o(es:)344 1738 y +Fh(M)5 b(B)420 1744 y Fe(W)t(hite)533 1738 y Fp(=)14 b(43)344 +1787 y Fh(M)5 b(B)420 1793 y Fe(B)q(lack)533 1787 y Fp(=)14 +b(47)957 2574 y(48)p eop +%%Page: 49 51 +49 50 bop 262 307 a Fu(4.3.2)55 b(De\014nition)17 b(4)i(:)24 +b(Dev)n(elopmen)n(t)262 419 y Fp(The)11 b(main)f(ob)r(jectiv)o(e)i(of)e(the)j +(op)q(ening)e(is)g(to)g(dev)o(elop)h(pieces)g(on)o(to)f(their)h('b)q(est')g +(a)o(v)n(ailable)262 469 y(squares.)31 b(Dev)o(elopmen)o(t,)17 +b(therefore,)j(ob)o(viously)c(pla)o(ys)i(an)f(imp)q(ortan)o(t)f(role)i(in)g +(c)o(hess.)262 519 y(Man)o(y)c(op)q(enings)h(o\013er)h(material,)d(generally) +i(pa)o(wns,)g(in)f(exc)o(hange)i(for)f(rapid)g(dev)o(elop-)262 +569 y(men)o(t.)22 b(A)16 b(dev)o(elop)q(ed)g(side)g(is)g(able)f(to)g(com)o +(bine)g(pieces)i(in)e(attac)o(k,)g(often)h(catc)o(hing)g(an)262 +618 y(unprepared)e(and)e(undev)o(elop)q(ed)h(opp)q(onen)o(t)g(b)o(y)g +(surprise.)19 b(I)12 b(b)q(eliev)o(e)h(it)g(is)f(imp)q(ortan)o(t)f(for)262 +668 y(c)o(hess)k(programs)d(not)h(to)h(place)g(to)q(o)f(m)o(uc)o(h)f(faith)h +(in)g(their)h(op)q(ening)g(b)q(o)q(oks.)k(A)13 b(program)262 +718 y(should)g(kno)o(w)h(ho)o(w)f(and)h(when)g(to)g(dev)o(elop)g(its)g +(pieces.)344 801 y Fh(D)q(V)403 807 y Fe(col)459 801 y Fp(=)e +Fh(K)538 807 y Fe(col)592 801 y Ff(\000)d Fh(B)664 807 y Fe(col)709 +801 y Ff(\001)o Fh(phase=)p Fp(3)g Ff(\000)h Fh(N)951 807 y +Fe(col)995 801 y Ff(\001)p Fh(phase=)p Fp(2)f(+)h Fh(Q)1238 +807 y Fe(col)344 901 y Fl(where)380 950 y Fh(K)415 956 y Fe(col)473 +950 y Fp(:)36 b Fl(if)13 b Fp(\(Castled\(col\)\))580 1000 y(phase)521 +1050 y Fl(else)580 1100 y(if)g Fp(\()p Fl(not)g Fp(\(K)o(CRigh)o(ts\(col\))g +Fl(or)h Fp(QCRigh)o(ts\(col\)\))639 1150 y Ff(\000)p Fp(2)p +Ff(\001)p Fh(phase)580 1200 y Fl(else)639 1249 y(if)f Fp(\()p +Fl(not)g Fp(K)o(CRigh)o(ts\(col\)\))699 1299 y Ff(\000)p Fh(phase=)p +Fp(2)639 1349 y Fl(else)699 1399 y(if)f Fp(\()p Fl(not)h Fp(QCRigh)o +(ts\(col\)\))758 1449 y Ff(\000)p Fh(phase=)p Fp(4)699 1498 +y Fl(else)758 1548 y Fp(0)699 1598 y Fl(endif)639 1648 y(endif)580 +1698 y(endif)521 1747 y(endif)380 1847 y Fh(B)411 1853 y Fe(col)469 +1847 y Fp(:)40 b Fh(])p Fp(UnMo)o(v)o(ed\(col,Bishop\))380 +1947 y Fh(N)413 1953 y Fe(col)471 1947 y Fp(:)e Fh(])p Fp(UnMo)o(v)o +(ed\(col,Knigh)o(t\))380 2046 y Fh(Q)413 2052 y Fe(col)470 +2046 y Fp(:)h Fl(if)13 b Fp(\()p Fh(B)610 2052 y Fe(col)664 +2046 y Fp(+)c Fh(N)738 2052 y Fe(col)794 2046 y Ff(\025)j Fp(2)i +Fl(and)f Fh(])p Fp(UnMo)o(v)o(ed\(col,Queen\))i(=)f(0\))580 +2096 y Ff(\000)p Fh(phase)c Ff(\001)f Fp(\()p Fh(B)795 2102 +y Fe(col)849 2096 y Fp(+)h Fh(N)924 2102 y Fe(col)968 2096 +y Fp(\))p Fh(=)p Fp(4)521 2146 y Fl(else)580 2196 y Fp(0)521 +2246 y Fl(endif)262 2350 y Fp(These)15 b(dev)o(elopmen)o(t)f(criteria)h +(encourage)g(castling)f(and)h(p)q(enalise)g(the)g(loss)f(of)g(castling)262 +2399 y(righ)o(ts)d(without)h(ha)o(ving)f(castled.)18 b(Knigh)o(ts)12 +b(and)g(bishops)g(are)g(p)q(enalised)g(for)g(not)g(ha)o(ving)262 +2449 y(mo)o(v)o(ed.)17 b(This)d(has)h(the)g(e\013ect)h(of)d(discouraging)h +(the)h(program)d(from)h(mo)o(ving)f(the)i(same)957 2574 y(49)p +eop +%%Page: 50 52 +50 51 bop 262 307 a Fp(piece)13 b(t)o(wice)h(in)e(the)i(op)q(ening)e(b)q +(efore)i(dev)o(elopmen)o(t)e(is)h(complete.)k(Where)d(the)f(undev)o(el-)262 +357 y(op)q(ed)h(pieces)h(should)f(b)q(e)g(dev)o(elop)q(ed)h(to)e(is)h +(de\014ned)h(b)o(y)f(other)g(ev)n(aluation)f(criteria.)324 +442 y(The)e(queen)g(is)f(discouraged)h(from)e(mo)o(ving)f(b)q(efore)j(at)g +(least)f(3)g(minor)f(pieces)j(\(knigh)o(ts)262 492 y(and)k(bishops\))i(are)f +(dev)o(elop)q(ed.)28 b(This)17 b(is)g(an)f(attempt)h(to)g(a)o(v)o(oid)e(p)q +(ositions)i(where)h(the)262 542 y(program's)11 b(queen)k(is)e(dev)o(elop)q +(ed)h(to)q(o)g(early)m(,)e(allo)o(wing)f(the)j(opp)q(onen)o(t)g(to)g(gain)e +(a)h(temp)q(o)262 592 y(b)o(y)d(pla)o(ying)f(a)i(dev)o(eloping)f(mo)o(v)o(e)f +(attac)o(king)h(the)i(queen.)18 b(Applying)10 b(these)i(Dev)o(elopmen)o(t)262 +641 y(criteria)i(to)f(the)i(p)q(osition)e(in)h(\014gure)g(4.2)f(giv)o(es:)344 +738 y Fh(D)q(V)403 744 y Fe(W)t(hite)533 738 y Fp(=)h(14)9 +b Ff(\000)h Fp(4)f Ff(\000)g Fp(7)g Ff(\000)h Fp(7)h(=)h Ff(\000)p +Fp(4)344 788 y Fh(D)q(V)403 794 y Fe(B)q(lack)533 788 y Fp(=)i(14)9 +b Ff(\000)h Fp(0)f Ff(\000)g Fp(0)g Ff(\000)h Fp(0)h(=)h(14)262 +940 y Fu(4.3.3)55 b(De\014nition)17 b(5)i(:)24 b(Cen)n(tre)19 +b(Con)n(trol)262 1052 y Fp(The)g(imp)q(ortance)g(of)f(con)o(trolling)g(the)i +(cen)o(tre)h(of)e(the)h(b)q(oard)f(cannot)h(b)q(e)g(to)q(o)f(highly)262 +1102 y(stressed.)37 b(A)19 b(clear)h(connection)g(b)q(et)o(w)o(een)h(winning) +e(the)h(game)e(and)h(con)o(trolling)f(the)262 1151 y(cen)o(tre)f(has)g(b)q +(een)g(established)g(in)f([27)o(].)25 b(Ho)o(w)o(ev)o(er,)16 +b(this)h(will)d(come)i(as)g(no)g(surprise)i(to)262 1201 y(an)o(y)13 +b(strong)h(c)o(hess)i(pla)o(y)o(ers.)324 1286 y(The)g(cen)o(tre)i(is)e(con)o +(trolled)f(b)o(y)h(b)q(oth)g(o)q(ccupation)g(and)g(attac)o(k)g(of)g(cen)o +(tral)g(squares.)262 1336 y(Therefore)j(m)o(y)e(cen)o(tre)j(con)o(trol)e(ev)n +(aluation)f(criteria)i(m)o(ust)f(detect)i(suc)o(h)f(factors)g(and)262 +1386 y(encourage)14 b(their)h(ac)o(hiev)o(emen)o(t.)p 641 1480 +673 5 v 641 2144 5 665 v 646 1563 a Fg(0Z0Z0Z0Z)646 1646 y(Z0Z0Z0Z0)646 +1729 y(0Z0Z0Z0Z)646 1812 y(Z0Z0Z0Z0)646 1895 y(0Z0Z0Z0Z)646 +1978 y(Z0Z0Z0Z0)646 2061 y(0Z0Z0Z0Z)646 2144 y(Z0Z0Z0Z0)p 1310 +2144 V 641 2148 673 5 v 687 1539 a Fl(1)58 b(1)h(1)g(1)f(1)h(1)g(1)f(1)687 +1622 y(1)g(2)h(2)g(2)f(2)h(2)g(2)f(1)687 1705 y(1)g(2)h(4)g(4)f(4)h(4)g(2)f +(1)687 1788 y(1)g(2)h(4)g(8)f(8)h(4)g(2)f(1)687 1871 y(1)g(2)h(4)g(8)f(8)h(4) +g(2)f(1)687 1954 y(1)g(2)h(4)g(4)f(4)h(4)g(2)f(1)687 2037 y(1)g(2)h(2)g(2)f +(2)h(2)g(2)f(1)687 2120 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)617 +2246 y Fp(Figure)14 b(4.3:)j(Cen)o(tre)e(Con)o(trol)e(b)q(on)o(us)h(table.) +344 2396 y Fh(C)s(C)407 2402 y Fe(col)462 2396 y Fp(=)506 2365 +y Fc(P)550 2375 y Fk(64)550 2409 y Fe(sq)q Fk(=1)633 2396 y +Fh(V)657 2402 y Fe(sq)691 2396 y Ff(\001)o Fp(\()p Fh(A)749 +2402 y Fe(col;sq)845 2396 y Fp(+)9 b Fh(O)918 2402 y Fe(col;sq)1013 +2396 y Fp(+)g Fh(P)1081 2402 y Fe(col;sq)1167 2396 y Fp(\))957 +2574 y(50)p eop +%%Page: 51 53 +51 52 bop 344 307 a Fl(where)380 357 y Fh(V)404 363 y Fe(sq)452 +357 y Fp(:)105 b(Cen)o(tre)15 b(Con)o(trol)e(b)q(on)o(us)h(table,)f(indexed)i +(b)o(y)e(sq.)19 b(See)14 b(\014gure)h(4.3.)380 457 y Fh(A)411 +463 y Fe(col;sq)510 457 y Fp(:)47 b Fh(])p Fp(A)o(ttac)o(ks\([An)o +(y],col,sq\))380 556 y Fh(O)412 562 y Fe(col;sq)511 556 y Fp(:)f +Fl(if)12 b Fp(\(Occup)o(y\([Knigh)o(t],col,sq\)\))628 606 y(1)569 +656 y Fl(else)628 706 y Fp(0)569 756 y Fl(endif)380 855 y Fh(P)407 +861 y Fe(col;sq)506 855 y Fp(:)51 b Fl(if)12 b Fp(\(A)o(ttac)o(k)o(ed\([P)o +(a)o(wn],col,sq\)\))628 905 y(1)569 955 y Fl(else)628 1005 +y Fp(0)569 1054 y Fl(endif)262 1181 y Fp(Pieces)i(are)g(giv)o(en)f(b)q(on)o +(uses)h(for)f(attac)o(king)g(cen)o(tral)g(squares.)19 b(The)14 +b(b)q(on)o(us)g(is)f(dep)q(enden)o(t)262 1231 y(on)k(ho)o(w)f(close)i(the)g +(square)g(is)f(to)g(the)h(cen)o(tre.)29 b(P)o(a)o(wn)17 b(attac)o(ks)h +(receiv)o(e)g(an)f(additional)262 1281 y(b)q(on)o(us)f(to)h(re\015ect)h(the)g +(imp)q(ortance)e(of)g(suc)o(h)h(attac)o(ks.)27 b(Occupation)17 +b(of)f(the)i(cen)o(tre)g(b)o(y)262 1331 y(knigh)o(ts)12 b(is)g(of)g +(particular)h(imp)q(ortance.)k(A)c(knigh)o(t)e(has)i(a)g(relativ)o(ely)f +(short)h(range,)g(more)262 1380 y(than)d(an)o(y)h(other)g(piece)h(it)e(needs) +i(to)f(b)q(e)g(close)g(to)g(the)g(\014eld)g(of)f(action.)17 +b(A)11 b(cen)o(trally)f(placed)262 1430 y(knigh)o(t)j(is)g(b)q(est)i(able)f +(to)f(exert)i(pressure)h(o)o(v)o(er)e(most)f(of)g(the)h(b)q(oard.)19 +b(Therefore,)14 b(cen)o(tral)262 1480 y(o)q(ccupation)g(b)o(y)f(knigh)o(ts)h +(receiv)o(es)h(a)f(sp)q(ecial)g(b)q(on)o(us.)324 1565 y(I)e(b)q(eliev)o(e)i +(that)e(cen)o(tre)j(con)o(trol)d(is)h(imp)q(ortan)o(t)e(throughout)h(the)i +(game,)d(although)h(its)262 1615 y(imp)q(ortance)d(should)i(diminish)d(as)j +(the)g(game)e(progresses.)19 b(This)10 b(function)h(will)e(naturally)262 +1665 y(pla)o(y)f(a)i(less)g(prominen)o(t)e(role)i(as)g(pieces)h(are)f(exc)o +(hanged)g(b)q(ecause)i(of)d(the)h(reduced)h(n)o(um)o(b)q(er)262 +1715 y(of)j(attac)o(ks)h(and)g(p)q(ossible)g(squares)i(o)q(ccupied.)22 +b(Therefore,)16 b(no)f(phase)h(adjustmen)o(t)e(w)o(as)262 1765 +y(felt)f(necessary)m(.)324 1850 y(Applied)e(to)g(the)h(p)q(osition)e(in)h +(\014gure)g(4.2,)g(the)g(Cen)o(tre)i(Con)o(trol)d(criteria)i(will)d(pro)q +(duce)262 1900 y(the)14 b(follo)o(wing)d(v)n(alues:)344 1997 +y Fh(C)s(C)407 2003 y Fe(W)t(hite)533 1997 y Fp(=)j(169)344 +2047 y Fh(C)s(C)407 2053 y Fe(B)q(lack)533 2047 y Fp(=)g(183)957 +2574 y(51)p eop +%%Page: 52 54 +52 53 bop 262 307 a Fu(4.3.4)55 b(De\014nition)17 b(6)i(:)24 +b(Square)19 b(Con)n(trol)262 419 y Fp(During)8 b(the)i(game)e(it)h(is)g(imp)q +(ortan)o(t)f(to)h(ac)o(hiev)o(e)h(a)f(balance)g(b)q(et)o(w)o(een)i(attac)o(k) +e(and)h(defence.)262 469 y(As)k(the)h(game)e(progresses)j(this)e(balance)h +(ma)o(y)d(shift)i(a)g(n)o(um)o(b)q(er)g(of)f(times)h(from)e(defence)262 +519 y(to)k(attac)o(k)h(and)g(visa{v)o(ersa.)28 b(Square)17 +b(con)o(trol)g(can)g(pro)o(vide)g(a)g(metho)q(d)f(of)h(measuring)262 +569 y(the)d(exten)o(t)h(to)f(whic)o(h)f(the)i(program)d(is)i(attac)o(king)f +(or)h(defending.)324 654 y(W)m(e)i(can)h(de\014ne)h(attac)o(k)f(as)g(the)g(n) +o(um)o(b)q(er)g(of)f(squares)i(attac)o(k)o(ed)f(in)f(the)i(opp)q(onen)o(ts) +262 704 y(half)12 b(of)h(the)h(b)q(oard.)k(Defence)d(can)f(b)q(e)g(de\014ned) +h(as)e(the)i(n)o(um)o(b)q(er)d(of)h(squares)i(attac)o(k)o(ed)f(in)262 +754 y(ones)g(o)o(wn)f(half)g(of)h(the)g(b)q(oard.)324 839 y(A)j(comparison)f +(b)q(et)o(w)o(een)i(suc)o(h)g(attac)o(k)f(and)g(defence)i(for)e(b)q(oth)g(ev) +o(en)o(tual)g(winners)262 889 y(and)e(losers)i(is)f(made)f(in)g([27)o(].)24 +b(Analysing)15 b(the)i(results)g(obtained)f(it)f(can)i(b)q(e)f(seen)i(that) +262 938 y(throughout)c(the)h(game)f(the)h(winners)g(and)g(losers)g(main)o +(tain)d(appro)o(ximately)g(the)j(same)262 988 y(n)o(um)o(b)q(er)c(of)g +(squares)i(defended.)18 b(Ho)o(w)o(ev)o(er,)12 b(there)i(is)d(a)h(clear)g +(di\013erence)i(in)d(the)h(attac)o(k)o(ed)262 1038 y(squares)j(b)q(et)o(w)o +(een)h(winners)e(and)h(losers)g(as)f(the)h(game)d(progresses.)22 +b(The)14 b(b)q(est)i(strategy)m(,)262 1088 y(therefore,)i(seems)f(to)f(b)q(e) +h(to)g(maxim)o(i)o(se)e(the)i(attac)o(k)f(while)h(main)o(taini)o(ng)d(an)i +(adequate)262 1138 y(defence.)344 1240 y Fh(S)r(C)401 1246 +y Fe(col)457 1240 y Fp(=)501 1209 y Fc(P)545 1219 y Fk(64)545 +1252 y Fe(sq)q Fk(=1)621 1240 y Fp(\()p Fh(S)662 1246 y Fe(col;sq)757 +1240 y Ff(\001)9 b Fh(A)809 1246 y Fe(col;sq)895 1240 y Fp(\))344 +1343 y Fl(where)380 1392 y Fh(S)405 1398 y Fe(col;sq)505 1392 +y Fp(:)52 b(2)13 b(tables)h(of)g(square)g(v)n(alues)g(indexed)g(b)o(y)g +(colour)g(col)f(and)h(square)g(sq.)569 1442 y(See)g(planning)f(section)i +(4.11.7)d(for)h(details.)380 1542 y Fh(A)411 1548 y Fe(col;sq)510 +1542 y Fp(:)47 b Fh(])p Fp(A)o(ttac)o(ks\([An)o(y],col,sq\))324 +1660 y(I)12 b(will)g(use)h(a)f(table)h(driv)o(en)g(function.)k(This)c(will)e +(enable)i(pre-loaded)g(v)n(alues)f(deriv)o(ed)262 1710 y(from)k(an)j(initial) +d(planning)i(phase)h(to)g(b)q(e)g(used.)33 b(A)19 b(planning)e(phase)j(could) +e(use)i(this)262 1760 y(function)13 b(to)h(go)q(o)q(d)g(e\013ect)h(b)o(y)f +(iden)o(tifying)f(a)g(basic)h(plan,)f(lik)o(e)h(a)f(king)g(side)i(attac)o(k.) +j(The)262 1810 y(table)12 b(could)h(then)g(b)q(e)h(pre-loaded)f(with)f(v)n +(alues)g(whic)o(h)h(w)o(ould)f(encourage)i(the)f(program)262 +1860 y(to)g(attac)o(k)h(certain)h(squares)g(on)e(the)i(king)e(side,)h(for)f +(example.)324 1945 y(Applying)g(this)h(Square)g(Con)o(trol)f(criterion)h(to)g +(the)h(p)q(osition)e(in)g(\014gure)i(4.2)e(giv)o(es:)344 2042 +y Fh(S)r(C)401 2048 y Fe(W)t(hite)533 2042 y Fp(=)h(74)344 +2092 y Fh(S)r(C)401 2098 y Fe(B)q(lack)533 2092 y Fp(=)g(62)957 +2574 y(52)p eop +%%Page: 53 55 +53 54 bop 262 307 a Fr(4.4)69 b(P)n(a)n(wn)23 b(Ev)l(aluation)262 +434 y Fp(P)o(a)o(wns)15 b(pro)o(vide)g(the)h(basic)g(framew)o(ork)d(around)j +(whic)o(h)f(the)h(game)e(will)g(dev)o(elop.)22 b(The)262 483 +y(correct)15 b(handling)e(of)g(the)i(pa)o(wn)e(structure)j(is)e(vital)f(in)g +(high)g(lev)o(el)h(c)o(hess.)365 599 y("P)o(a)o(wns)g(are)g(the)h(Soul)e(of)g +(Chess")838 665 y Fm(Philidor)262 781 y Fp(I)i(b)q(eliev)o(e)g(this)h(is)f +(the)h(one)f(area)h(whic)o(h)f(ab)q(o)o(v)o(e)g(all)f(others)i(is)g(most)e +(neglected)i(in)f(c)o(hess)262 831 y(programs.)h(The)11 b(problem)g(is)g +(that)h(w)o(eak)f(pa)o(wns)h(do)f(not)g(usually)g(cause)i(an)o(y)e(imm)o +(ediate)262 881 y(deterioration)k(in)g(the)i(o)o(v)o(erall)d(p)q(osition.)22 +b(Ho)o(w)o(ev)o(er,)16 b(o)o(v)o(er)g(a)f(longer)h(term,)e(p)q(erhaps)j(30) +262 931 y(or)12 b(40)h(plies,)f(the)i(existence)g(of)f(w)o(eak)g(pa)o(wns)f +(causes)j(n)o(umerous)d(p)q(ositional)g(w)o(eaknesses)262 981 +y(e.g.)17 b(w)o(eak)12 b(squares,)h(space)g(to)f(blo)q(c)o(k)n(ade,)f +(isolation)f(etc.)19 b(Often)12 b(a)g(game's)f(result)h(hinges)262 +1030 y(on)h(the)i(strength)g(or)f(w)o(eakness)h(of)e(the)h(underlying)g(pa)o +(wn)f(structure.)324 1116 y(It)e(is)g(notable)g(in)f(a)h(recen)o(t)i([27)o +(],)d(relativ)o(ely)h(large)f(study)i(of)e(ev)n(aluation)g(criteria,)i(that) +262 1165 y(there)j(w)o(as)e(no)h(sp)q(eci\014c)h(atten)o(tion)e(giv)o(en)g +(to)h(pa)o(wn)f(ev)n(aluation.)k(I)c(feel)h(this)g(is)f(a)h(serious)262 +1215 y(omission.)324 1300 y(My)e(pa)o(wn)g(ev)n(aluation)e(criteria)j(will)d +(b)q(e)j(amongst)e(the)h(most)f(complex)g(and)h(compre-)262 +1350 y(hensiv)o(e)i(of)f(the)h(whole)f(ev)n(aluation)f(function.)18 +b(I)13 b(feel)h(this)g(is)f(critical)g(to)h(o)o(v)o(erall)e(success)262 +1400 y(b)q(ecause)j(man)o(y)c(of)i(the)i(e\013ects)g(caused)g(b)o(y)e(bad)h +(pa)o(wn)f(pla)o(y)f(cannot)i(b)q(e)g(determined)g(b)o(y)262 +1450 y(searc)o(h.)19 b(Therefore,)14 b(heuristics)h(m)o(ust)e(\014ll)g(this)h +(gap.)324 1535 y(I)19 b(will)f(split)h(the)h(pa)o(wn)f(ev)n(aluation)f +(criteria)i(up)f(so)g(they)h(can)g(b)q(e)g(dealt)f(with)g(in)262 +1585 y(su\016cien)o(t)14 b(detail.)262 1736 y Fu(4.4.1)55 b(De\014nition)17 +b(7)i(:)24 b(Doubled)19 b(P)n(a)n(wns)262 1848 y Fp(P)o(a)o(wns)e(are)g +(doubled)g(if)f(there)j(are)e(at)g(least)g(t)o(w)o(o)g(pa)o(wns)g(of)f(the)i +(same)e(colour)h(on)g(the)262 1898 y(same)12 b(\014le.)18 b(Doubled)13 +b(pa)o(wns)g(are)h(generally)f(w)o(eak.)k(They)d(are)g(unable)f(to)g(supp)q +(ort)h(eac)o(h)262 1948 y(other)g(and)g(are)g(vulnerable)g(to)g(attac)o(k)g +(and)f(blo)q(c)o(k)n(ade.)344 2047 y Fh(D)q(P)406 2053 y Fe(col)462 +2047 y Fp(=)506 2016 y Fc(P)549 2027 y Fk(64)549 2060 y Fe(sq)q +Fk(=1)651 2047 y Fl(if)g Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\))g +Fl(and)g Fp(Doubled\(col,OnFile\(sq\)\)\))710 2100 y Fh(D)744 +2107 y Fe(O)q(nF)t(ile)p Fk(\()p Fe(sq)q Fk(\))651 2150 y Fl(else)710 +2200 y Fp(0)651 2250 y Fl(endif)344 2350 y(where)380 2399 y +Fh(D)414 2405 y Fe(f)449 2399 y Fp(:)131 b([)p Ff(\000)p Fp(6)p +Fh(;)7 b Ff(\000)p Fp(8)p Fh(;)g Ff(\000)p Fp(10)p Fh(;)g Ff(\000)p +Fp(14)p Fh(;)g Ff(\000)p Fp(14)p Fh(;)f Ff(\000)p Fp(10)p Fh(;)h +Ff(\000)p Fp(8)p Fh(;)f Ff(\000)p Fp(6])651 2449 y(Indexed)15 +b(b)o(y)f(\014le)g(f)f(\(1)h(to)g(8\).)957 2574 y(53)p eop +%%Page: 54 56 +54 55 bop 262 307 a Fp(Doubled)13 b(pa)o(wns)h(are)g(p)q(enalised,)g(the)g +(size)h(of)e(the)h(p)q(enalt)o(y)g(dep)q(ends)h(on)f(the)g(\014le.)k(Dou-)262 +357 y(bled)e(pa)o(wns)g(are)g(w)o(orse)h(on)f(a)g(cen)o(tre)h(\014le)f(than)g +(on)g(the)h(\015ank,)f(not)g(b)q(ecause)i(they)e(are)262 407 +y(considered)c(an)o(y)e(w)o(eak)o(er,)i(but)f(b)q(ecause)i(they)e(hinder)g +(in)o(ter{piece)h(comm)o(unication.)i(Of-)262 457 y(ten)f(there)i(are)f(comp) +q(ensations)e(for)h(doubled)g(pa)o(wns,)g(suc)o(h)h(as)f(op)q(en)h(\014les,)f +(extra)h(cen)o(tre)262 506 y(con)o(trol)i(and)h(square)h(protection,)g(for)f +(example.)26 b(Ho)o(w)o(ev)o(er,)18 b(these)g(asp)q(ects)h(are)f(dealt)262 +556 y(with)13 b(b)o(y)h(other)g(ev)n(aluation)f(criteria.)324 +641 y(This)d(criterion)g(tak)o(es)h(a)f(simplistic)e(view)i(of)g(the)g(p)q +(enalties)h(asso)q(ciated)g(with)f(doubled)262 691 y(pa)o(wns)j(b)o(y)g +(applying)f(a)h(basic)g(p)q(enalt)o(y)m(.)k(A)c(more)g(extensiv)o(e)h +(analysis)e(of)h(the)h(asso)q(ciated)262 741 y(w)o(eaknesses)19 +b(suc)o(h)f(as)g(vulnerabilit)o(y)e(to)h(attac)o(k,)h(blo)q(c)o(k)n(ade)f +(etc)i(are)f(addressed)h(in)e(the)262 791 y(general)d(pa)o(wn)f(w)o(eakness)i +(criteria)f(\(de\014nition)g(9\).)262 943 y Fu(4.4.2)55 b(De\014nition)17 +b(8)i(:)24 b(Isolated)18 b(P)n(a)n(wns)262 1055 y Fp(A)12 b(pa)o(wn)f(is)h +(isolated)f(if)h(there)h(do)q(es)g(not)e(exist)i(a)e(friendly)h(pa)o(wn)f(on) +h(either)h(adjacen)o(t)f(\014le.)262 1104 y(Isolated)j(pa)o(wns)h(are)g(w)o +(eak)g(b)q(ecause)h(they)g(cannot)e(b)q(e)i(supp)q(orted)g(b)o(y)e(friendly)h +(pa)o(wns)262 1154 y(and)d(lik)o(e)g(doubled)h(pa)o(wns,)g(are)g(vulnerable)g +(to)g(attac)o(k)f(and)h(blo)q(c)o(k)n(ade.)344 1256 y Fh(I)s(P)392 +1262 y Fe(col)448 1256 y Fp(=)492 1225 y Fc(P)535 1236 y Fk(64)535 +1269 y Fe(sq)q Fk(=1)651 1256 y Fl(if)f Fp(\(Occup)o(y\([P)o(a)o +(wn],col,sq\))g Fl(and)g Fp(Isolated\(col,OnFile\(sq\)\)\))710 +1309 y Fh(I)728 1316 y Fe(O)q(nF)t(ile)p Fk(\()p Fe(sq)q Fk(\))651 +1359 y Fl(else)710 1409 y Fp(0)651 1459 y Fl(endif)344 1558 +y(where)380 1608 y Fh(I)398 1614 y Fe(f)433 1608 y Fp(:)147 +b([)p Ff(\000)p Fp(6)p Fh(;)7 b Ff(\000)p Fp(10)p Fh(;)g Ff(\000)p +Fp(14)p Fh(;)g Ff(\000)p Fp(20)p Fh(;)g Ff(\000)p Fp(20)p Fh(;)f +Ff(\000)p Fp(14)p Fh(;)g Ff(\000)p Fp(10)p Fh(;)h Ff(\000)p +Fp(6])651 1658 y(Indexed)15 b(b)o(y)f(\014le)g(f)f(\(1)h(to)g(8\).)262 +1777 y(Isolated)19 b(pa)o(wns)h(are)g(p)q(enalised)g(dep)q(ending)g(on)f +(their)h(cen)o(tralisation.)35 b(An)20 b(isolated)262 1826 +y(pa)o(wn)13 b(on)g(the)i Fl(d)e Fp(or)h Fl(e)f Fp(\014les)i(is)e(considered) +i(the)g(w)o(eak)o(est.)j(Ho)o(w)o(ev)o(er,)c(an)g(isolated)f(cen)o(tre)262 +1876 y(pa)o(wn)d(has)g(a)g(dynamic)f(strength)i(whic)o(h)g(Nimzo)o(witsc)o(h) +e(so)h(elo)q(quen)o(tly)g(said)g(w)o(as)g(its)h("lust)262 1926 +y(to)16 b(expand".)28 b(This)17 b(asp)q(ect)i(is)e(co)o(v)o(ered)h(b)o(y)e +(other)i(ev)n(aluation)e(criteria,)i(for)e(example,)262 1976 +y(cen)o(tre)i(con)o(trol.)29 b(Also)17 b(asp)q(ects)i(concerning)f(the)g(w)o +(eaknesses)h(of)e(isolated)g(pa)o(wns)g(are)262 2026 y(sp)q(eci\014cally)d +(addressed)h(in)f(the)g(pa)o(wn)g(w)o(eakness)h(criteria)f(b)q(elo)o(w.)262 +2177 y Fu(4.4.3)55 b(De\014nition)17 b(9)i(:)24 b(W)-5 b(eak)19 +b(P)n(a)n(wns)262 2289 y Fp(P)o(a)o(wns)e(are)h(w)o(eak)f(when)h(they)g(are)g +(not)g(protected)h(b)o(y)e(friendly)g(pa)o(wns)g(and)h(a)f(single)262 +2339 y(pa)o(wn)f(mo)o(v)o(e)g(cannot)h(b)q(e)h(made)e(whic)o(h)h(ac)o(hiev)o +(es)g(this)g(protection.)29 b(W)m(eak)16 b(pa)o(wns)h(are)262 +2389 y(therefore)d(vulnerable)e(to)h(attac)o(k.)k(They)c(constitute)h +(targets)f(whic)o(h)f(the)i(opp)q(onen)o(t)e(can)262 2439 y(aim)e(for.)17 +b(A)12 b(bac)o(kw)o(ard)h(pa)o(wn)f(is)g(therefore,)i(a)e(classic)g(example)g +(of)f(a)h(w)o(eak)h(pa)o(wn)f(under)957 2574 y(54)p eop +%%Page: 55 57 +55 56 bop 262 307 a Fp(m)o(y)14 b(de\014nition.)23 b(The)16 +b(idea)f(of)g(this)h(de\014nition)g(is)f(to)h(pic)o(k)f(up)h(as)g(man)o(y)e +(cases)j(of)e(w)o(eak)262 357 y(pa)o(wns)i(as)h(p)q(ossible)h(in)e(one)h +(general)g(set)h(of)e(criteria.)31 b(Therefore)19 b(isolated,)f(doubled,)262 +407 y(bac)o(kw)o(ard)13 b(and)h(pa)o(wn)g(c)o(hain)f(bases)i(ma)o(y)d(all)h +(b)q(e)h(p)q(enalised)g(for)g(w)o(eakness.)324 492 y(In)i("My)f(System")g +([43)o(],)g(Aron)h(Nimzo)o(witsc)o(h)f(giv)o(es)g(the)h(follo)o(wing)e(c)o +(hess)j(strategy)262 542 y(for)9 b(handling)g(pa)o(wn)h(c)o(hains,)g("W)m(e)g +(\014rst)g(direct)h(our)f(op)q(erations)h(against)e(the)i(base,)g(whic)o(h) +262 592 y(w)o(e)17 b(attac)o(k)g(with)f(a)h(pa)o(wn,)g(and)f(b)o(y)h(threats) +h(or)f(otherwise,)h(seek)g(to)f(cut)h(o\013)e(the)i(base)262 +641 y(from)13 b(its)j(asso)q(ciates)g(in)f(the)h(c)o(hain.)23 +b(This)15 b(done,)h(w)o(e)g(turn)g(our)f(atten)o(tion)h(to)f(the)h(next)262 +691 y(opp)q(onen)o(t,)d(namely)f(the)i(link)e(whic)o(h)h(has)h(no)o(w)f(b)q +(ecome)g(the)h(new)g(base".)k(This)13 b(metho)q(d)262 741 y(of)18 +b(handling)g(pa)o(wn)h(c)o(hains)h(will)e(b)q(e)i(encouraged)g(b)o(y)f(this)h +(de\014nition)f(b)q(ecause)i(w)o(eak)262 791 y(pa)o(wn)11 b(bases)i(are)f +(iden)o(ti\014ed)g(and)f(progressiv)o(ely)h(p)q(enalised,)g(therefore)h +(encouraging)f(the)262 841 y(attac)o(king)h(side)h(to)g(build)f(up)h +(pressure)i(on)e(the)g(w)o(eak)g(pa)o(wn.)344 943 y Fh(W)6 +b(P)416 949 y Fe(col)471 943 y Fp(=)515 912 y Fc(P)559 922 +y Fk(64)559 955 y Fe(sq)q Fk(=1)642 943 y Fh(W)g(K)722 949 +y Fe(col;sq)344 1046 y Fl(where)380 1095 y Fh(W)g(K)460 1101 +y Fe(col;sq)559 1095 y Fp(:)j Fl(if)k Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\))g +Fl(and)g Fp(W)m(eak\(col,sq\)\))639 1145 y Fh(W)6 b(K)719 1151 +y Fe(col;sq)817 1145 y Fp(=)12 b Fh(W)900 1151 y Fe(col;sq)995 +1145 y Ff(\000)d Fp(10)g Ff(\001)g Fh(])p Fp(A)o(ttac)o(ks\([P)o(a)o +(wn],Opp\(col\),)p Fh(sq)1625 1151 y Fe(inf)s(r)q(ont)1744 +1145 y Fp(\))639 1195 y Fl(if)k Fp(\(SemiOp)q(en\(Opp\(col\),OnFile\(sq\)\)) +639 1245 y Fl(and)h Fp(Has\([Ro)q(ok,Queen],Opp\(col\)\)\))699 +1295 y Fh(W)6 b(K)779 1301 y Fe(col;sq)876 1295 y Fp(=)12 b +Fh(W)6 b(K)1000 1301 y Fe(col;sq)1086 1295 y Ff(\000)14 b Fp(phase/2)639 +1345 y Fl(endif)639 1394 y(if)f Fp(\(A)o(ttac)o(k)o(ed\([Ro)q +(ok],Opp\(col\),sq\)\))699 1444 y Fh(W)6 b(K)779 1450 y Fe(col;sq)876 +1444 y Fp(=)12 b Fh(W)6 b(K)1000 1450 y Fe(col;sq)1095 1444 +y Ff(\000)k Fp(4)639 1494 y Fl(endif)639 1544 y(if)j Fp(\(Occup)o(y\([An)o +(y],Opp\(col\),)p Fh(sq)1170 1550 y Fe(inf)s(r)q(ont)1290 1544 +y Fp(\)\))699 1594 y Fh(W)6 b(K)779 1600 y Fe(col;sq)876 1594 +y Fp(=)12 b Fh(W)6 b(K)1000 1600 y Fe(col;sq)1095 1594 y Ff(\000)k +Fp(8)639 1643 y Fl(endif)580 1693 y(else)639 1743 y Fh(W)c(K)719 +1749 y Fe(col;sq)817 1743 y Fp(=)12 b(0)580 1793 y Fl(endif)380 +1892 y Fh(W)419 1898 y Fe(col;sq)518 1892 y Fp(:)50 b(di\013)14 +b(=)g Fh(])p Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq\))580 1942 +y Fl(if)f Fp(\(di\013)h Fh(>)g Fp(0\))639 1992 y Fl(if)f Fp(\(di\013)h +Fh(<)g Fp(5\))699 2042 y Fh(W)738 2048 y Fe(col;sq)835 2042 +y Fp(=)g([)p Ff(\000)p Fp(10)p Fh(;)7 b Ff(\000)p Fp(18)p Fh(;)g +Ff(\000)p Fp(26)p Fh(;)g Ff(\000)p Fp(32])758 2092 y(Indexed)14 +b(b)o(y)g(di\013)g(\(1)f(to)h(4\).)639 2142 y Fl(else)699 2191 +y Fh(W)738 2197 y Fe(col;sq)835 2191 y Fp(=)e Ff(\000)p Fp(35)639 +2241 y Fl(endif)580 2291 y(else)639 2341 y Fh(W)678 2347 y +Fe(col;sq)776 2341 y Fp(=)g Ff(\000)p Fp(4)580 2391 y Fl(endif)957 +2574 y Fp(55)p eop +%%Page: 56 58 +56 57 bop 262 307 a Fp(W)m(eak)10 b(pa)o(wns)h(are)g(p)q(enalised)g(for)g +(the)g(sev)o(erit)o(y)g(of)g(the)g(attac)o(k)g(up)q(on)g(them.)16 +b(A)11 b(p)q(enalt)o(y)g(is)262 357 y(levied)h(when)g(a)g(w)o(eak)g(pa)o(wn)g +(is)g(on)g(a)g(semi-op)q(en)g(\014le)g(and)g(the)h(opp)q(onen)o(t)f(has)h +(the)f(pieces)262 407 y(to)j(tak)o(e)g(adv)n(an)o(tage)g(of)g(this)g(w)o +(eakness.)24 b(A)15 b(w)o(eak)h(pa)o(wn)f(whose)h(adv)n(ance)f(is)h +(restricted)262 457 y(b)o(y)d(enem)o(y)g(pa)o(wn)h(attac)o(ks)g(is)g(further) +h(p)q(enalised.)324 542 y(The)k(blo)q(c)o(k)n(ade)g(of)f(w)o(eak)h(p)q(oin)o +(ts)g(form)e(an)i(imp)q(ortan)o(t)e(part)j(of)e(p)q(ositional)g(c)o(hess.)262 +592 y(Therefore)d(w)o(eak)e(pa)o(wns)h(are)h(p)q(enalised)f(for)f(b)q(eing)h +(blo)q(c)o(k)n(aded)g(b)o(y)g(the)g(opp)q(onen)o(t.)262 742 +y Fu(4.4.4)55 b(De\014nition)17 b(10)i(:)24 b(P)n(assed)c(P)n(a)n(wns)262 +854 y Fp(A)c(pa)o(wn)g(is)g(passed)h(when)g(no)f(enem)o(y)g(pa)o(wns)g(on)g +(the)h(same)f(or)g(adjacen)o(t)h(\014les)f(hinder)262 904 y(the)i(pa)o(wns)g +(adv)n(ance)f(to)h(the)g(promotion)e(square.)30 b(A)18 b(passed)h(pa)o(wn)e +(is)h(of)f(particular)262 954 y(v)n(alue,)e(esp)q(ecially)g(as)h(the)g(game)f +(progresses)i(in)o(to)e(the)i(endgame.)22 b(It)16 b(not)g(only)f(carries)262 +1004 y(the)h(p)q(oten)o(tial)g(threat)h(of)e(b)q(ecoming)g(a)h(queen,)h(but)f +(also)g(distracts)h(the)g(enem)o(y)e(pieces)262 1054 y(from)d(other)i(duties) +h(in)e(order)i(to)e(restrain)i(the)g(passed)f(pa)o(wn.)344 +1151 y Fh(P)6 b(P)404 1157 y Fe(col)459 1151 y Fp(=)503 1120 +y Fc(P)546 1130 y Fk(64)546 1163 y Fe(sq)q Fk(=1)629 1151 y +Fh(P)g(D)696 1157 y Fe(col;sq)344 1254 y Fl(where)380 1303 +y Fh(P)g(D)447 1309 y Fe(col;sq)546 1303 y Fp(:)58 b Fl(if)13 +b Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\))g Fl(and)g Fp(P)o(assed\(col,sq\)\)) +675 1353 y Fl(if)g Fp(\(phase)h Fh(>)g Fp(9\))734 1403 y Fh(P)6 +b(D)801 1409 y Fe(col;sq)898 1403 y Fp(=)12 b Fh(P)6 b Fp(4)996 +1410 y Fe(O)q(nRank)q Fk(\()p Fe(col;sq)q Fk(\))675 1453 y +Fl(else)734 1503 y(if)13 b Fp(\()p Fh(M)5 b(tl)864 1510 y Fe(O)q(pp)p +Fk(\()p Fe(col)p Fk(\))1008 1503 y Fp(=)14 b(KingV)m(alue\))793 +1553 y Fl(if)f Fp(\()p Fl(not)g Fp(InsideQuadrate\(Opp\(col\),sq\)\))852 +1602 y Fh(P)6 b(D)919 1608 y Fe(col;sq)1016 1602 y Fp(=)12 +b Fh(P)6 b Fp(1)1114 1609 y Fe(O)q(nRank)q Fk(\()p Fe(col;sq)q +Fk(\))793 1652 y Fl(else)852 1702 y Fh(P)g(D)919 1708 y Fe(col;sq)1016 +1702 y Fp(=)12 b Fh(P)6 b Fp(2)1114 1709 y Fe(O)q(nRank)q Fk(\()p +Fe(col;sq)q Fk(\))793 1752 y Fl(endif)734 1802 y(else)793 1851 +y Fh(P)g(D)860 1857 y Fe(col;sq)957 1851 y Fp(=)12 b Fh(P)6 +b Fp(3)1055 1858 y Fe(O)q(nRank)q Fk(\()p Fe(col;sq)q Fk(\))734 +1901 y Fl(endif)734 1951 y(if)13 b Fp(\(InsideQuadrate\(Opp\(col\),sq\)\))793 +2001 y Fh(P)6 b(D)860 2007 y Fe(col;sq)957 2001 y Fp(=)12 b +Fh(P)6 b(D)1068 2007 y Fe(col;sq)1163 2001 y Ff(\000)j Fh(r)q(ev)q(P)d(hase=) +p Fp(2)734 2051 y Fl(endif)734 2100 y Fh(P)g(D)801 2106 y Fe(col;sq)898 +2100 y Fp(=)12 b Fh(P)6 b(D)1009 2106 y Fe(col;sq)1104 2100 +y Ff(\000)j Fh(])p Fp(Occupied\()p Fh(sq)1382 2106 y Fe(inf)s(r)q(ont)1503 +2100 y Fp(,PSq\(col,sq\)\))p Ff(\001)p Fp(revPhase/4)734 2150 +y Fl(if)30 b Fp(\(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,)p Fh(sq)1224 +2156 y Fe(inf)s(r)q(ont)1342 2150 y Fp(\))793 2200 y Fl(or)13 +b Fp(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,sq\)\))793 2250 y +Fh(P)6 b(D)860 2256 y Fe(col;sq)957 2250 y Fp(=)12 b Fh(P)6 +b(D)1068 2256 y Fe(col;sq)1163 2250 y Fp(+)j Fh(U)c(N)1270 +2257 y Fe(O)q(nRank)q Fk(\()p Fe(col;sq)q Fk(\))734 2300 y +Fl(endif)734 2350 y(if)13 b Fp(\(Occup)o(y\([An)o(y],Opp\(col\),)p +Fh(sq)1265 2356 y Fe(inf)s(r)q(ont)1384 2350 y Fp(\)\))793 +2399 y Fh(P)6 b(D)860 2405 y Fe(col;sq)957 2399 y Fp(=)12 b +Fh(P)6 b(D)1068 2405 y Fe(col;sq)1163 2399 y Ff(\000)j Fh(r)q(ev)q(P)d(hase) +734 2449 y Fl(endif)957 2574 y Fp(56)p eop +%%Page: 57 59 +57 58 bop 734 307 a Fl(for)15 b(eac)o(h)g(square)f Fp(sq2)f +Fl(b)q(et)o(w)o(een)g Fp(sq)h Fl(and)f Fp(PSq\(col,sq\))h Fl(do)793 +357 y Fh(P)6 b(D)860 363 y Fe(col;sq)957 357 y Fp(=)12 b Fh(P)6 +b(D)1068 363 y Fe(col;sq)1163 357 y Fp(+)j(4)g Ff(\001)g Fh(])p +Fp(Di\013A)o(ttac)o(ks\(col,sq2\))734 407 y Fl(endfor)675 457 +y(endif)675 506 y Fh(P)d(D)742 512 y Fe(col;sq)839 506 y Fp(=)12 +b Fh(P)6 b(D)950 512 y Fe(col;sq)1035 506 y Ff(\001)14 b Fp(revPhase/16)616 +556 y Fl(else)675 606 y Fh(P)6 b(D)742 612 y Fe(col;sq)839 +606 y Fp(=)12 b(0)616 656 y Fl(endif)380 756 y Fh(P)6 b Fp(1)434 +762 y Fe(r)465 756 y Fp(:)139 b([0)p Fh(;)7 b Fp(400)p Fh(;)g +Fp(400)p Fh(;)f Fp(450)o Fh(;)h Fp(5)o(15)p Fh(;)f Fp(600)p +Fh(;)g Fp(700)o Fh(;)h Fp(0])675 805 y(Indexed)15 b(b)o(y)e(rank)h(r)g(\(1)g +(to)g(8\).)380 905 y Fh(P)6 b Fp(2)434 911 y Fe(r)465 905 y +Fp(:)139 b([0)p Fh(;)7 b Fp(40)p Fh(;)g Fp(40)p Fh(;)g Fp(5)o(5)p +Fh(;)f Fp(80)p Fh(;)g Fp(115)p Fh(;)g Fp(155)o Fh(;)h Fp(0])675 +955 y(Indexed)15 b(b)o(y)e(rank)h(r)g(\(1)g(to)g(8\).)380 1054 +y Fh(P)6 b Fp(3)434 1060 y Fe(r)465 1054 y Fp(:)139 b([0)p +Fh(;)7 b Fp(22)p Fh(;)g Fp(22)p Fh(;)g Fp(4)o(0)p Fh(;)f Fp(65)p +Fh(;)g Fp(95)p Fh(;)g Fp(135)p Fh(;)g Fp(0])675 1104 y(Indexed)15 +b(b)o(y)e(rank)h(r)g(\(1)g(to)g(8\).)380 1204 y Fh(P)6 b Fp(4)434 +1210 y Fe(r)465 1204 y Fp(:)139 b([0)p Fh(;)7 b Fp(16)p Fh(;)g +Fp(16)p Fh(;)g Fp(3)o(2)p Fh(;)f Fp(44)p Fh(;)g Fp(56)p Fh(;)g +Fp(68)p Fh(;)g Fp(0])675 1254 y(Indexed)15 b(b)o(y)e(rank)h(r)g(\(1)g(to)g +(8\).)380 1353 y Fh(U)5 b(N)446 1359 y Fe(r)478 1353 y Fp(:)126 +b([0)p Fh(;)7 b Fp(6)p Fh(;)g Fp(6)p Fh(;)g Fp(12)p Fh(;)f +Fp(28)o Fh(;)h Fp(86)o Fh(;)g Fp(12)o(0)p Fh(;)g Fp(0)o(])675 +1403 y(Indexed)15 b(b)o(y)e(rank)h(r)g(\(1)g(to)g(8\).)262 +1522 y(Using)d(this)g(de\014nition,)g(passed)h(pa)o(wns)f(are)h(classi\014ed) +g(under)g(4)f(categories.)18 b(This)11 b(allo)o(ws)262 1571 +y(unstoppable)17 b(passed)h(pa)o(wns)g(to)f(b)q(e)h(iden)o(ti\014ed)f(and)g +(giv)o(en)g(increased)i(b)q(on)o(uses.)29 b(The)262 1621 y(v)n(alue)8 +b(of)h(a)g(passed)i(pa)o(wn)e(is)g(dep)q(enden)o(t)i(on)e(its)h(category)g +(and)f(the)h(obstructions)g(b)q(et)o(w)o(een)262 1671 y(its)j(curren)o(t)j +(square)e(and)g(the)h(queening)f(square.)324 1756 y(The)c(passed)h(pa)o(wn)f +(is)g(p)q(enalised)g(for)g(b)q(eing)g('within)f(range')h(of)f(the)i(enem)o(y) +e(king.)16 b(The)262 1806 y(blo)q(c)o(k)n(ade)g(of)h(a)g(passed)h(pa)o(wn)f +(is)g(v)o(ery)g(e\013ectiv)o(e)i(as)e(it)g(is)g(a)g(metho)q(d)f(of)h(mec)o +(hanically)262 1856 y(stopping)c(the)i(pa)o(wns)f(progress.)365 +1939 y("The)g(passed)h(pa)o(wn)f(is)g(a)f(criminal)f(who)h(should)h(b)q(e)h +(k)o(ept)f(under)h(lo)q(c)o(k)e(and)365 1989 y(k)o(ey)m(.)18 +b(Mild)13 b(measures,)h(suc)o(h)g(as)g(p)q(olice)g(surv)o(eillance)g(are)g +(not)g(su\016cien)o(t.")1206 2055 y Fm(A)o(r)n(on)g(Nimzowitsch)262 +2174 y Fp(Therefore,)e(a)e(passed)i(pa)o(wn)e(is)g(p)q(enalised)h(for)g(b)q +(oth)f(immediate)e(and)j(future)g(blo)q(c)o(k)n(aders.)262 +2223 y(This)18 b(has)h(the)h(b)q(ene\014t)g(of)e(encouraging)h(the)g(opp)q +(osing)f(side)h(to)g(blo)q(c)o(k)n(ade)f(along)g(the)262 2273 +y(complete)c(path)h(of)g(the)h(passed)g(pa)o(wn.)22 b(Connected)17 +b(or)e(united)h(passed)g(pa)o(wns)f(receiv)o(e)262 2323 y(a)e(b)q(on)o(us)g +(for)g(their)h(added)g(strength.)19 b(This)13 b(b)q(on)o(us)h(increases)h +(dramatically)10 b(with)j(rank.)262 2373 y(Con)o(trol)k(is)h(encouraged)i(o)o +(v)o(er)e(all)f(squares)i(b)q(et)o(w)o(een)h(the)f(pa)o(wn)f(and)g(the)h +(promotion)262 2423 y(square.)f(The)d(b)q(on)o(uses)g(and)e(p)q(enalties)i +(are)f(adjusted)g(dep)q(ending)h(on)f(the)g(game)e(phase.)957 +2574 y(57)p eop +%%Page: 58 60 +58 59 bop 262 307 a Fu(4.4.5)55 b(De\014nition)17 b(11)i(:)24 +b(P)n(a)n(wn)d(T)-5 b(able)344 403 y Fh(P)6 b(T)401 409 y Fe(col)456 +403 y Fp(=)500 372 y Fc(P)544 382 y Fk(64)544 415 y Fe(sq)q +Fk(=1)675 403 y Fl(if)13 b Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\)\))734 +456 y Fh(P)6 b(S)r(T)818 462 y Fe(col;sq)675 506 y Fl(else)734 +556 y Fp(0)675 605 y Fl(endif)344 705 y(where)380 755 y Fh(P)g(S)r(T)464 +761 y Fe(col;sq)564 755 y Fp(:)40 b(P)o(a)o(wn)13 b(Square)i(T)m(able.)i +(Initialised)c(b)q(efore)i(eac)o(h)f(searc)o(h.)616 805 y(See)h(planning)d +(section)j(4.11.3)d(for)h(details.)262 931 y(A)j(static)g(pa)o(wn)g(square)g +(table)g(will)f(b)q(e)h(used)h(to)f(store)h(the)g(v)n(alues)e(of)h(eac)o(h)g +(square)h(for)262 981 y(ha)o(ving)e(a)h(pa)o(wn)g(o)q(ccup)o(y)h(that)f +(square.)27 b(This)16 b(enables)h(kno)o(wledge)f(calculated)h(at)f(the)262 +1031 y(ro)q(ot)e(to)h(b)q(e)g(e\016cien)o(tly)g(applied)f(at)g(leaf)g(no)q +(des.)22 b(The)15 b(table)f(will)g(b)q(e)h(calculated)g(b)q(efore)262 +1081 y(commencemen)o(t)c(of)j(the)g(searc)o(h)h(in)e(an)h(initial)e(planning) +h(phase.)262 1232 y Fu(4.4.6)55 b(De\014nition)17 b(12)i(:)24 +b(P)n(a)n(wn)d(V)-5 b(alue)344 1323 y Fh(P)6 b(V)401 1329 y +Fe(col)456 1323 y Fp(=)12 b Fh(D)q(P)562 1329 y Fe(col)615 +1323 y Fp(+)e Fh(I)s(P)705 1329 y Fe(col)758 1323 y Fp(+)g +Fh(W)c(P)872 1329 y Fe(col)925 1323 y Fp(+)j Fh(P)d(P)1026 +1329 y Fe(col)1078 1323 y Fp(+)k Fh(P)c(T)1177 1329 y Fe(col)344 +1423 y Fl(where)380 1473 y Fh(D)q(P)442 1479 y Fe(col)498 1473 +y Fp(:)23 b Fl(Doubled)13 b(P)o(a)o(wns)i(\(De\014niti)o(on)e(7\).)380 +1572 y Fh(I)s(P)428 1578 y Fe(col)498 1572 y Fp(:)23 b Fl(Isolated)14 +b(P)o(a)o(wns)h(\(De\014niti)o(on)e(8\).)380 1672 y Fh(W)6 +b(P)452 1678 y Fe(col)498 1672 y Fp(:)23 b Fl(W)l(eak)17 b(P)o(a)o(wns)e +(\(De\014niti)o(on)d(9\).)380 1772 y Fh(P)6 b(P)440 1778 y +Fe(col)498 1772 y Fp(:)23 b Fl(P)o(assed)15 b(P)o(a)o(wns)g(\(De\014niti)o +(on)d(10\).)380 1871 y Fh(P)6 b(T)437 1877 y Fe(col)498 1871 +y Fp(:)23 b Fl(P)o(a)o(wn)15 b(T)l(able)g(\(De\014niti)o(on)e(11\).)262 +1998 y Fp(All)d(the)j(pa)o(wn)e(ev)n(aluation)f(criteria)i(used)h(in)e(this)h +(section)g(can)g(b)q(e)g(summed)e(to)i(calculate)262 2048 y(a)h(total)g(pa)o +(wn)h(v)n(alue)f(for)h(ev)o(ery)g(pa)o(wn)g(of)f(a)h(giv)o(en)f(colour.)957 +2574 y(58)p eop +%%Page: 59 61 +59 60 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0s0ZrZkZ)646 +482 y(Z0Z0Z0ob)646 565 y(pZ0o0o0o)646 648 y(Z0mPlPZ0)646 731 +y(pZPZPZPZ)646 814 y(Z0Z0L0MP)646 897 y(0Z0M0ZKZ)646 980 y(ZRZ0S0Z0)p +1310 980 V 641 984 673 5 v 339 1102 a Fp(Figure)14 b(4.4:)j +Fl(Capablanca)e(v)h(Bogljub)q(o\013)p Fp(,)11 b(London)i(1922,)g(White)g(to)h +(Pla)o(y)m(.)324 1221 y(Applying)e(these)j(pa)o(wn)f(ev)n(aluation)e +(criteria)i(to)f(the)h(p)q(osition)f(sho)o(wn)h(in)f(\014gure)h(4.4,)262 +1271 y(will)e(pro)q(duce)j(the)g(follo)o(wing)c(results:)344 +1368 y Fh(P)6 b(V)401 1374 y Fe(W)t(hite)533 1368 y Fp(=)14 +b(0)9 b(+)h(0)f Ff(\000)g Fp(74)g(+)h(0)f(+)g(118)i(=)h(44)344 +1418 y Fh(P)6 b(V)401 1424 y Fe(B)q(lack)533 1418 y Fp(=)14 +b Ff(\000)p Fp(12)9 b Ff(\000)h Fp(32)f Ff(\000)g Fp(70)g(+)g(18)g(+)h(84)h +(=)g Ff(\000)p Fp(12)957 2574 y(59)p eop +%%Page: 60 62 +60 61 bop 262 307 a Fr(4.5)69 b(Knigh)n(t)23 b(Ev)l(aluation)262 +434 y Fp(Knigh)o(ts)17 b(are)h(v)o(ery)g(useful)g(pieces,)h(particularly)e +(in)g(the)h(op)q(ening)f(and)h(middle)e(game.)262 483 y(Knigh)o(ts)10 +b(are)h(esp)q(ecially)g(e\013ectiv)o(e)h(in)e(closed)i(p)q(ositions)e(where)i +(they)f(can)g('jump')d(o)o(v)o(er)j(an)262 533 y(obstructing)g(pa)o(wn)g(c)o +(hain.)17 b(A)12 b(knigh)o(t)e(b)q(ecomes)i(v)o(ery)f(strong)h(if)e(it)h +(reac)o(hes)i(an)e(adv)n(anced)262 583 y(cen)o(tral)i(p)q(ost)h(whic)o(h)g +(cannot)f(b)q(e)i(attac)o(k)o(ed)e(b)o(y)h(enem)o(y)e(pa)o(wns.)18 +b(In)c(the)g(ending,)f(knigh)o(ts)262 633 y(are)i(generally)g(less)h +(e\013ectiv)o(e)h(b)q(ecause)g(they)f(only)e(ha)o(v)o(e)h(a)g(short)h(range.) +23 b(Knigh)o(ts)15 b(also)262 683 y(ha)o(v)o(e)e(the)i(abilit)o(y)d(to)i +(fork)f(opp)q(osing)g(forces.)262 834 y Fu(4.5.1)55 b(De\014nition)17 +b(13)i(:)24 b(Knigh)n(t)19 b(V)-5 b(alue)344 1001 y Fh(N)5 +b(V)406 1007 y Fe(col)462 1001 y Fp(=)506 970 y Fc(P)549 980 +y Fk(64)549 1013 y Fe(sq)q Fk(=1)675 1001 y Fl(if)13 b Fp(\(Occup)o +(y\([Knigh)o(t],col,sq\)\))734 1054 y Fh(N)5 b(S)r(T)823 1060 +y Fe(col;sq)675 1104 y Fl(else)734 1153 y Fp(0)675 1203 y Fl(endif)344 +1303 y(where)380 1353 y Fh(N)g(S)r(T)469 1359 y Fe(col;sq)569 +1353 y Fp(:)35 b(Knigh)o(t)13 b(Square)i(T)m(able.)i(Initialised)c(b)q(efore) +h(eac)o(h)h(searc)o(h.)616 1402 y(See)g(planning)d(section)j(4.11.4)d(for)h +(details.)262 1529 y(Knigh)o(t)19 b(ev)n(aluation)f(criteria)h(are)h(com)o +(bined)e(in)h(a)g(knigh)o(t)g(square)h(table.)34 b(Concepts)262 +1579 y(suc)o(h)19 b(as)f(pa)o(wn)g(holes,)i(strong)e(squares,)j(cen)o +(tralisation)d(and)g(king)g(closeness)i(will)d(b)q(e)262 1629 +y(calculated)d(in)f(an)h(initial)e(planning)g(phase.)324 1714 +y(It)k(m)o(ust)f(b)q(e)i(remem)o(b)q(ered)f(that)h(all)e(ev)n(aluation)g +(criteria)h(are)h(in)o(trinsically)e(link)o(ed.)262 1764 y(Therefore,)g +(knigh)o(ts)f(will)e(b)q(e)j(additionally)d(ev)n(aluated)i(b)o(y)g(other)h +(criteria)g(for)f(suc)o(h)h(fea-)262 1814 y(tures)f(as)f(the)g(pa)o(wn)g(blo) +q(c)o(k)n(ade,)f(cen)o(tre)j(con)o(trol,)d(square)i(con)o(trol,)f(...)j +(etc,etc.)k(Applying)262 1864 y(these)15 b(knigh)o(t)e(ev)n(aluation)f +(criteria)j(to)e(the)i(p)q(osition)e(in)h(\014gure)g(4.4)f(giv)o(es:)344 +1961 y Fh(N)5 b(V)406 1967 y Fe(W)t(hite)533 1961 y Fp(=)14 +b(6)344 2011 y Fh(N)5 b(V)406 2017 y Fe(B)q(lack)533 2011 y +Fp(=)14 b(6)957 2574 y(60)p eop +%%Page: 61 63 +61 62 bop 262 307 a Fr(4.6)69 b(Bishop)23 b(Ev)l(aluation)262 +434 y Fp(Bishops)16 b(are)g(e\013ectiv)o(e)h(pieces)g(throughout)f(the)g +(game,)f(but)h(esp)q(ecially)f(in)h(op)q(en)g(p)q(osi-)262 +483 y(tions)d(where)h(their)g(scop)q(e)h(is)e(less)h(hindered.)k(A)c(bishop)f +(is)g(often)h(used)g(to)f(pin)g(opp)q(osing)262 533 y(forces)h(and)e(attac)o +(k)i(w)o(eak)f(p)q(oin)o(ts.)k(A)c(single)g(bishop)g(can)g(only)g(exert)h +(pressure)h(\(attac)o(k\))262 583 y(on)h(squares)i(of)e(the)h(colour)f(it)g +(is)h(on.)26 b(Therefore,)18 b(bishops)e(are)h(particularly)f(e\013ectiv)o(e) +262 633 y(in)f(pairs)i(where)g(they)g(can)g(attac)o(k)f(b)q(oth)g(coloured)h +(squares.)27 b(In)16 b(the)h(ending,)f(bishops)262 683 y(are)g(as)f(a)h +(general)f(rule)h(b)q(etter)h(than)f(knigh)o(ts.)23 b(Ho)o(w)o(ev)o(er,)16 +b(there)h(are)f(strategies)h(whic)o(h)262 732 y(diminish)11 +b(a)j(bishops)g(p)q(o)o(w)o(er)g(e.g.)k(pa)o(wn)13 b(obstructions.)262 +883 y Fu(4.6.1)55 b(De\014nition)17 b(14)i(:)24 b(Bishop)19 +b(A)n(ttac)n(k)344 1050 y Fh(B)r(A)408 1056 y Fe(col)464 1050 +y Fp(=)508 1019 y Fc(P)552 1029 y Fk(64)552 1062 y Fe(sq)q +Fk(=1)675 1050 y Fl(if)13 b Fp(\(Occup)o(y\([Knigh)o(t,Bishop,Ro)q +(ok,Queen],Opp\(col\),sq\))675 1103 y Fl(and)g Fp(A)o(ttac)o(k)o +(ed\([Bishop],col,sq\)\))734 1153 y(V)m(alue\(sq\))675 1202 +y Fl(else)734 1252 y Fp(0)675 1302 y Fl(endif)262 1424 y Fp(Bishops)d(are)g +(giv)o(en)f(a)h(b)q(on)o(us)g(for)f(attac)o(king)g(enem)o(y)g(pieces,)j(the)e +(v)n(alue)f(of)g(whic)o(h)h(dep)q(ends)262 1473 y(on)18 b(the)h(t)o(yp)q(e)g +(of)g(piece)g(attac)o(k)o(ed.)33 b(This)18 b(criterion)i(will)d(encourage)i +(the)h(program)d(to)262 1523 y(harass)c(the)h(enem)o(y)e(forces)i +(particularly)e(those)i(of)e(high)g(v)n(alue,)g(e.g.)18 b(ro)q(oks)13 +b(and)g(queens.)324 1608 y(Note)18 b(that)f(pa)o(wns)h(are)g(excluded)h(as)e +(they)i(are)f(more)e(lik)o(ely)g(to)i(obstruct)h(the)f(at-)262 +1658 y(tac)o(king)e(bishop)i(than)f(b)q(e)h(harassed)h(themselv)o(es.)29 +b(See)19 b(de\014nition)e(18,)g(Enem)o(y)g(P)o(a)o(wn)262 1708 +y(Obstruction,)d(for)g(more)e(details.)262 1859 y Fu(4.6.2)55 +b(De\014nition)17 b(15)i(:)24 b(Bishop)19 b(on)g(Kings)f(Diagonal)344 +2025 y Fh(B)r(K)412 2031 y Fe(col)469 2025 y Fp(=)512 1994 +y Fc(P)556 2005 y Fk(64)556 2038 y Fe(sq)q Fk(=1)675 2025 y +Fl(if)13 b Fp(\(Occup)o(y\([Bishop],col,sq\))675 2078 y Fl(and)g +Fp(SameDiagonal\(sq,Ki)o(ngSq\(Opp\(col\)\)\)\))734 2128 y(phase/2)675 +2178 y Fl(else)734 2228 y Fp(0)675 2278 y Fl(endif)262 2399 +y Fp(Bishops)f(are)g(encouraged)g(to)g(remain)e(on)i(the)g(same)f(diagonal)f +(as)h(the)i(enem)o(y)e(king.)16 b(The)262 2449 y(b)q(on)o(us)e(receiv)o(ed)h +(decreases)h(as)e(the)h(game)d(progresses.)20 b(This)14 b(is)f(an)h(attempt)f +(to)h(correct)957 2574 y(61)p eop +%%Page: 62 64 +62 63 bop 262 307 a Fp(a)16 b(w)o(eakness)i(I)e(feel)h(most)f(c)o(hess)i +(programs)d(ha)o(v)o(e.)26 b(That)17 b(of)f(lea)o(ving)f(the)j(king)e(on)g +(the)262 357 y(same)e(diagonal)f(as)i(the)h(enem)o(y)e(bishop,)h +(particularly)f(when)i(it)f(is)g(on)f(a)h(long)f(diagonal)262 +407 y(and)f(a)h(n)o(um)o(b)q(er)f(of)g(pieces)i(are)g(in)o(terp)q(osed.)324 +492 y(The)d(ideas)g(b)q(ehind)g(suc)o(h)h(a)f(strategy)g(are)h(normally)c +(more)i(long)g(term)g(and)h(therefore)262 542 y(cannot)i(b)q(e)i(clearly)e +(iden)o(ti\014ed)h(b)o(y)f(searc)o(h.)22 b(Against)14 b(a)g(h)o(uman)f(opp)q +(onen)o(t)i(this)g(t)o(yp)q(e)g(of)262 592 y(bishop)g(placemen)o(t)g(will)f +(hop)q(efully)h(pro)o(vide)h(an)f(attac)o(king)g(p)q(oten)o(tial)g(whic)o(h)h +(disturbs)262 641 y(the)e(opp)q(onen)o(ts)h(liking)d(for)h(the)i(p)q +(osition.)262 793 y Fu(4.6.3)55 b(De\014nition)17 b(16)i(:)24 +b(Bishop)19 b(P)n(air)344 955 y Fh(B)r(P)404 961 y Fe(col)462 +955 y Fp(=)122 b Fl(if)13 b Fp(\(Has\([Bishop],col\))g Fh(>)h +Fp(1\))675 1005 y(8)616 1055 y Fl(else)675 1104 y Fp(0)616 +1154 y Fl(endif)262 1281 y Fp(Bishops)i(w)o(ork)g(most)f(e\013ectiv)o(ely)i +(in)e(pairs.)25 b(This)16 b(is)g(b)q(ecause)i(they)e(can)h(con)o(trol)e(b)q +(oth)262 1331 y(coloured)i(squares)h(and)f(hence)i(complemen)o(t)c(eac)o(h)j +(other.)29 b(Therefore,)19 b(this)e(heuristic)262 1381 y(rew)o(ards)d(the)h +(pla)o(y)o(er)e(who)h(main)o(tains)d(a)j(pair)f(of)h(bishops.)262 +1532 y Fu(4.6.4)55 b(De\014nition)17 b(17)i(:)24 b(Horrwitz)19 +b(Bishops)344 1699 y Fh(H)s(B)413 1705 y Fe(col)469 1699 y +Fp(=)513 1668 y Fc(P)557 1678 y Fk(64)557 1711 y Fe(sq)q Fk(=1)675 +1699 y Fl(if)13 b Fp(\(A)o(ttac)o(k)o(ed\([Bishop],col,sq\))g +Fl(and)g Fp(A)o(ttac)o(k)o(ed\([Bishop],col,)p Fh(sq)1730 1705 +y Fe(next)1798 1699 y Fp(\)\))734 1752 y(2)675 1802 y Fl(else)734 +1851 y Fp(0)675 1901 y Fl(endif)262 2028 y Fp(This)e(criterion)i(essen)o +(tially)f(rew)o(ards)h(a)e(bishop)h(pair)g(for)f(w)o(orking)h(together.)18 +b(When)12 b(t)o(w)o(o)262 2078 y(bishops)i(w)o(ork)g(on)g(adjacen)o(t)g +(diagonals)f(their)i(scop)q(e)g(and)f(p)q(o)o(w)o(er)h(is)f(greatly)g +(increased.)262 2128 y(This)h(barrier)h(of)f('bishop)f(p)q(o)o(w)o(er')h(can) +h(completely)e(restrict)j(an)e(enem)o(y)g(king,)g(particu-)262 +2177 y(larly)f(in)i(an)g(ending)g(where)h(the)f(p)q(osition)g(is)g(op)q(en.) +24 b(Therefore,)18 b(a)d(b)q(on)o(us)i(is)e(giv)o(en)h(for)262 +2227 y(ev)o(ery)e(pair)g(of)f(adjacen)o(t)h(horizon)o(tal)f(squares)i(attac)o +(k)o(ed)f(b)o(y)g(bishops.)957 2574 y(62)p eop +%%Page: 63 65 +63 64 bop 262 307 a Fu(4.6.5)55 b(De\014nition)17 b(18)i(:)24 +b(Enem)n(y)17 b(P)n(a)n(wn)k(Obstruction)344 474 y Fh(E)r(O)409 +480 y Fe(col)464 474 y Fp(=)508 443 y Fc(P)552 453 y Fk(64)552 +486 y Fe(sq)q Fk(=1)635 474 y Fh(O)q(B)699 480 y Fe(col;sq)344 +577 y Fl(where)380 626 y Fh(O)q(B)444 632 y Fe(col;sq)544 626 +y Fp(:)60 b Fl(if)30 b Fp(\(Occup)o(y\([P)o(a)o(wn],Opp\(col\),sq\))14 +b Fl(and)f Fp(A)o(ttac)o(k)o(ed\([Bishop],col,sq\)\))675 676 +y Fl(case)h Fh(])p Fp(A)o(ttac)o(ks\([P)o(a)o(wn],Opp\(col\),sq\))f +Fl(of)734 726 y Fp(0)h(:)k Fh(O)q(B)863 732 y Fe(col;sq)960 +726 y Fp(=)12 b(2)734 826 y(1)i(:)k Fl(for)d(eac)o(h)g(square)e +Fp(sq1)h Fl(do)852 875 y(for)h(eac)o(h)h(square)d Fp(sq2)h +Fl(do)911 925 y(if)f Fp(\(A)o(ttac)o(king\([Bishop],col,sq1,sq\))911 +975 y Fl(and)g Fp(A)o(ttac)o(king\([P)o(a)o(wn],Opp\(col\),sq2,sq\)\))970 +1025 y Fl(if)g Fp(\(SameDiagonal\(sq1,)o(sq2\)\))1029 1075 +y Fh(O)q(B)1093 1081 y Fe(col;sq)1191 1075 y Fp(=)f Ff(\000)p +Fp(10)970 1125 y Fl(else)1029 1174 y Fh(O)q(B)1093 1180 y Fe(col;sq)1191 +1174 y Fp(=)g Ff(\000)p Fp(6)970 1224 y Fl(endif)911 1274 y(endif)852 +1324 y(endfor)793 1374 y(endfor)734 1473 y Fp(2)i(:)k Fh(O)q(B)863 +1479 y Fe(col;sq)960 1473 y Fp(=)12 b Ff(\000)p Fp(16)675 1523 +y Fl(endcase)616 1573 y(endif)262 1700 y Fp(It)i(is)g(imp)q(ortan)o(t)e(to)i +(p)q(enalise)h(a)f(bishop)f(whic)o(h)i(is)f(attac)o(king)f(an)h(almost)e(imp) +q(enetrable)262 1749 y(enem)o(y)17 b(pa)o(wn)g(w)o(all.)29 +b(The)18 b(degree)i(of)d(pa)o(wn)h(protection)g(pro)o(vided)g(b)o(y)g(the)g +(opp)q(onen)o(t)262 1799 y(to)12 b(the)i(attac)o(k)o(ed)g(enem)o(y)e(pa)o(wn) +h(is)g(determined)g(and)g(an)g(appropriate)g(p)q(enalt)o(y)g(applied.)262 +1849 y(A)g(bishop)h(attac)o(king)f(an)h(unprotected)h(\(b)o(y)f(pa)o(wns\))g +(enem)o(y)f(pa)o(wn)h(actually)e(receiv)o(es)k(a)262 1899 y(small)11 +b(b)q(on)o(us)j(to)g(indicate)g(that)g(it)f(ma)o(y)f(b)q(e)j(an)e(e\013ectiv) +o(e)j(attac)o(k.)324 1984 y(This)c(criterion)h(helps)f(encourage)h(the)g +(program)e(to)h(place)g(its)h(bishops)f(on)g(diagonals)262 +2034 y(where)j(they)g(can)f(b)q(e)h(most)e(e\013ectiv)o(e.)20 +b(Hence,)15 b(this)f(in)g(e\013ect,)i(complemen)o(ts)c(de\014nition)262 +2084 y(14)h(\(Bishop)h(A)o(ttac)o(k\))g(whic)o(h)f(is)h(also)f(concerned)j +(with)d(the)h(e\013ectiv)o(eness)j(of)c(attac)o(ks)h(on)262 +2134 y(enem)o(y)f(pieces)i(b)o(y)e(bishops.)957 2574 y(63)p +eop +%%Page: 64 66 +64 65 bop 262 307 a Fu(4.6.6)55 b(De\014nition)17 b(19)i(:)24 +b(Bishop)19 b(T)-5 b(able)344 474 y Fh(B)r(T)401 480 y Fe(col)458 +474 y Fp(=)501 443 y Fc(P)545 453 y Fk(64)545 486 y Fe(sq)q +Fk(=1)675 474 y Fp(if)13 b(\(Occup)o(y\([Bishop],col,sq\)\))734 +527 y Fh(B)r(S)r(T)818 533 y Fe(col;sq)675 577 y Fl(else)734 +626 y Fp(0)675 676 y Fl(endif)344 776 y(where)380 826 y Fh(B)r(S)r(T)464 +832 y Fe(col;sq)565 826 y Fp(:)39 b(Bishop)14 b(Square)g(T)m(able.)k +(Initialised)12 b(b)q(efore)j(eac)o(h)f(searc)o(h.)616 875 +y(See)h(planning)d(section)j(4.11.5)d(for)h(details.)262 1002 +y(A)h(static)h(bishop)f(square)i(table)e(will)f(b)q(e)i(used)h(to)e(store)h +(the)g(v)n(alues)g(of)f(eac)o(h)h(square)g(for)262 1052 y(ha)o(ving)e(a)h +(bishop)h(o)q(ccup)o(y)g(that)g(square.)21 b(This)15 b(enables)g(kno)o +(wledge)g(calculated)f(at)h(the)262 1102 y(ro)q(ot)f(to)h(b)q(e)g(e\016cien)o +(tly)g(applied)f(at)g(leaf)g(no)q(des.)22 b(The)15 b(table)f(will)g(b)q(e)h +(calculated)g(b)q(efore)262 1152 y(commencemen)o(t)c(of)j(the)g(searc)o(h)h +(in)e(an)h(initial)e(planning)h(phase.)262 1303 y Fu(4.6.7)55 +b(De\014nition)17 b(20)i(:)24 b(Bishop)19 b(V)-5 b(alue)344 +1430 y Fh(B)r(V)401 1436 y Fe(col)457 1430 y Fp(=)12 b Fh(B)r(A)565 +1436 y Fe(col)619 1430 y Fp(+)e Fh(B)r(K)729 1436 y Fe(col)783 +1430 y Fp(+)f Fh(B)r(P)884 1436 y Fe(col)938 1430 y Fp(+)g +Fh(H)s(B)1048 1436 y Fe(col)1102 1430 y Fp(+)g Fh(E)r(O)1208 +1436 y Fe(col)1261 1430 y Fp(+)h Fh(B)r(T)1360 1436 y Fe(col)344 +1529 y Fl(where)380 1579 y Fh(B)r(A)444 1585 y Fe(col)498 1579 +y Fp(:)23 b Fl(Bishop)14 b(A)o(ttac)o(k)h(\(De\014niti)o(on)e(14\).)380 +1679 y Fh(B)r(K)448 1685 y Fe(col)498 1679 y Fp(:)23 b Fl(Bishop)14 +b(On)h(Kings)g(Diagonal)f(\(De\014niti)o(on)e(15\).)380 1778 +y Fh(B)r(P)440 1784 y Fe(col)498 1778 y Fp(:)23 b Fl(Bishop)14 +b(P)o(air)g(\(De\014nitio)o(n)f(16\).)380 1878 y Fh(H)s(B)449 +1884 y Fe(col)498 1878 y Fp(:)23 b Fl(Horrwitz)15 b(Bishops)f(\(De\014niti)o +(on)e(17\).)380 1978 y Fh(E)r(O)445 1984 y Fe(col)498 1978 +y Fp(:)23 b Fl(Enem)o(y)15 b(P)o(a)o(wn)h(Obstructio)o(n)d(\(De\014niti)o(on) +f(18\).)380 2077 y Fh(B)r(T)437 2083 y Fe(col)498 2077 y Fp(:)23 +b Fl(Bishop)14 b(T)l(able)h(\(De\014niti)o(on)e(19\).)262 2204 +y Fp(All)d(the)h(bishop)g(ev)n(aluation)e(criteria)i(de\014ned)h(in)f(this)g +(section)g(are)h(summed)d(to)i(calculate)262 2254 y(the)j(total)f(bishop)h(v) +n(alue)f(for)h(a)f(giv)o(en)h(colour.)957 2574 y(64)p eop +%%Page: 65 67 +65 66 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZ0Z0skZ)646 +482 y(Z0ZqZpo0)646 565 y(0ZbZ0m0o)646 648 y(opa0oPZ0)646 731 +y(0Z0oPZPZ)646 814 y(OPZBZ0ZQ)646 897 y(0APM0Z0O)646 980 y(Z0Z0SRJ0)p +1310 980 V 641 984 673 5 v 340 1102 a Fp(Figure)14 b(4.5:)j +Fl(V)l(an)f(Vliet)d(v)k(Nimzo)o(witsc)o(h)p Fp(,)11 b(Ostend,)j(1907,)f(Blac) +o(k)h(to)f(pla)o(y)m(.)324 1221 y(Applying)g(these)i(bishop)e(ev)n(aluation)g +(criteria)h(to)f(the)i(p)q(osition)e(in)g(\014gure)h(4.5)f(giv)o(es:)344 +1368 y Fh(B)r(V)401 1374 y Fe(W)t(hite)533 1368 y Fp(=)h(0)9 +b(+)h(0)f(+)g(8)g(+)h(4)f Ff(\000)g Fp(8)g(+)h(18)h(=)h(22)344 +1418 y Fh(B)r(V)401 1424 y Fe(B)q(lack)533 1418 y Fp(=)i(0)9 +b(+)h(7)f(+)g(8)g(+)h(6)f(+)g(4)g(+)h(20)h(=)h(45)957 2574 +y(65)p eop +%%Page: 66 68 +66 67 bop 262 307 a Fr(4.7)69 b(Ro)r(ok)23 b(Ev)l(aluation)262 +434 y Fp(The)d(ro)q(ok)f(is)h(a)g(v)o(ery)g(strong)g(piece.)37 +b(Ho)o(w)o(ev)o(er,)21 b(it)e(requires)i('ro)q(om')d(to)h(w)o(ork)h(most)262 +483 y(e\013ectiv)o(ely)m(.)324 569 y(In)14 b(the)g(op)q(ening)g(the)h(main)d +(ob)r(jectiv)o(e)i(of)g(the)g(ro)q(oks)g(is)g(to)g(unite)g(with)g(one)g +(another)262 618 y(and)f(supp)q(ort)i(more)e(adv)n(anced)h(pieces.)19 +b(This)14 b(pro)o(vides)g(extra)g(protection)g(and)g(div)o(ersi-)262 +668 y(\014es)g(the)h(a)o(v)n(ailable)c(plans)j(for)g(eac)o(h)g(ro)q(ok.)324 +753 y(In)e(the)i(middle)d(game)g(they)i(should)g(b)q(e)g(placed)g(on)f(the)i +(\014le)e(where)i(a)e(break)i(through)262 803 y(is)d(lik)o(ely)g(to)h(o)q +(ccur)h(or)f(to)g(protect)h(a)f(w)o(eak)g(or)g(strong)g(p)q(oin)o(t.)17 +b(Ro)q(oks)12 b(should)f(not)h(usually)262 853 y(lea)o(v)o(e)g(the)h +(con\014nes)h(of)e(their)g(o)o(wn)h(forces)g(unless)g(they)g(can)g(gain)f +(material)e(or)j(p)q(enetrate)262 903 y(to)e(the)h(7th)g(rank)f(successfully) +m(.)18 b(A)12 b(ro)q(ok)g(can)f(mak)o(e)g(a)g(hea)o(vy)g(con)o(tribution)h +(to)f(an)h(attac)o(k)262 953 y(on)h(the)i(enem)o(y)e(king)g(pro)o(vided)h(it) +f(can)h(b)q(e)h(mano)q(euvred)e(in)o(to)g(an)h(attac)o(king)f(p)q(osition.) +324 1038 y(The)e(endgame)f(is)h(where)i(the)e(ro)q(ok)g(truly)g(excels.)18 +b(Its)12 b(range)f(allo)o(ws)f(it)h(to)f(exert)j(pres-)262 +1088 y(sure)i(o)o(v)o(er)f(most)f(of)h(the)h(b)q(oard.)k(It)c(can)f(threaten) +i(enem)o(y)e(pa)o(wns)g(and)g(cause)i(un)o(timely)262 1138 +y(pa)o(wn)e(adv)n(ances.)21 b(It)14 b(can)h(blo)q(c)o(k)n(ade)f(and)h +(obstruct)h(enem)o(y)d(pa)o(wns)i(and)g(of)f(course)i(cap-)262 +1187 y(ture)c(them.)17 b(A)12 b(ro)q(ok)g(is)f(excellen)o(t)i(at)f +(restricting)h(the)f(enem)o(y)g(kings)f(mo)o(v)o(emen)o(t)e(thereb)o(y)262 +1237 y(k)o(eeping)15 b(it)g(a)o(w)o(a)o(y)f(from)g(the)i(\014eld)f(of)g +(action.)22 b(It)15 b(also)g(has)g(the)h(abilit)o(y)e(to)h(supp)q(ort)h(the) +262 1287 y(adv)n(ance)d(of)h(friendly)f(passed)i(pa)o(wns)f(and)g(obstruct)h +(enem)o(y)e(ones.)262 1439 y Fu(4.7.1)55 b(De\014nition)17 +b(21)i(:)24 b(Ro)r(ok{King)18 b(Closeness)344 1605 y Fh(RC)406 +1611 y Fe(col)461 1605 y Fp(=)505 1574 y Fc(P)549 1584 y Fk(64)549 +1618 y Fe(sq)q Fk(=1)675 1605 y Fl(if)13 b Fp(\(Occup)o(y\([Ro)q +(ok],col,sq\)\))734 1658 y Ff(\000)p Fp(2)p Ff(\001)p Fp +(KingDistance\(sq,KingSq\(Opp\(col\)\)\))675 1708 y Fl(else)734 +1758 y Fp(0)675 1808 y Fl(endif)262 1934 y Fp(Eac)o(h)18 b(ro)q(ok)g(is)g(p)q +(enalised)g(for)g(its)g(distance)h(from)d(the)j(enem)o(y)e(king.)30 +b(A)18 b(ro)q(ok)g(on)g(the)262 1984 y(same)13 b(\014le)h(\(or)g(rank\))g(as) +g(the)g(enem)o(y)g(king)f(w)o(ould)g(not)h(receiv)o(e)h(an)o(y)f(p)q(enalt)o +(y)g(no)f(matter)262 2034 y(what)j(the)g(corresp)q(onding)h(rank)g(\(or)f +(\014le\))g(distance)h(is.)25 b(An)o(y)16 b(p)q(enalties)h(giv)o(en)e(will)g +(b)q(e)262 2084 y(directly)e(related)i(to)e(the)h(minim)n(um)c(rank)j(or)h +(\014le)f(distance.)19 b(This)14 b(a)o(v)o(oids)e(the)i(pitfall)e(of)262 +2134 y(encouraging)k(a)g(ro)q(ok)g(to)g(mak)o(e)f(w)o(eak)h(mo)o(v)o(es)f(in) +h(order)h(to)f(attain)f(the)i(b)q(est)h(rank)e Fm(and)262 2183 +y Fp(\014le)d(distance.)18 b(F)m(or)13 b(example,)f(in)h(\014gure)h(4.6,)e +(this)h(criterion)h(w)o(ould)e Fl(not)h Fp(encourage)h(the)262 +2233 y(mo)o(v)o(es)e(Rh4-h5)h(or)h(Rg3-g4,)e(ho)o(w)o(ev)o(er,)h(it)h +Fl(w)o(ould)e Fp(encourage)j(the)f(mo)o(v)o(e)f(Rg3-h3.)957 +2574 y(66)p eop +%%Page: 67 69 +67 68 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0ZrZ0Zna)646 +482 y(ZbZ0ZpZk)646 565 y(pZ0o0o0o)646 648 y(ZpZ0sPZ0)646 731 +y(0Z0Z0M0S)646 814 y(ZNZBZ0S0)646 897 y(qZPL0ZPO)646 980 y(Z0Z0Z0J0)p +1310 980 V 641 984 673 5 v 275 1102 a Fp(Figure)14 b(4.6:)j(Illustration)c +(of)g(the)i(Ro)q(ok{King)d(Closeness)j(Heuristic,)f(White)g(to)g(Pla)o(y)m(.) +262 1254 y Fu(4.7.2)55 b(De\014nition)17 b(22)i(:)24 b(Connected)19 +b(Ro)r(oks)344 1420 y Fh(C)s(R)409 1426 y Fe(col)464 1420 y +Fp(=)508 1389 y Fc(P)551 1400 y Fk(64)551 1433 y Fe(sq)q Fk(=1)675 +1420 y Fl(if)13 b Fp(\(Occup)o(y\([Ro)q(ok],col,sq\))f Fl(and)h +Fp(A)o(ttac)o(k)o(ed\([Ro)q(ok],col,sq\)\))734 1473 y(3)675 +1523 y Fl(else)734 1573 y Fp(0)675 1623 y Fl(endif)262 1750 +y Fp(Ro)q(oks)j(are)h(said)f(to)h(b)q(e)g(connected)i(if)c(they)j(defend)f +(eac)o(h)g(other.)27 b(Ro)q(oks)17 b(are)g(giv)o(en)f(a)262 +1799 y(b)q(on)o(us)g(for)h(b)q(eing)f(connected.)29 b(This)16 +b(encourages)i(ro)q(oks)f(to)f(double)h(up)g(on)f(op)q(en)h(\014les)262 +1849 y(and)12 b(w)o(eak)h(p)q(oin)o(ts.)18 b(Connected)c(ro)q(oks)f(are)g +(also)g(self)f(supp)q(orting)i(whic)o(h)e(div)o(ersi\014es)i(the)262 +1899 y(options)f(a)o(v)n(ailable.)957 2574 y(67)p eop +%%Page: 68 70 +68 69 bop 262 307 a Fu(4.7.3)55 b(De\014nition)17 b(23)i(:)24 +b(Ro)r(ok)18 b(on)h(Op)r(en)f(File)344 403 y Fh(RO)408 409 +y Fe(col)463 403 y Fp(=)507 372 y Fc(P)551 382 y Fk(64)551 +415 y Fe(sq)q Fk(=1)675 403 y Fl(if)13 b Fp(\(Occup)o(y\([Ro)q +(ok],col,sq\)\))734 456 y Fl(if)g Fp(\(Op)q(en\(OnFile\(sq\)\)\))793 +506 y(14)734 556 y Fl(else)793 605 y(if)g Fp(\(SemiOp)q +(en\(col,OnFile\(sq\)\)\))852 655 y(6)793 705 y Fl(else)852 +755 y Fp(0)793 805 y Fl(endif)734 854 y(endif)675 904 y(else)734 +954 y Fp(0)675 1004 y Fl(endif)262 1119 y Fp(A)h(\014le)h(is)g(op)q(en)g(if)e +(no)i(pa)o(wns)g(of)f(an)o(y)g(colour)g(exist)h(on)g(the)g(\014le.)21 +b(A)14 b(\014le)h(is)g(semi{op)q(en)e(if)262 1168 y(only)e(enem)o(y)h(pa)o +(wns)h(exist)g(on)f(the)i(\014le.)j(Ro)q(oks)12 b(receiv)o(e)i(a)f(b)q(on)o +(us)f(for)h(b)q(eing)f(on)h(an)f(op)q(en)262 1218 y(\014le.)18 +b(Con)o(trol)13 b(of)g(the)i(op)q(en)f(\014le)g(is)g(vital)f(in)h(order)g(to) +g(b)q(e)h(able)e(to)h(ev)o(en)o(tually)g(p)q(enetrate)262 1268 +y(to)k(the)i(7th)e(and)h(8th)g(ranks.)33 b(Ev)o(en)19 b(if)f(the)h(opp)q +(onen)o(t)g(has)g(con)o(trol)g(of)f(the)i(\014le)e(it)h(is)262 +1318 y(imp)q(ortan)o(t)12 b(to)h(rew)o(ard)i(attempts)e(whic)o(h)h(c)o +(hallenge)g(this)g(con)o(trol.)324 1403 y(This)d(heuristic)g(has)h(the)f +(added)h(b)q(ene\014t)g(of)e(encouraging)h(the)h(program)d(to)i(op)q(en)g +(\014les)262 1453 y(whic)o(h)i(it)h(can)g(con)o(trol)g(and)f(k)o(eep)i +(closed)f(those)h(whic)o(h)f(w)o(ould)f(b)q(ene\014t)i(the)f(opp)q(onen)o(t.) +324 1538 y(A)k(ro)q(ok)g(is)g(also)f(rew)o(arded)j(for)d(b)q(eing)h(on)g(a)g +(semi{op)q(en)f(\014le.)31 b(The)19 b(enem)o(y)e(pa)o(wn)262 +1588 y(whic)o(h)12 b(mak)o(es)g(the)h(\014le)f(semi{op)q(en)g(is)h(an)f(ob)o +(vious)g(w)o(eak)h(p)q(oin)o(t)f(to)g(c)o(hallenge)h(with)f(ones)262 +1638 y(o)o(wn)f(pa)o(wns.)18 b(In)12 b(this)g(w)o(a)o(y)f(the)i(opp)q(onen)o +(t)f(can)h(b)q(e)f(put)h(on)f(the)g(defensiv)o(e)h(and)f(attempts)262 +1688 y(can)f(b)q(e)h(made)e(to)h(build)f(up)i(pressure)h(or)e(fully)f(op)q +(en)i(the)g(\014le)f(at)g(an)g(opp)q(ortune)h(momen)o(t.)262 +1837 y Fu(4.7.4)55 b(De\014nition)17 b(24)i(:)24 b(Ro)r(ok)18 +b(on)h(Sev)n(en)n(th)f(Rank)344 1933 y Fh(RS)401 1939 y Fe(col)457 +1933 y Fp(=)501 1902 y Fc(P)545 1912 y Fk(64)545 1945 y Fe(sq)q +Fk(=1)675 1933 y Fl(if)13 b Fp(\(Occup)o(y\([Ro)q(ok],col,sq\))f +Fl(and)h Fp(OnRank\(col,sq\))h(=)g(7\))734 1986 y Fl(if)f Fp +(\(OnRank\(col,KingSq\(Opp\(col\)\)\))g Ff(\025)h Fp(7\))793 +2036 y(14)734 2085 y Fl(else)793 2135 y Fp(6)734 2185 y Fl(endif)675 +2235 y(else)734 2285 y Fp(0)675 2334 y Fl(endif)262 2449 y +Fp(P)o(enetration)j(to)f(the)h(7th)g(rank)g(is)f(the)h(natural)f(consequence) +j(and)e(goal)e(of)h(ro)q(ok)h(pla)o(y)957 2574 y(68)p eop +%%Page: 69 71 +69 70 bop 262 307 a Fp(on)13 b(op)q(en)i(\014les.)k(A)c(ro)q(ok)f(on)f(the)i +(7th)f(rank)g(can)h(wreak)f(ha)o(v)o(o)q(c)g(on)g(the)h(enem)o(y)e(king)h +(and)262 357 y(pa)o(wns.)20 b(Therefore)15 b(o)q(ccupation)g(of)f(the)h(7th)g +(rank)f(b)o(y)g(a)h(ro)q(ok)f(receiv)o(es)i(a)e(b)q(on)o(us.)21 +b(This)262 407 y(b)q(on)o(us)14 b(is)f(esp)q(ecially)h(large)g(if)f(the)i +(enem)o(y)e(king)g(is)h(on)f(the)i(7th)e(or)h(8th)g(ranks.)262 +558 y Fu(4.7.5)55 b(De\014nition)17 b(25)i(:)24 b(Ro)r(ok)18 +b(V)-5 b(alue)344 649 y Fh(RV)400 655 y Fe(col)456 649 y Fp(=)12 +b Fh(RC)562 655 y Fe(col)614 649 y Fp(+)e Fh(C)s(R)721 655 +y Fe(col)773 649 y Fp(+)g Fh(RO)879 655 y Fe(col)931 649 y +Fp(+)g Fh(RS)1030 655 y Fe(col)344 748 y Fl(where)380 798 y +Fh(RC)442 804 y Fe(col)498 798 y Fp(:)23 b Fl(Ro)q(ok{King)15 +b(Closeness)f(\(De\014nitio)o(n)f(21\).)380 898 y Fh(C)s(R)445 +904 y Fe(col)498 898 y Fp(:)23 b Fl(Connected)15 b(Ro)q(oks)g(\(De\014nitio)o +(n)e(22\).)380 997 y Fh(RO)444 1003 y Fe(col)498 997 y Fp(:)23 +b Fl(Ro)q(ok)16 b(on)f(Op)q(en)g(File)g(\(De\014niti)o(on)d(23\).)380 +1097 y Fh(RS)437 1103 y Fe(col)498 1097 y Fp(:)23 b Fl(Ro)q(ok)16 +b(On)f(Sev)o(en)o(th)f(Rank)h(\(De\014nitio)o(n)e(24\).)262 +1219 y Fp(All)g(the)h(ro)q(ok)g(ev)n(aluation)f(criteria)h(de\014ned)h(in)e +(this)i(section)f(are)h(summed)d(to)i(calculate)262 1269 y(the)g(total)f(ro)q +(ok)h(v)n(alue)f(for)h(a)f(giv)o(en)h(colour.)p 641 1363 673 +5 v 641 2027 5 665 v 646 1446 a Fg(0ZrZ0ZkZ)646 1529 y(ZqZ0ZpZp)646 +1612 y(po0LpZpZ)646 1695 y(Z0Z0Z0Z0)646 1778 y(PZ0O0Z0Z)646 +1861 y(Z0Z0O0ZP)646 1944 y(0ZrZ0OPZ)646 2027 y(SRZ0Z0J0)p 1310 +2027 V 641 2031 673 5 v 343 2146 a Fp(Figure)g(4.7:)j Fl(Alatorze\013)d(v)i +(Capablanca)p Fp(,)d(Mosco)o(w,)h(1935,)e(Blac)o(k)i(to)f(pla)o(y)m(.)324 +2261 y(Applying)g(these)i(ro)q(ok)f(ev)n(aluation)e(criteria)i(to)g(the)h(p)q +(osition)e(in)g(\014gure)i(4.7)e(giv)o(es:)344 2355 y Fh(RV)400 +2361 y Fe(W)t(hite)533 2355 y Fp(=)h Ff(\000)p Fp(22)9 b(+)h(6)f(+)g(6)g(+)h +(0)h(=)h Ff(\000)p Fp(10)344 2405 y Fh(RV)400 2411 y Fe(B)q(lack)533 +2405 y Fp(=)i Ff(\000)p Fp(10)9 b(+)h(6)f(+)g(28)g(+)h(14)h(=)g(38)957 +2574 y(69)p eop +%%Page: 70 72 +70 71 bop 262 307 a Fr(4.8)69 b(Queen)22 b(Ev)l(aluation)262 +434 y Fp(The)12 b(queen)h(is)f(the)h(most)d(p)q(o)o(w)o(erful)i(and)g(also)f +(the)i(most)e(v)n(aluable)g(piece)i(apart)f(from)e(the)262 +483 y(king.)16 b(The)e(queen)f(has)g(great)g(range)g(whic)o(h)g(allo)o(ws)e +(it)i(to)f(mak)o(e)g(sim)o(ultaneous)f(m)o(ultiple)262 533 +y(attac)o(ks)j(on)f(enem)o(y)h(pieces.)324 618 y(In)e(the)g(op)q(ening)g(a)g +(queen)h(should)e(not)h(b)q(e)h(exp)q(osed)g(to)f(hostile)g(attac)o(ks)g +(where)h(a)f(loss)262 668 y(of)k(temp)q(o)h(will)f(o)q(ccur.)30 +b(Therefore,)19 b(lik)o(e)e(ro)q(oks)h(it)f(should)g(b)q(e)h(k)o(ept)g(bac)o +(k)g(during)f(the)262 718 y(op)q(ening.)324 803 y(In)g(the)h(middle)d(game)h +(the)i(queen)g(can)f(truly)g(exert)i(its)e(p)q(o)o(w)o(ers.)29 +b(The)17 b(queen)h(can)262 853 y(harass)c(enem)o(y)f(pieces,)h(help)g(build)f +(up)h(attac)o(king)f(formations)f(and)h(launc)o(h)h(attac)o(ks)g(on)262 +903 y(the)19 b(enem)o(y)g(king.)33 b(Once)21 b(pieces)f(b)q(egin)f(to)h(b)q +(e)f(exc)o(hanged)h(the)g(p)q(osition)f(in)o(v)n(ariably)262 +953 y(b)q(ecomes)14 b(clearer)h(and)e(allo)o(ws)g(the)h(queen)h(to)f(mo)o(v)o +(e)e(with)i(more)f(freedom.)324 1038 y(In)h(the)g(ending)g(a)f(queen)i(is)e +(ruthless,)i(often)f(pic)o(king)f(up)g(stra)o(y)h(pa)o(wns)g(and)g(holding) +262 1088 y(bac)o(k)h(enem)o(y)g(adv)n(ances.)24 b(Ev)o(en)16 +b(in)f(inferior)g(endgames,)g(the)h(queen)h(can)e(o\013er)i(coun)o(ter)262 +1138 y(c)o(hances)12 b(and)f(can)g(sometimes)e(b)q(e)i(used)h(to)f(dra)o(w)g +(otherwise)g(lost)g(games)f(b)o(y)h(a)f(rep)q(etition)262 1187 +y(of)j(mo)o(v)o(es.)262 1339 y Fu(4.8.1)55 b(De\014nition)17 +b(26)i(:)24 b(Queen{King)18 b(Closeness)344 1506 y Fh(QC)407 +1512 y Fe(col)462 1506 y Fp(=)506 1475 y Fc(P)550 1485 y Fk(64)550 +1518 y Fe(sq)q Fk(=1)675 1506 y Fl(if)13 b Fp(\(Occup)o +(y\([Queen],col,sq\)\))734 1559 y Ff(\000)p Fp(2)p Ff(\001)p +Fp(KingDistance\(sq,KingSq\(Opp\(col\)\)\))675 1608 y Fl(else)734 +1658 y Fp(0)675 1708 y Fl(endif)262 1835 y Fp(The)j(queen)h(is)f(p)q +(enalised)h(for)f(its)g(distance)h(from)d(the)j(enem)o(y)f(king.)24 +b(A)16 b(queen)h(on)f(the)262 1885 y(same)e(rank)h(\(or)h(\014le\))g(as)f +(the)h(enem)o(y)f(king)f(will)g(receiv)o(e)j(no)e(p)q(enalt)o(y)h(regardless) +g(of)f(the)262 1934 y(corresp)q(onding)g(\014le)g(\(or)g(rank\))f(distance.) +21 b(An)o(y)15 b(p)q(enalties)g(giv)o(en)f(will)g(b)q(e)h(directly)g(pro-)262 +1984 y(p)q(ortional)d(to)i(the)h(minim)n(um)9 b(rank)14 b(or)g(\014le)g +(distance.)324 2069 y(This)c(criterion)h(therefore)h(encourages)g(the)g +(queen)f(to)f(k)o(eep)i(close)f(to)f(the)i(enem)o(y)d(king)262 +2119 y(with)k(resp)q(ect)j(to)d(either)h(the)g(rank)g(or)f(\014le)h +(distance,)g(not)f(b)q(oth.)18 b(If)c(a)f(more)f(dominating)262 +2169 y(queen/king)g(p)q(osition)f(is)h(w)o(arran)o(ted,)h(the)g(king)e(safet) +o(y)i(criteria)f(will)f(highligh)o(t)f(this)j(and)262 2219 +y(encourage)h(its)g(ac)o(hiev)o(emen)o(t.)957 2574 y(70)p eop +%%Page: 71 73 +71 72 bop 262 307 a Fu(4.8.2)55 b(De\014nition)17 b(27)i(:)24 +b(Queen)19 b(P)n(o)n(w)n(er)344 474 y Fh(QP)404 480 y Fe(col)459 +474 y Fp(=)503 443 y Fc(P)547 453 y Fk(64)547 486 y Fe(sq)q +Fk(=1)675 474 y Fl(if)13 b Fp(\(A)o(ttac)o(k)o(ed\([Queen],col,sq\))675 +527 y Fl(and)i(not)e Fp(A)o(ttac)o(k)o(ed\([P)o(a)o(wn,Knigh)o(t,Bishop,Ro)q +(ok],Opp\(col\),)o(sq\)\))734 577 y(1)675 626 y Fl(else)734 +676 y Fp(0)675 726 y Fl(endif)262 853 y Fp(As)h(explained)f(in)h(the)g +(mobilit)o(y)d(de\014nition,)i(a)h(straigh)o(t)f(forw)o(ard)h(measure)g(of)f +(a)g(queens)262 903 y(mobilit)o(y)e(is)k(not)g(adequate.)22 +b(It)15 b(is)g(often)g(the)g(queens)h(placemen)o(t)f(rather)h(than)f(its)f +(mo-)262 952 y(bilit)o(y)d(whic)o(h)i(is)g(imp)q(ortan)o(t.)j(I)d(feel)g(a)f +(queens)j(real)e(mobilit)o(y)c(is)k(the)h(n)o(um)o(b)q(er)e(of)g(squares)262 +1002 y(it)i(can)i(actually)e(mo)o(v)o(e)g(to)h(without)f(b)q(eing)i(captured) +g(b)o(y)f(lo)o(w)o(er)g(v)n(alued)f(enem)o(y)h(pieces.)262 +1052 y(Therefore,)c(the)f(queen)h(is)f(encouraged)h(to)e(maximi)o(se)f(its)i +(mobilit)o(y)d(to)i(accessible)i(squares)262 1102 y(only)m(.)16 +b(This)d(means)f(attac)o(ks)i(on)e(squares)j(whic)o(h)d(are)i(undefended)g +(or)f(only)g(defended)h(b)o(y)262 1152 y(the)g(enem)o(y)f(queen)i(or)f(king)f +(are)h(w)o(orth)o(while.)324 1237 y(I)f(feel)h(this)f(criterion)h(pro)o +(vides)g(a)f(m)o(uc)o(h)g(b)q(etter)i(ev)n(aluation)d(of)h(a)g(queen's)h +(degree)h(of)262 1287 y(freedom)e(in)g(a)h(giv)o(en)f(p)q(osition)g(than)h +(the)h(more)d(traditional)h(mobilit)o(y)e(functions.)262 1438 +y Fu(4.8.3)55 b(De\014nition)17 b(28)i(:)24 b(Queen)19 b(V)-5 +b(alue)344 1600 y Fh(QV)401 1606 y Fe(col)457 1600 y Fp(=)12 +b Fh(QC)564 1606 y Fe(col)616 1600 y Fp(+)e Fh(QP)718 1606 +y Fe(col)344 1700 y Fl(where)380 1750 y Fh(QC)443 1756 y Fe(col)498 +1750 y Fp(:)23 b Fl(Queen{King)14 b(Closeness)g(\(De\014niti)o(on)e(26\).)380 +1849 y Fh(QP)440 1855 y Fe(col)498 1849 y Fp(:)23 b Fl(Queen)15 +b(P)o(o)o(w)o(er)f(\(De\014niti)o(on)f(27\).)262 1976 y Fp(All)f(the)i(queen) +g(ev)n(aluation)e(criteria)i(de\014ned)g(in)f(this)h(section)g(are)f(summed)f +(in)h(order)h(to)262 2026 y(calculate)f(the)i(total)e(queen)i(v)n(alue)e(for) +h(a)f(giv)o(en)h(colour.)324 2111 y(Applying)e(these)j(queen)f(ev)n(aluation) +e(criteria)h(to)h(the)g(p)q(osition)e(in)h(\014gure)h(4.7)e(giv)o(es:)344 +2208 y Fh(QV)401 2214 y Fe(W)t(hite)533 2208 y Fp(=)i Ff(\000)p +Fp(4)c(+)f(10)i(=)h(6)344 2258 y Fh(QV)401 2264 y Fe(B)q(lack)533 +2258 y Fp(=)i Ff(\000)p Fp(10)9 b(+)h(13)h(=)h(3)957 2574 y(71)p +eop +%%Page: 72 74 +72 73 bop 262 307 a Fr(4.9)69 b(King)23 b(Ev)l(aluation)262 +434 y Fp(The)15 b(king)g(is)g(the)h(most)f(imp)q(ortan)o(t)e(piece)k(on)e +(the)h(b)q(oard.)22 b(Its)16 b(loss)g(means)e(the)i(end)g(of)262 +483 y(the)e(game.)324 569 y(In)e(the)i(op)q(ening,)e(the)h(king)f(m)o(ust)g +(seek)i(a)e(sa)o(v)o(e)h(ha)o(v)o(en)g(protected)h(b)o(y)f(its)f(o)o(wn)h(pa) +o(wns)262 618 y(and)g(pieces.)20 b(This)13 b(is)h(generally)g(b)q(est)h +(accomplished)e(b)o(y)g(castling.)324 704 y(In)j(the)h(middle)e(game,)g(the)i +(king)e(m)o(ust)h(still)f(b)q(e)i(protected)h(against)e(attac)o(k.)26 +b(This)262 753 y(protection)16 b(will)e(in)o(v)o(olv)o(e)g(a)h(strong)h(pa)o +(wn)f(structure)j(in)d(fron)o(t)h(of)e(the)j(king)d(with)i(piece)262 +803 y(co)o(v)o(er)e(for)f(an)o(y)h(w)o(eak)g(p)q(oin)o(ts.)324 +889 y(In)j(the)h(endgame,)g(unlik)o(e)e(other)j(stages)f(of)f(the)h(game,)f +(the)h(king)e(is)i(a)f(strong)h(at-)262 938 y(tac)o(king)g(piece.)33 +b(A)19 b(king)f(can)h(supp)q(ort)g(its)g(o)o(wn)f(pieces)i(and)f(pa)o(wns)g +(or)f(p)q(enetrate)j(a)262 988 y(w)o(eak)16 b(enem)o(y)f(pa)o(wn)h(structure) +j(to)d(win)f(material.)24 b(Late)16 b(activ)n(ation)f(of)h(a)g(king)f(in)h +(the)262 1038 y(endgame)e(could)h(b)q(e)g(disastrous.)23 b(Therefore,)16 +b(the)g(king)e(m)o(ust)h(b)q(e)g(suitably)g(p)q(ositioned)262 +1088 y(to)e(tak)o(e)h(adv)n(an)o(tage)f(of)g(an)o(y)h(w)o(eaknesses)i(in)d +(the)i(opp)q(osing)e(forces.)262 1239 y Fu(4.9.1)55 b(De\014nition)17 +b(29)i(:)24 b(King)19 b(On)g(Op)r(en)f(Files)344 1371 y Fh(K)s(O)414 +1377 y Fe(col)470 1371 y Fp(=)513 1339 y Fc(P)557 1350 y Fk(64)557 +1383 y Fe(sq)q Fk(=1)640 1371 y Fh(K)s(F)705 1377 y Fe(col;sq)344 +1473 y Fl(where)380 1523 y Fh(K)s(F)445 1529 y Fe(col;sq)544 +1523 y Fp(:)36 b Fl(if)13 b Fp(\(Occup)o(y\([King],col,sq\))g +Fl(and)g Fp(Has\([Ro)q(ok,Queen],Opp\(col\)\)\))651 1573 y +Fl(if)g Fp(\(Op)q(en\(OnFile\(sq\)\)\))710 1623 y Fh(K)s(F)775 +1629 y Fe(col;sq)873 1623 y Fp(=)e Ff(\000)p Fp(2)f Ff(\001)e +Fh(phase)651 1673 y Fl(else)710 1722 y(if)13 b Fp(\(SemiOp)q +(en\(Opp\(col\),OnFile\(sq\)\))710 1772 y Fl(or)h Fp(SemiOp)q +(en\(col,OnFile\(sq\)\)\))769 1822 y Fh(K)s(F)834 1828 y Fe(col;sq)932 +1822 y Fp(=)d Ff(\000)p Fh(phase)710 1872 y Fl(else)769 1922 +y Fh(K)s(F)834 1928 y Fe(col;sq)932 1922 y Fp(=)g(0)710 1971 +y Fl(endif)651 2021 y(endif)651 2071 y(if)i Fp(\(OnFile\(sq\))h(=)h(2)e +Fl(or)h Fp(3)f Fl(or)h Fp(4)f Fl(or)g Fp(8\))710 2121 y Fl(if)g +Fp(\(Op)q(en\(OnFile\(sq\))p Ff(\000)p Fp(1\)\))769 2171 y +Fh(K)s(F)834 2177 y Fe(col;sq)932 2171 y Fp(=)e Ff(\000)p Fh(phase)710 +2221 y Fl(else)769 2270 y(if)i Fp(\(SemiOp)q(en\(Opp\(col\),OnFile\(sq\))p +Ff(\000)p Fp(1\)\))828 2320 y Fh(K)s(F)893 2326 y Fe(col;sq)991 +2320 y Fp(=)e Ff(\000)p Fh(phase=)p Fp(2)769 2370 y Fl(endif)710 +2420 y(endif)957 2574 y Fp(72)p eop +%%Page: 73 75 +73 74 bop 651 307 a Fl(else)710 357 y(if)13 b Fp(\(Op)q +(en\(OnFile\(sq\)+1\)\))769 407 y Fh(K)s(F)834 413 y Fe(col;sq)932 +407 y Fp(=)e Ff(\000)p Fh(phase)710 457 y Fl(else)769 506 y(if)i +Fp(\(SemiOp)q(en\(Opp\(col\),OnFile\(sq\)+1\)\))828 556 y Fh(K)s(F)893 +562 y Fe(col;sq)991 556 y Fp(=)e Ff(\000)p Fh(phase=)p Fp(2)769 +606 y Fl(endif)710 656 y(endif)651 706 y(endif)592 756 y(else)651 +805 y Fh(K)s(F)716 811 y Fe(col;sq)813 805 y Fp(=)h(0)592 855 +y Fl(endif)262 982 y Fp(The)k(king)f(is)g(p)q(enalised)h(for)g(b)q(eing)g(on) +f(either)i(an)e(op)q(en)h(or)g(semi{op)q(en)f(\014le.)24 b(It)16 +b(is)f(also)262 1032 y(p)q(enalised)e(for)f(b)q(eing)h(adjacen)o(t)g(to)g(an) +g(op)q(en)g(or)g(semi{op)q(en)f(\014le)h(under)h(t)o(w)o(o)e(conditions:)312 +1150 y(1.)20 b(The)d(king)e(is)g Fl(not)g Fp(on)h(either)h(the)f('A')f(or)h +('H')f(\014les)h(and)g(the)g(op)q(en)h(\014le)f(is)f(on)h(the)365 +1200 y(adjacen)o(t)e(\014le)g(nearest)i(the)e(edge)h(of)e(the)h(b)q(oard.)312 +1283 y(2.)20 b(The)15 b(king)e(is)g(on)h(either)h(the)f('A')f(or)h('H')f +(\014les)i(and)e(the)i(op)q(en)f(\014le)g(is)g(adjacen)o(t.)262 +1401 y(Note)g(these)h(p)q(enalties)g(are)f(only)f(imp)q(osed)g(if)g(the)i +(opp)q(onen)o(t)f(has)g(the)g(necessary)i(pieces)262 1451 y(to)d(tak)o(e)h +(adv)n(an)o(tage)f(of)g(the)i(w)o(eakness.)262 1603 y Fu(4.9.2)55 +b(De\014nition)17 b(30)i(:)24 b(W)-5 b(eak)19 b(Squares)f(around)h(King)262 +1715 y Fp(Con)o(trol)10 b(m)o(ust)h(b)q(e)h(held)g(o)o(v)o(er)g(the)g(w)o +(eak)f(squares)i(around)f(the)g(king.)k(By)c(w)o(eak)g(squares)h(I)262 +1765 y(mean)e(those)j(squares)g(not)f(co)o(v)o(ered)h(b)o(y)f(friendly)g(pa)o +(wns)g(whic)o(h)g(are)g(therefore,)h(p)q(ossible)262 1815 y(pa)o(wn)e(holes.) +18 b(These)d(pa)o(wn)d(holes)i(are)f(ideal)g(w)o(eak)g(p)q(oin)o(ts)g(for)f +(the)i(opp)q(onen)o(t)g(to)f(attac)o(k)262 1864 y(and)g(o)q(ccup)o(y)m(.)344 +1985 y Fh(W)6 b(S)414 1991 y Fe(col)470 1985 y Fp(=)12 b Fh(W)6 +b(K)594 1992 y Fe(col;C)r(entr)q(alP)t(oint)p Fk(\()p Fe(K)r(ing)q(S)r(q)q +Fk(\()p Fe(col)p Fk(\)\))344 2085 y Fl(where)380 2140 y Fh(W)g(K)460 +2146 y Fe(col;csq)574 2140 y Fp(:)616 2108 y Fc(P)660 2119 +y Fk(64)660 2152 y Fe(sq)q Fk(=1)746 2140 y Fl(if)12 b Fp +(\(Distance\(sq,csq\))k Ff(\024)e Fp(1)f Fl(and)746 2193 y(not)g +Fp(\(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,sq\))f Fl(or)i Fp(Occup)o(y\([P)o(a) +o(wn],col,sq\)\)\))805 2242 y Fh(C)s(O)870 2248 y Fe(col;sq)964 +2242 y Fp(+)c Fh(O)q(C)1069 2248 y Fe(col;sq)1163 2242 y Fp(+)g +Fh(F)c(B)1269 2248 y Fe(col;sq)1363 2242 y Fp(+)k Fh(E)r(B)1469 +2248 y Fe(col;sq)746 2292 y Fl(else)805 2342 y Fp(0)746 2392 +y Fl(endif)957 2574 y Fp(73)p eop +%%Page: 74 76 +74 75 bop 380 307 a Fh(C)s(O)445 313 y Fe(col;sq)544 307 y +Fp(:)60 b Fl(if)13 b Fp(\(Con)o(trol\(sq\))g(=)i(col\))675 +357 y Ff(\000)p Fp(1)616 407 y Fl(else)675 457 y Ff(\000)p +Fp(4)616 506 y Fl(endif)380 606 y Fh(O)q(C)443 612 y Fe(col;sq)542 +606 y Fp(:)62 b Fl(if)13 b Fp(\(Occup)o(y\([An)o(y],Opp\(col\),sq\)\))675 +656 y Ff(\000)p Fp(8)616 706 y Fl(else)675 756 y Fp(0)616 805 +y Fl(endif)380 905 y Fh(F)6 b(B)444 911 y Fe(col;sq)543 905 +y Fp(:)61 b Fl(if)13 b Fp(\(A)o(ttac)o(k)o(ed\([Bishop],col,sq\)\))675 +955 y(6)616 1005 y Fl(else)675 1054 y(if)g Fp(\(Occup)o +(y\([Bishop],col,sq\)\))746 1104 y(16)675 1154 y Fl(else)746 +1204 y Fp(0)675 1254 y Fl(endif)616 1303 y(endif)380 1403 y +Fh(E)r(B)444 1409 y Fe(col;sq)544 1403 y Fp(:)60 b Fl(if)13 +b Fp(\(A)o(ttac)o(k)o(ed\([Bishop,Queen],Opp\(col\),sq\)\))675 +1453 y Ff(\000)p Fp(6)616 1503 y Fl(else)675 1553 y Fp(0)616 +1602 y Fl(endif)262 1721 y Fp(Squares)i(on)f(or)h(adjacen)o(t)f(to)h(the)g +(cen)o(tral)g(p)q(oin)o(t)f(of)f(the)j(king's)d(defensiv)o(e)i(p)q(osition)f +(are)262 1771 y(p)q(enalised)e(for)f(b)q(eing)h(w)o(eak)g(if)f(they)h(are)h +(not)e(o)q(ccupied)i(or)f(attac)o(k)o(ed)g(b)o(y)g(friendly)f(pa)o(wns.)262 +1820 y(Squares)k(are)h(quite)f(hea)o(vily)e(p)q(enalised)j(for)e(not)h(b)q +(eing)g(con)o(trolled)g(b)o(y)f(friendly)h(pieces.)262 1870 +y(Additionally)m(,)9 b(an)k(o)q(ccupied)g(w)o(eak)g(square)g(is)g(hea)o(vily) +e(p)q(enalised.)18 b(A)13 b(b)q(on)o(us)g(is)f(receiv)o(ed)262 +1920 y(if)f(a)i(friendly)f(bishop)h(attac)o(ks)g(the)g(w)o(eak)g(square)g(or) +g(o)q(ccupies)h(the)f(actual)g(square)g(itself.)262 1970 y(A)i(p)q(enalt)o(y) +h(is)f(levied)h(if)f(the)h(opp)q(onen)o(t)g(has)f(a)h(bishop)f(or)h(queen)g +(whic)o(h)g(can)g(in\014ltrate)262 2020 y(the)e(w)o(eak)g(square.)324 +2105 y(These)19 b(criteria)f(will)f(encourage)i(the)f(program)e(to)i(force)h +(w)o(eak)f(squares)h(near)f(the)262 2155 y(opp)q(onen)o(ts)12 +b(king)f(and)g(realise)h(whic)o(h)f(of)g(its)h(pieces)g(are)g(therefore)h +(made)e(more)f(v)n(aluable.)262 2205 y(It)16 b(will)e(also)i(encourage)h +(vital)e(o)q(ccupation)h(and)g(blo)q(c)o(k)n(ade)g(of)f(these)j(w)o(eak)e(p)q +(oin)o(ts.)25 b(Of)262 2254 y(course,)20 b(the)f(program)e(will)g(b)q(e)i +(discouraged)g(from)e(allo)o(wing)f(suc)o(h)k(w)o(eak)e(squares)i(to)262 +2304 y(dev)o(elop)14 b(near)i(its)e(o)o(wn)h(king.)20 b(Ev)o(en)15 +b(if)f(it)g(is)h(forced)g(to)g(accept)h(some)e(w)o(eak)g(squares,)i(it)262 +2354 y(will)9 b(activ)o(ely)i(seek)i(to)e(exc)o(hange)h(the)g(opp)q(onen)o +(ts)g(most)e(dangerous)i(pieces)g(with)f(resp)q(ect)262 2404 +y(to)i(those)i(w)o(eaknesses.)957 2574 y(74)p eop +%%Page: 75 77 +75 76 bop 262 307 a Fu(4.9.3)55 b(De\014nition)17 b(31)i(:)24 +b(Mating)19 b(Net)262 419 y Fp(The)g(kings)f(p)q(osition)g(should)g(alw)o(a)o +(ys)f(b)q(e)j(c)o(hec)o(k)o(ed)f(to)g(see)h(if)d(a)i(mating)d(net)j(is)g(b)q +(eing)262 469 y(formed)e(around)h(it.)31 b(The)19 b(building)e(of)g(suc)o(h)j +(a)e(mating)e(net)j(around)f(the)h(opp)q(onen)o(ts)262 519 +y(king)d(is)i(to)f(b)q(e)h(encouraged.)30 b(It)17 b(will,)g(ho)o(w)o(ev)o +(er,)h(b)q(e)g(discouraged)g(from)e(allo)o(wing)f(the)262 569 +y(opp)q(onen)o(t)f(to)f(ac)o(hiev)o(e)i(similar)c(aims.)344 +666 y Fh(M)5 b(N)422 672 y Fe(col)478 666 y Fp(=)12 b Fh(N)5 +b(T)584 672 y Fe(col)344 766 y Fl(where)380 816 y Fh(N)g(T)442 +822 y Fe(col)500 816 y Fp(:)33 b(W)m(eakSqs)13 b(=)i(0)545 +865 y Fh(N)5 b(T)607 871 y Fe(col)663 865 y Fp(=)11 b(0)545 +915 y Fl(for)k(eac)o(h)g(square)f Fp(sq)g Fl(do)604 965 y(if)f +Fp(\(Distance\(KingSq\(col\),sq\))h(=)g(1\))663 1015 y(di\013)g(=)g +Fh(])p Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq\))663 1065 y Fl(if)f +Fp(\(Con)o(trol\(sq\))h(=)g(Opp\(col\))g Fl(or)f Fp(di\013)h +Fh(>)g Fp(0\))722 1114 y(W)m(eakSqs)g(=)g(W)m(eakSqs)f(+)h(1)722 +1164 y Fl(if)f Fp(\()p Fh(])p Fp(A)o(ttac)o(ks\([An)o(y],Opp\(col\),sq\))h +Fh(>)g Fp(1\))781 1214 y Fh(N)814 1220 y Fe(col)870 1214 y +Fp(=)e Fh(N)947 1220 y Fe(col)1000 1214 y Ff(\000)e Fp(4)f +Ff(\001)g Fh(dif)t(f)14 b Ff(\000)c Fp(2)722 1264 y Fl(endif)663 +1314 y(endif)604 1363 y(endif)545 1413 y(endfor)545 1463 y(if)j +Fp(\(KingSq\(col\))g(=)h(a8)g Fl(or)f Fp(h8)h Fl(or)f Fp(a1)g +Fl(or)h Fp(h1\))604 1513 y(W)m(eakSqs)g(=)g(W)m(eakSqs)f(+)h(1)545 +1563 y Fl(endif)545 1613 y Fh(N)578 1619 y Fe(col)634 1613 +y Fp(=)e Fh(N)711 1619 y Fe(col)764 1613 y Ff(\000)e Fh(T)830 +1619 y Fe(W)t(eak)q(S)r(q)q(s)380 1712 y Fh(T)404 1718 y Fe(c)435 +1712 y Fp(:)98 b([0,)13 b(8,)g(20,)g(36,)g(56,)f(80,)h(108,)g(140,)g(180])604 +1762 y(Indexed)i(b)o(y)f(w)o(eak)f(square)i(coun)o(t)f(c)g(\(0)g(to)g(8\))262 +1880 y(An)o(y)f(squares)i(adjacen)o(t)f(to)g(the)g(king)f(are)h(p)q(enalised) +h(for)e(lac)o(k)g(of)h(con)o(trol.)j(P)o(articularly)262 1930 +y(if)c(the)h(opp)q(onen)o(t)g(has)g(t)o(w)o(o)g(or)g(more)e(pieces)k(in)o +(terw)o(orking)d(against)g(the)i(square.)324 2015 y(Notice)d(the)f(p)q(enalt) +o(y)h(for)f(the)h(n)o(um)o(b)q(er)e(of)h(w)o(eak)g(squares)i(whic)o(h)e(ma)o +(y)e(form)h(a)h(mating)262 2065 y(net)16 b(rises)g(dramatically)m(,)d(the)j +(larger)g(the)g(n)o(um)o(b)q(er)f(of)g(suc)o(h)h(squares.)25 +b(The)16 b(king)e(is)i(ad-)262 2115 y(ditionally)11 b(p)q(enalised)k(for)e(b) +q(eing)h(on)g(a)f(corner)i(square.)k(This)14 b(is)g(b)q(ecause)i(the)e(p)q +(oten)o(tial)262 2165 y(n)o(um)o(b)q(er)c(of)g(escap)q(e)j(squares)f(for)e +(the)i(king)e(from)f(a)i(corner)h(square)g(are)f(sev)o(erely)h(reduced.)262 +2215 y(This)i(w)o(ould)h(not)f(b)q(e)i(pic)o(k)o(ed)f(up)g(b)o(y)g(the)g +(general)h(w)o(eak)e(square)i(coun)o(t)f(previously)g(cal-)262 +2265 y(culated.)j(Therefore)d(an)f(adjustmen)o(t)f(is)h(made)e(to)i(allo)o(w) +e(for)i(this)g(p)q(ossibilit)o(y)m(.)957 2574 y(75)p eop +%%Page: 76 78 +76 77 bop 262 307 a Fu(4.9.4)55 b(De\014nition)17 b(32)i(:)24 +b(Chec)n(k)19 b(Threats)262 419 y Fp(The)c(kings)g(p)q(osition)f(m)o(ust)g(b) +q(e)i(monitored)e(and)h(the)g(p)q(oten)o(tial)g(threats)h(of)f(an)o(y)f(c)o +(hec)o(ks)262 469 y(assessed.)19 b(Chec)o(k)13 b(mo)o(v)o(es)d(can)i(b)q(e)h +(v)o(ery)f(e\013ectiv)o(e;)h(the)g(v)n(alue)e(of)g(whic)o(h)h(can)g(b)q(e)h +(an)o(ything)262 519 y(from)d(a)i(gain)f(in)h(temp)q(o)g(to)g(c)o(hec)o +(kmate)g(itself.)17 b(Of)c(course)g(some)f(c)o(hec)o(k)h(mo)o(v)o(es)e(ma)o +(y)f(also)262 569 y(b)q(e)i(inferior)f(for)h(the)g(side)g(giving)f(the)h(c)o +(hec)o(k,)h(p)q(ossibly)e(resulting)h(in)g(the)g(loss)g(of)f(a)g(temp)q(o)262 +618 y(or)i(w)o(orse)i(still)e(the)h(c)o(hec)o(king)h(piece.)j(A)c(w)o(ell)g +(kno)o(wn)f(c)o(hess)i(sa)o(ying)e(states:)365 737 y("P)o(atzer)i(sees)h(c)o +(hec)o(k;)e(P)o(atzer)h(giv)o(es)f(c)o(hec)o(k.")262 855 y(Indicating)i(that) +h(it)g(is)g(not)g(alw)o(a)o(ys)g(wise)g(to)g(put)h(y)o(our)f(opp)q(onen)o(t)g +(in)g(c)o(hec)o(k.)29 b(In)17 b(fact,)262 905 y(often)f(the)h(threat)g(is)f +(stronger)i(than)e(the)h(execution.)27 b(This)16 b(criterion)h(m)o(ust)e +(therefore)262 955 y(determine)d(the)i(relativ)o(e)f(merits)f(of)g(eac)o(h)i +(c)o(hec)o(k)g(threat)f(and)g(decide)h(what)f(p)q(enalties)g(\(if)262 +1005 y(an)o(y\))g(to)h(assign.)344 1138 y Fh(C)s(T)401 1144 +y Fe(col)457 1138 y Fp(=)d Fh(T)6 b(S)555 1145 y Fe(col;K)r(ing)q(S)r(q)q +Fk(\()p Fe(col)p Fk(\))344 1237 y Fl(where)380 1287 y Fh(T)g(S)435 +1293 y Fe(col;k)q(sq)553 1287 y Fp(:)t(TChec)o(k)14 b(=)g(0)569 +1337 y Fh(T)6 b(S)624 1343 y Fe(col)680 1337 y Fp(=)11 b(0)569 +1387 y Fl(for)k(eac)o(h)g(square)e Fp(sq)h Fl(do)628 1437 y(for)h(eac)o(h)g +(square)e Fp(sq1)h Fl(do)687 1486 y(if)e Fp(\(P)o(oten)o(tialChec)o +(k\(Opp\(col\),sq,sq1\)\))746 1536 y Fl(if)g Fp(\()p Fh(])p +Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq1\))j Fh(>)f Fp(0\))805 +1586 y(TChec)o(k)g(=)g(TChec)o(k)h(+)f(1)805 1636 y Fl(if)f +Fp(\()p Fh(])p Fp(SafeBlo)q(c)o(ks\(col,ksq,sq1\))g(=)h(0\))864 +1686 y Fl(if)28 b Fp(\()p Fl(not)13 b Fp(Escap)q(e\(col,sq,sq1\)\))923 +1735 y Fh(M)5 b(ateT)h(hr)q(eat)1154 1741 y Fe(col)1210 1735 +y Fp(=)14 b(true)923 1785 y Fh(T)6 b(S)978 1791 y Fe(col)1034 +1785 y Fp(=)12 b Fh(T)6 b(S)1133 1791 y Fe(col)1186 1785 y +Ff(\000)k Fp(128)864 1835 y Fl(else)923 1885 y Fh(T)c(S)978 +1891 y Fe(col)1034 1885 y Fp(=)12 b Fh(T)6 b(S)1133 1891 y +Fe(col)1186 1885 y Ff(\000)k Fp(16)864 1935 y Fl(endif)805 +1984 y(else)864 2034 y Fh(T)c(S)919 2040 y Fe(col)975 2034 +y Fp(=)12 b Fh(T)6 b(S)1074 2040 y Fe(col)1127 2034 y Ff(\000)k +Fp(\(6)f Ff(\000)g Fh(]S)r(af)t(eB)r(l)q(ock)q(s)q Fp(\()p +Fh(col)q(;)e(k)q(sq)q(;)g(sq)q Fp(1\)\))805 2084 y Fl(endif)746 +2134 y(else)805 2184 y Fh(T)f(S)860 2190 y Fe(col)916 2184 +y Fp(=)12 b Fh(T)6 b(S)1015 2190 y Fe(col)1068 2184 y Ff(\000)k +Fp(2)746 2234 y Fl(endif)687 2283 y(endif)628 2333 y(endfor)569 +2383 y(endfor)569 2433 y Fh(T)c(S)624 2439 y Fe(col)680 2433 +y Fp(=)11 b Fh(T)6 b(S)778 2439 y Fe(col)832 2433 y Ff(\000)k +Fh(K)s(T)936 2439 y Fe(T)t(C)r(heck)957 2574 y Fp(76)p eop +%%Page: 77 79 +77 78 bop 380 357 a Fh(K)s(T)442 363 y Fe(n)479 357 y Fp(:)78 +b([0,14,30,4)o(8,7)o(0,8)o(6,1)o(00,)o(110,)o(120)o(,120)o(,12)o(0,1)o(20,)o +(120,)o(120)o(,120)o(,12)o(0])628 407 y(Indexed)14 b(b)o(y)g(n)o(um)o(b)q(er) +f(of)h(lik)o(ely)e(c)o(hec)o(ks)j(n)f(\(0)g(to)g(15\).)262 +525 y(P)o(enalties)20 b(are)h(giv)o(en)f(for)g(p)q(oten)o(tial)g(c)o(hec)o +(ks)i(if)e(the)h(side)f(giving)f(c)o(hec)o(k)j(has)f(enough)262 +575 y(con)o(trol)16 b(o)o(v)o(er)g(the)h(c)o(hec)o(king)g(square.)27 +b(Chec)o(ks)17 b(are)g(considered)h(more)d(serious)j(if)d(there)262 +625 y(are)i(no)f(safe)h(blo)q(c)o(king)e(mo)o(v)o(es)h(a)o(v)n(ailable)e(for) +j(the)g(defender.)27 b(In)17 b(fact,)g(if)f(there)i(is)e(also)262 +675 y(no)f(escap)q(e)i(square)f(for)f(the)h(c)o(hec)o(k)o(ed)h(king,)e(the)h +(situation)f(is)g(considered)i(v)o(ery)f(serious)262 725 y(indeed.)h(The)12 +b Fm(MateThr)n(e)n(at)e Fp(predicate)i(is)f(set)h(to)f(indicate)g(the)h(sev)o +(erit)o(y)g(of)e(the)i(situation.)262 774 y(Hence,)18 b(increasing)f(the)g(n) +o(um)o(b)q(er)g(of)f(safe)h(blo)q(c)o(ks)g(is)f(rew)o(arded)i(as)f(is)g +(creating)g(escap)q(e)262 824 y(squares)e(for)e(the)i(threatened)g(king.)324 +909 y(These)e(criteria,)f(therefore,)i(encourage)f(the)g(program)d(to)i(main) +o(tain)d(a)j(king)f(p)q(osition)262 959 y(free)g(from)e(c)o(hec)o(ks)k(and)e +(to)f(pro)o(vide)h(enough)g(p)q(oten)o(tial)g(piece)g(co)o(v)o(er)h(to)f +(parry)g(an)o(y)f(c)o(hec)o(ks)262 1009 y(receiv)o(ed.)262 +1161 y Fu(4.9.5)55 b(De\014nition)17 b(33)i(:)24 b(King)19 +b(T)-5 b(able)344 1256 y Fh(K)s(T)406 1262 y Fe(col)462 1256 +y Fp(=)506 1225 y Fc(P)550 1236 y Fk(64)550 1269 y Fe(sq)q +Fk(=1)675 1256 y Fl(if)13 b Fp(\(Occup)o(y\([King],col,sq\)\))734 +1309 y Fh(K)s(S)r(T)823 1315 y Fe(col;sq)675 1359 y Fl(else)734 +1409 y Fp(0)675 1459 y Fl(endif)344 1558 y(where)380 1608 y +Fh(K)s(S)r(T)469 1614 y Fe(col;sq)570 1608 y Fp(:)34 b(King)13 +b(Square)i(T)m(able.)i(Initialised)c(b)q(efore)h(eac)o(h)h(searc)o(h.)616 +1658 y(See)g(planning)d(section)j(4.11.6)d(for)h(details.)262 +1785 y(A)k(static)g(king)g(square)h(table)f(will)f(b)q(e)i(used)g(to)f(store) +h(the)g(v)n(alues)f(of)f(eac)o(h)i(square)g(for)262 1835 y(ha)o(ving)e(a)i +(king)f(o)q(ccup)o(y)h(that)g(square.)31 b(This)17 b(enables)i(kno)o(wledge)e +(calculated)h(at)g(the)262 1884 y(ro)q(ot)c(to)h(b)q(e)g(e\016cien)o(tly)g +(applied)f(at)g(leaf)g(no)q(des.)22 b(The)15 b(table)f(will)g(b)q(e)h +(calculated)g(b)q(efore)262 1934 y(commencemen)o(t)c(of)j(the)g(searc)o(h)h +(in)e(an)h(initial)e(planning)h(phase.)262 2086 y Fu(4.9.6)55 +b(De\014nition)17 b(34)i(:)24 b(King)19 b(V)-5 b(alue)344 2177 +y Fh(K)s(V)406 2183 y Fe(col)462 2177 y Fp(=)12 b(\()p Fh(K)s(O)592 +2183 y Fe(col)645 2177 y Fp(+)e Fh(W)c(S)757 2183 y Fe(col)810 +2177 y Fp(+)k Fh(M)5 b(N)930 2183 y Fe(col)983 2177 y Fp(+)10 +b Fh(C)s(T)1082 2183 y Fe(col)1126 2177 y Fp(\))f Ff(\001)g +Fh(phase=)p Fp(16)g(+)g Fh(K)s(T)1452 2183 y Fe(col)344 2277 +y Fl(where)380 2326 y Fh(K)s(O)450 2332 y Fe(col)510 2326 y +Fp(:)23 b Fl(King)15 b(On)g(Op)q(en)g(Files)f(\(De\014nition)e(29\).)380 +2426 y Fh(W)6 b(S)450 2432 y Fe(col)510 2426 y Fp(:)23 b Fl(W)l(eak)17 +b(Squares)d(around)g(King)h(\(De\014nition)d(30\).)957 2574 +y Fp(77)p eop +%%Page: 78 80 +78 79 bop 380 357 a Fh(M)5 b(N)458 363 y Fe(col)510 357 y Fp(:)23 +b Fl(Mating)15 b(Net)g(\(De\014nitio)o(n)e(31\).)380 457 y +Fh(C)s(T)437 463 y Fe(col)510 457 y Fp(:)23 b Fl(Chec)o(k)16 +b(Threats)f(\(De\014niti)o(on)d(32\).)380 556 y Fh(K)s(T)442 +562 y Fe(col)510 556 y Fp(:)23 b Fl(King)15 b(T)l(able)g(\(De\014niti)o(on)d +(33\).)262 683 y Fp(All)i(the)i(king)f(ev)n(aluation)f(criteria)i(de\014ned)g +(in)f(this)h(section)g(are)g(summed)e(in)h(order)h(to)262 733 +y(calculate)11 b(the)h(total)f(king)g(v)n(alue)g(for)g(a)g(giv)o(en)g +(colour.)17 b(The)12 b(v)n(alues)g(are)g(further)g(adjusted)262 +783 y(b)o(y)i(the)h(game)e(phase)i(to)f(tak)o(e)h(accoun)o(t)g(of)f(a)g +(kings)g(more)g(activ)o(e)g(role)h(as)f(the)i(endgame)262 832 +y(approac)o(hes.)25 b(Therefore,)17 b(the)g(\014rst)f(four)g(features,)h +(whic)o(h)f(are)h(essen)o(tially)f(concerned)262 882 y(with)f(king)f(safet)o +(y)m(,)h(are)h(reduced)h(in)e(imp)q(ortance)g(as)h(the)g(game)e(progresses.) +24 b(The)16 b(king)262 932 y(table,)g(whic)o(h)g(already)g(has)h(information) +c(relativ)o(e)j(to)h(the)g(kings)f(latest)g(role,)h(will)e(not)262 +982 y(b)q(e)f(adjusted)g(in)g(this)g(w)o(a)o(y)m(.)p 641 1075 +673 5 v 641 1740 5 665 v 646 1158 a Fg(0Z0s0ZkZ)646 1241 y(Z0Z0ZrZp)646 +1324 y(pZpZQZpZ)646 1408 y(Z0o0A0ZP)646 1491 y(0ZNoPZ0Z)646 +1574 y(ZPl0S0Z0)646 1657 y(PZPZ0a0O)646 1740 y(Z0ZRZ0ZK)p 1310 +1740 V 641 1744 673 5 v 336 1862 a Fp(Figure)g(4.8:)j Fl(Capablance)e(v)h +(Marshall)p Fp(,)c(New)i(Y)m(ork,)f(1909,)f(Blac)o(k)i(to)g(pla)o(y)m(.)324 +1981 y(Applying)f(these)i(king)e(ev)n(aluation)g(criteria)h(to)g(the)g(p)q +(osition)f(in)h(\014gure)g(4.8)f(giv)o(es:)344 2078 y Fh(K)s(V)406 +2084 y Fe(W)t(hite)533 2078 y Fp(=)h(\()p Ff(\000)p Fp(11)9 +b Ff(\000)h Fp(27)f Ff(\000)g Fp(20)g Ff(\000)g Fp(2\))h Ff(\001)e +Fp(11)p Fh(=)p Fp(16)g Ff(\000)i Fp(1)h(=)h Ff(\000)p Fp(42)344 +2128 y Fh(K)s(V)406 2134 y Fe(B)q(lack)533 2128 y Fp(=)i(\()p +Ff(\000)p Fp(5)c Ff(\000)f Fp(43)g Ff(\000)g Fp(36)g Ff(\000)h +Fp(34\))f Ff(\001)f Fp(11)p Fh(=)p Fp(16)g(+)i(0)h(=)h Ff(\000)p +Fp(81)957 2574 y(78)p eop +%%Page: 79 81 +79 80 bop 262 307 a Fr(4.10)69 b(Static)22 b(T)-6 b(actical)21 +b(Ev)l(aluation)262 434 y Fp(The)11 b(follo)o(wing)d(criteria)k(attempt)e(to) +h(ev)n(aluate)g(tactical)f(asp)q(ects)j(statically)d(from)f(within)262 +483 y(the)h(ev)n(aluation)f(function)h(itself.)17 b(The)11 +b(ob)r(jectiv)o(e)g(of)e(these)j(criteria)f(is)f(to)g(deriv)o(e)h(an)f(accu-) +262 533 y(rate)g(v)n(alue)g(where)h(p)q(ossible,)f(and)g(where)h(uncertain)o +(t)o(y)g(exists)g(to)f(giv)o(e)f(an)h(estimate)g(of)f(the)262 +583 y(lik)o(ely)j(v)n(alue)h(and)h(recommend)e(a)i(deep)q(er)h(searc)o(h)g +(to)f(resolv)o(e)g(the)h(tactical)e(uncertain)o(t)o(y)m(.)262 +633 y(This)g(requires)i(the)g(criteria)f(to)g(detect)h(when)g(a)e(p)q +(osition)h(is)f(tactically)g(activ)o(e.)262 784 y Fu(4.10.1)55 +b(De\014nition)17 b(35)i(:)25 b(Pinned)18 b(Pieces)262 896 +y Fp(A)d(pin)g(exists)i(if)d(a)i(piece)g(exerts)h(a)e(hidden)h(\(X-ra)o(y\))g +(attac)o(k)f(through)h(an)f(enem)o(y)g(piece)262 946 y(on)o(to)g(another)i +(enem)o(y)e(piece)i(whic)o(h)f(is)g(either)g(undefended)i(or)e(of)f(greater)i +(v)n(alue)f(than)262 996 y(the)e(pinning)f(piece.)324 1081 +y(A)j(pin)g(sev)o(erely)i(restricts)g(the)f(mo)o(v)o(emen)o(t)d(of)i(the)h +(enem)o(y)f(pieces)i(in)o(v)o(olv)o(ed)d(in)h(the)262 1131 +y(pin.)34 b(A)20 b(pin)f(against)f(the)j(king)d(is)i(the)g(most)e(restrictiv) +o(e)j(t)o(yp)q(e)f(of)f(pin)g(b)q(ecause)i(the)262 1181 y(mo)o(v)o(emen)o(t) +14 b(of)i(the)i(pinned)f(piece)h(is)f(illegal)e(in)h(all)g(but)h(the)h(pin)f +(direction)g(and)g(an)o(ti{)262 1231 y(direction.)25 b(Therefore,)18 +b(a)e(pinned)h(piece's)g(defensiv)o(e)h(and)e(attac)o(king)g(capabilities)f +(are)262 1281 y(either)f(sev)o(erely)h(diminished)d(or)i(completely)f(lost.) +344 1378 y Fh(P)6 b(N)410 1384 y Fe(col)465 1378 y Fp(=)12 +b Fh(P)6 b(S)567 1384 y Fe(col)344 1478 y Fl(where)380 1527 +y Fh(P)g(S)438 1533 y Fe(col)495 1527 y Fp(:)14 b Fh(P)6 b(S)579 +1533 y Fe(col)635 1527 y Fp(=)12 b(0)521 1577 y Fl(for)j(eac)o(h)h(square)d +Fp(sq)h Fl(do)580 1627 y(for)h(eac)o(h)h(square)d Fp(sq1)h +Fl(do)639 1677 y(for)h(eac)o(h)h(square)d Fp(sq2)h Fl(do)699 +1727 y(if)e Fp(\(Pin\(col,sq,sq1,sq2\)\))758 1777 y Fl(if)g +Fp(\(V)m(alue\(sq2\))i Fh(>)g Fp(V)m(alue\(sq\))758 1826 y +Fl(or)h(not)e Fp(A)o(ttac)o(k)o(ed\([An)o(y],Opp\(col\),sq2\)\))817 +1876 y Fh(P)6 b(S)875 1882 y Fe(col)932 1876 y Fp(=)14 b(V)m(alue\(sq2\))g(+) +g(V)m(alue\(sq1\))g Ff(\000)g Fp(V)m(alue\(sq\))g(+)g(10)817 +1926 y Fl(if)e Fp(\(A)o(ttac)o(k)o(ed\([An)o(y)j Fh(<)f Fp +(On\(sq1\)],col,sq1\))817 1976 y Fl(or)h(not)e Fp(A)o(ttac)o(k)o(ed\([An)o +(y],Opp\(col\),sq1\))817 2026 y Fl(or)g Fp(\()p Fh(])p Fp(Di\013A)o(ttac)o +(ks\(col,sq1\))h Ff(\025)g Fp(0)f Fl(and)h Fp(Con)o(trol\(sq1\))f(=)h +(col\)\))876 2075 y Fh(T)6 b(hr)q(eat)1006 2081 y Fe(col)1061 +2075 y Fp(=)12 b Fh(T)6 b(hr)q(eat)1235 2081 y Fe(col)1288 +2075 y Fp(+)k(1)876 2125 y Fh(P)c(S)934 2131 y Fe(col)989 2125 +y Fp(=)12 b Fh(P)6 b(S)1091 2131 y Fe(col)1144 2125 y Fp(+)j +Fh(r)q(ev)q(P)d(hase)817 2175 y Fl(endif)758 2225 y(endif)699 +2275 y(endif)639 2324 y(endfor)580 2374 y(endfor)521 2424 y(endfor)957 +2574 y Fp(79)p eop +%%Page: 80 82 +80 81 bop 262 307 a Fp(It)11 b(is)f(imp)q(ortan)o(t)g(to)g(b)q(e)i(able)f(to) +f(iden)o(tify)h(and)f(assess)j(the)e(v)n(alue)g(of)f(pins.)17 +b(This)11 b(de\014nition)262 357 y(giv)o(es)20 b(a)f(b)q(on)o(us)i(for)f +(pinning)f(an)h(opp)q(onen)o(ts)h(piece.)38 b(Pins)20 b(are)h(tactically)e +(complex.)262 407 y(Therefore,)12 b(this)f(criterion)h(attempts)f(to)g +(assess)h(those)g(asp)q(ects)h(whic)o(h)e(can)h(b)q(e)g(statically)262 +457 y(v)n(alued.)22 b(If)15 b(the)h(criterion)g(assesses)i(the)e(pin)f(as)h +(a)f(tactically)g(dynamic)f(threat,)i(then)g(a)262 506 y(tactical)11 +b(coun)o(t)h(indicating)f(the)h(uncertain)o(t)o(y)h(of)e(the)h(static)h(ev)n +(aluation)d(is)i(incremen)o(ted.)262 556 y(Basically)m(,)i(this)i(indicates)g +(that)g(although)e(a)i(static)g(v)n(alue)f(is)h(calculated,)g(the)g(tactical) +262 606 y(uncertain)o(t)o(y)f(should)g(b)q(e)h(resolv)o(ed)g(b)o(y)f +(extending)h(the)g(searc)o(h)h(un)o(til)d(a)h(more)f(quiescen)o(t)262 +656 y(p)q(osition)f(is)g(reac)o(hed.)20 b(See)15 b(c)o(hapter)f(5)g(for)g +(more)e(details.)324 741 y(The)21 b(ev)n(aluation)e(function)h(do)q(es)h(not) +g(kno)o(w)f(whether)i(a)e(deep)q(er)i(searc)o(h)g(will)d(b)q(e)262 +791 y(successful)c(in)e(\014nding)g(a)g(quiescen)o(t)i(p)q(osition)e(or)g(ev) +o(en)i(has)e(enough)h(time)e(to)i(undertak)o(e)262 841 y(suc)o(h)g(a)g(task.) +19 b(Therefore,)c(a)e(v)n(alue)h(indicating)f(its)h(liking)e(for)i(the)g +(tactical)g(uncertain)o(t)o(y)262 891 y(is)f(included)h(in)g(the)g(o)o(v)o +(erall)f(static)h(v)n(alue.)p 641 984 673 5 v 641 1648 5 665 +v 646 1067 a Fg(0Z0Z0Zrs)646 1150 y(oQZ0Z0Z0)646 1233 y(0ZRZbj0Z)646 +1316 y(Z0ZqZ0Z0)646 1399 y(0Z0O0m0Z)646 1482 y(Z0Z0ZNZ0)646 +1565 y(PZ0Z0OPO)646 1648 y(Z0Z0S0J0)p 1310 1648 V 641 1652 +673 5 v 384 1771 a Fp(Figure)g(4.9:)j Fl(Dy)o(atlo)o(v)d(v)i(Shashin)p +Fp(,)11 b(Leningrad,)i(1962,)g(Blac)o(k)g(to)h(pla)o(y)m(.)324 +1889 y(Applying)e(the)i(Pinned)f(Pieces)i(ev)n(aluation)d(criteria)i(to)f +(the)h(ab)q(o)o(v)o(e)f(p)q(osition)f(giv)o(es:)344 1987 y +Fh(P)6 b(N)410 1993 y Fe(W)t(hite)533 1987 y Fp(=)14 b(22)344 +2037 y Fh(P)6 b(N)410 2043 y Fe(B)q(lack)533 2037 y Fp(=)14 +b(15)957 2574 y(80)p eop +%%Page: 81 83 +81 82 bop 262 307 a Fu(4.10.2)55 b(De\014nition)17 b(36)i(:)25 +b(A)n(ttac)n(k)n(ed)19 b(Pieces)344 438 y Fh(AP)402 444 y Fe(col)457 +438 y Fp(=)501 407 y Fc(P)545 417 y Fk(64)545 451 y Fe(sq)q +Fk(=1)628 438 y Fh(AT)683 444 y Fe(col;sq)344 541 y Fl(where)380 +591 y Fh(AT)435 597 y Fe(col;sq)535 591 y Fp(:)69 b Fl(if)13 +b Fp(\(Occup)o(y\([P)o(a)o(wn,Knigh)o(t,Bishop,Ro)q(ok,Queen],col,sq\))616 +641 y Fl(and)g Fp(A)o(ttac)o(k)o(ed\([An)o(y],Opp\(col\),sq\)\))675 +691 y Fl(if)g Fp(\()p Fl(not)g Fp(A)o(ttac)o(k)o(ed\([An)o(y],col,sq\))675 +740 y Fl(or)g Fp(A)o(ttac)o(k)o(ed\([An)o(y)p Fh(<)p Fp +(On\(sq\)],Opp\(col\),sq\))675 790 y Fl(or)g Fp(\(Con)o(trol\(sq\))h(=)g +(Opp\(col\))h Fl(and)e Fh(])p Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq\))h +Fh(>)g Fp(0\)\))734 840 y Fh(AT)789 846 y Fe(col;sq)887 840 +y Fp(=)d Fh(AT)985 846 y Fe(col;sq)1081 840 y Ff(\000)e Fp(8)p +Ff(\000)14 b Fp(V)m(alue\(sq\))734 890 y Fh(T)6 b(hr)q(eat)864 +896 y Fe(col)920 890 y Fp(=)11 b Fh(T)6 b(hr)q(eat)1093 896 +y Fe(col)1147 890 y Fp(+)j(1)734 940 y Fl(if)k Fp(\(T)m(rapp)q +(ed\(col,sq\)\))793 989 y Fh(AT)848 995 y Fe(col;sq)946 989 +y Fp(=)e Fh(AT)1044 995 y Fe(col;sq)1140 989 y Ff(\000)e Fh(V)h(al)q(ue)p +Fp(\()p Fh(sq)q Fp(\))p Ff(\001)k Fp(revPhase)793 1039 y Fh(T)6 +b(hr)q(eat)923 1045 y Fe(col)979 1039 y Fp(=)11 b Fh(T)6 b(hr)q(eat)1152 +1045 y Fe(col)1206 1039 y Fp(+)j(1)734 1089 y Fl(endif)675 +1139 y(else)734 1189 y(if)k Fp(\(Con)o(trol\(sq\))h(=)g(Opp\(col\))g +Fl(or)f Fh(])p Fp(Di\013A)o(ttac)o(ks\(Opp\(col\),sq\))i Fh(>)f +Fp(0\))793 1239 y Fh(AT)848 1245 y Fe(col;sq)946 1239 y Fp(=)d +Fh(AT)1044 1245 y Fe(col;sq)1131 1239 y Ff(\000)p Fp(V)m(alue\(sq\))734 +1288 y Fl(endif)675 1338 y(endif)616 1388 y(endif)262 1506 +y Fp(Pieces)k(whic)o(h)f(are)h(threatened)h(with)e(pro\014table)g(capture)h +(\(en-prise\))g(b)o(y)f(the)h(opp)q(osing)262 1556 y(side)i(are)g(p)q +(enalised.)28 b(This)17 b(p)q(enalt)o(y)g(is)g(levied)g(not)g(b)q(ecause)h +(the)g(loss)f(of)f(the)i(piece)g(is)262 1606 y(considered)f(lik)o(ely)m(,)e +(but)i(b)q(ecause)h(it)f(is)f(v)o(ery)h(lik)o(ely)e(that)i(a)f(temp)q(o)g +(will)f(b)q(e)i(w)o(asted)g(in)262 1656 y(protecting)c(or)g(mo)o(ving)d(the)j +(threatened)i(piece.)j(The)c(threat)f(coun)o(t)g(is)g(incremen)o(ted)g(for) +262 1705 y(ev)o(ery)h(piece)h(en-prise.)324 1791 y(T)m(rapp)q(ed)j(pieces)h +(whic)o(h)f(are)g(also)f(en-prise)i(are)f(additionally)d(p)q(enalised)j(and)g +(the)262 1840 y(threat)e(coun)o(t)f(is)h(further)g(incremen)o(ted.)23 +b(Pieces)17 b(whic)o(h)e(are)h(under)g(pressure,)i(but)e(not)262 +1890 y(en-prise)k(are)g(also)f(p)q(enalised)h(although)e(to)i(a)f(lesser)i +(exten)o(t.)36 b(The)20 b(threat)g(coun)o(t)g(is)262 1940 y(used)13 +b(to)f(extend)h(the)g(searc)o(h)h(in)e(p)q(ositions)g(where)h(an)f(accurate)i +(static)e(ev)n(aluation)f(v)n(alue)262 1990 y(cannot)j(b)q(e)g(calculated.) +324 2075 y(Applying)f(the)h(A)o(ttac)o(k)o(ed)h(Pieces)g(criteria)f(to)g(the) +g(p)q(osition)g(in)f(\014gure)h(4.9)f(giv)o(es:)344 2166 y +Fh(AP)402 2172 y Fe(W)t(hite)533 2166 y Fp(=)h Ff(\000)p Fp(18)344 +2215 y Fh(AP)402 2221 y Fe(B)q(lack)533 2215 y Fp(=)g Ff(\000)p +Fp(9)344 2265 y Fh(T)6 b(hr)q(eat)474 2271 y Fe(W)t(hite)583 +2265 y Fp(=)12 b(2)344 2315 y Fh(T)6 b(hr)q(eat)474 2321 y +Fe(B)q(lack)576 2315 y Fp(=)12 b(1)262 2391 y(The)19 b(n)o(um)o(b)q(er)g(of)f +(threats)i(against)f(white)g(\(2\),)h(represen)o(ts)i(a)d(degree)i(of)d +(uncertain)o(t)o(y)262 2441 y(ab)q(out)13 b(the)i(tactical)e(p)q +(ossibilities)h(threatened)h(against)e(the)i(white)f(pieces.)957 +2574 y(81)p eop +%%Page: 82 84 +82 83 bop 262 307 a Fr(4.11)69 b(Planning)262 434 y Fp(Before)18 +b(eac)o(h)g(searc)o(h)h(b)q(egins)e(an)h(analysis)f(of)f(the)j(p)q(osition)d +(will)g(b)q(e)j(done.)29 b(This)17 b(will)262 483 y(enable)11 +b(v)n(arious)g(piece)h(square)g(tables)g(to)f(b)q(e)h(loaded)f(with)g(v)n +(alues)g(whic)o(h)g(can)g(b)q(e)h(applied)262 533 y(at)h(leaf)h(no)q(des)g +(using)g(lo)q(ok)f(up)h(tables.)324 618 y(Ob)o(viously)d(this)g(is)h(m)o(uc)o +(h)e(faster)j(than)e(rep)q(eatedly)i(calculating)e(information)e(at)i(leaf) +262 668 y(no)q(des.)18 b(Hence,)d(in)e(an)h(implemen)o(tati)o(on,)d(all)h +(leaf)h(no)q(de)h(ev)n(aluation)f(criteria)h(whic)o(h)f(are)262 +718 y(essen)o(tially)18 b(static)h(should)g(b)q(e)g(incorp)q(orated)g(in)o +(to)f(these)i(tables)f(and)g(remo)o(v)o(ed)e(from)262 768 y(the)d(leaf)f(ev)n +(aluation)f(pro)q(cess.)20 b(Ho)o(w)o(ev)o(er,)13 b(this)h(c)o(hapter)h +(represen)o(ts)h(a)d(de\014nition)g(of)g(m)o(y)262 818 y(prop)q(osed)19 +b(ev)n(aluation)e(function)h(regardless)h(of)f(implemen)o(tation)d(detail.)31 +b(Therefore,)262 867 y(some)19 b(criteria)i(whic)o(h)f(are)h(suited)g(to)g +(piece)g(square)h(tables)e(are)h(de\014ned)h(separately)262 +917 y(b)q(ecause)15 b(of)e(their)i(imp)q(ortance.)324 1003 +y(T)m(o)f(com)o(bat)f(the)j(t)o(ypically)d(aimless)h(pla)o(y)g(of)g(c)o(hess) +j(programs)c(I)i(will)e(include)i(some)262 1052 y(rudimen)o(tary)h(planning)h +(in)h(the)h(ev)n(aluation)d(function.)31 b(P)o(art)18 b(of)g(the)g(initial)e +(analysis)262 1102 y(done)h(b)q(efore)g(eac)o(h)h(searc)o(h)g(commences)d +(will)h(include)h(a)f(selection)i(of)e(an)h(appropriate)262 +1152 y(plan)c(for)g(the)i(curren)o(t)g(p)q(osition.)j(The)c(plans)f(whic)o(h) +h(will)f(b)q(e)h(recognised)h(are:)312 1270 y(1.)20 b Fl(King)15 +b(side)g(attac)o(k)g(with)g(pa)o(wns)p Fp(.)312 1352 y(2.)20 +b Fl(King)15 b(side)g(attac)o(k)g(with)g(pieces)p Fp(.)312 +1435 y(3.)20 b Fl(King)15 b(side)g(attac)o(k)g(with)g(pieces)f(and)i(pa)o +(wns)p Fp(.)312 1517 y(4.)k Fl(Queen)15 b(side)f(attac)o(k)i(with)f(pa)o(wns) +p Fp(.)312 1600 y(5.)20 b Fl(Queen)15 b(side)f(attac)o(k)i(with)f(pieces)p +Fp(.)312 1683 y(6.)20 b Fl(Queen)15 b(side)f(attac)o(k)i(with)f(pieces)f(and) +h(pa)o(wns)p Fp(.)312 1765 y(7.)20 b Fl(Using)14 b(pa)o(wns)i(as)g(lev)o(ers) +p Fp(.)312 1848 y(8.)k Fl(Endgame,)c(king)e(and)i(pa)o(wn)f(co-ordination)o +Fp(.)262 1965 y(These)e(plans)f(are)g(relativ)o(ely)g(general,)g(but)g +(should)g(pro)o(vide)g(the)h(program)e(with)h(enough)262 2015 +y(v)n(ariet)o(y)h(to)g(c)o(ho)q(ose)h(a)g(plan)f(relev)n(an)o(t)g(to)h(the)g +(p)q(osition)f(and)h(attempt)e(to)i(co-ordinate)g(its)262 2065 +y(mo)o(v)o(es)g(to)h(ac)o(hiev)o(e)h(common)c(goals.)22 b(It)16 +b(is)f(not)g(the)h(ob)r(ject)h(of)d(these)j(plans)e(to)h(suggest)262 +2115 y(sp)q(eci\014c)j(mo)o(v)o(es,)e(but)i(rather)g(to)e(allo)o(w)g(the)i +(searc)o(h)g(to)f(b)q(e)g(guided)g(to)o(w)o(ard)g(the)g(goals)262 +2165 y(iden)o(ti\014ed.)324 2250 y(T)m(o)c(enable)h(the)h(searc)o(h)g(to)f(b) +q(e)h(guided,)f(the)h(appropriate)f(piece)h(square)g(tables)f(will)262 +2300 y(b)q(e)20 b(up)q(dated)h(in)f(suc)o(h)h(a)f(w)o(a)o(y)g(that)g(mo)o(v)o +(es)f(whic)o(h)h(con)o(tribute)h(to)f(the)h(ac)o(hiev)o(emen)o(t)262 +2350 y(of)16 b(the)h(c)o(hosen)h(goals)e(will)f(b)q(e)j(encouraged.)28 +b(This)16 b(will)g(hop)q(efully)g(ha)o(v)o(e)g(the)i(e\013ect)g(of)262 +2399 y(pro)o(viding)12 b(a)i(common)d(purp)q(ose)k(to)e(the)i(programs)e(mo)o +(v)o(es)f(rather)j(than)f(allo)o(wing)d(it)j(to)262 2449 y(pla)o(y)e +(aimless,)g(although)h(solid)g(mo)o(v)o(es.)957 2574 y(82)p +eop +%%Page: 83 85 +83 84 bop 324 307 a Fp(There)17 b(are)f(no)f(sp)q(eci\014c)i(op)q(ening)f +(plans,)f(ho)o(w)o(ev)o(er,)h(the)g(ev)n(aluation)f(function)g(do)q(es)262 +357 y(pro)o(vide)g(ample)f(criteria)i(suc)o(h)g(as)g(Dev)o(elopmen)o(t,)e +(Cen)o(tre)j(Con)o(trol)e(etc,)h(to)g(encourage)262 407 y(go)q(o)q(d)d(op)q +(ening)h(pla)o(y)m(.)324 492 y(The)j(plans)f(a)o(v)n(ailable)e(in)i(the)h +(middle)d(game)h(are)i(attac)o(k)f(orien)o(ted.)26 b(Ho)o(w)o(ev)o(er,)17 +b(b)q(e-)262 542 y(cause)g(appropriate)g(plans)f(are)h(selected)h(for)e(b)q +(oth)h(sides)g(this)g(will)e(ha)o(v)o(e)h(the)h(e\013ect)h(of)262 +592 y(making)11 b(eac)o(h)k(side)g(attempt)e(to)h(obstruct)h(the)g(other)g +(sides)g(plan.)j(This)c(will)f(ob)o(viously)262 641 y(include)h(b)q(oth)g +(defensiv)o(e)g(and)g(aggressiv)o(e)g(measures.)324 727 y(In)e(the)h +(endgame,)e(only)g(a)h(general)g(approac)o(h)g(to)g(king{pa)o(wn)f +(co-ordination)g(will)g(b)q(e)262 777 y(tak)o(en.)18 b(The)13 +b(endgame)g(is)g(a)g(stage)h(of)f(the)h(game)e(where)j(sp)q(eci\014c)f(kno)o +(wledge)g(and)f(plans)262 826 y(w)o(ould)f(greatly)h(help)h(in)f(the)h +(handling)e(of)g(certain)i(t)o(yp)q(es)h(of)e(endings)g(whic)o(h)g(ha)o(v)o +(e)h(more)262 876 y(discernible)d(goals.)17 b(Ho)o(w)o(ev)o(er,)11 +b(suc)o(h)h(a)f(comprehensiv)o(e)g(approac)o(h)g(could)g(form)f(the)i(basis) +262 926 y(for)h(an)h(en)o(tire)g(pro)r(ject)h(in)f(itself.)262 +1076 y Fu(4.11.1)55 b(De\014nition)17 b(37)i(:)25 b(Pressure)18 +b(on)h(King)344 1243 y Fh(P)6 b(K)412 1249 y Fe(col)467 1243 +y Fp(=)12 b(\()527 1211 y Fc(P)571 1222 y Fk(64)571 1255 y +Fe(sq)q Fk(=1)654 1243 y Fh(C)s(L)715 1249 y Fe(col;sq)801 +1243 y Fp(\))d(+)h Fh(AD)933 1250 y Fe(col;O)q(nF)t(ile)p Fk(\()p +Fe(K)r(ing)q(S)r(q)q Fk(\()p Fe(col)p Fk(\)\))344 1345 y Fl(where)380 +1395 y Fh(C)s(L)441 1401 y Fe(col;sq)540 1395 y Fp(:)40 b Fl(if)13 +b Fp(\(T)m(axicab\(KingSq\(col\),sq\))g Ff(\024)h Fp(4)592 +1445 y Fl(and)f Ff(j)h Fp(OnFile\(KingSq\(col\)\))f Ff(\000)i +Fp(OnFile\(sq\))f Ff(j)d(\024)j Fp(2\))651 1495 y Fh(AT)706 +1502 y Fe(O)q(pp)p Fk(\()p Fe(col)p Fk(\))p Fe(;sq)888 1495 +y Fp(+)9 b Fh(P)d(M)1002 1502 y Fe(O)q(pp)p Fk(\()p Fe(col)p +Fk(\))p Fe(;sq)1183 1495 y Ff(\000)k Fh(D)q(F)1287 1501 y Fe(col;sq)592 +1545 y Fl(else)651 1594 y Fp(0)592 1644 y Fl(endif)380 1744 +y Fh(AT)435 1750 y Fe(col;sq)535 1744 y Fp(:)45 b Fh(])p Fp(A)o(ttac)o +(ks\([Ro)q(ok],col,sq\))12 b(+)592 1794 y(2)d Ff(\001)g Fh(])p +Fp(A)o(ttac)o(ks\([P)o(a)o(wn,Knigh)o(t,Bishop],col,sq\))j(+)592 +1844 y(3)d Ff(\001)g Fh(])p Fp(A)o(ttac)o(ks\([Queen],col,sq\))380 +1948 y Fh(P)d(M)453 1954 y Fe(col;sq)552 1948 y Fp(:)592 1917 +y Fc(P)636 1927 y Fk(64)636 1960 y Fe(sq)q Fk(2=1)769 1948 +y Fl(if)13 b Fp(\(A)o(ttac)o(king\([P)o(a)o(wn],col,sq2,sq\))769 +2001 y Fl(and)g Fh(])p Fp(Mo)o(v)o(es\([P)o(a)o(wn],col,sq2\))g +Fh(>)h Fp(0\))828 2051 y(2)769 2100 y Fl(else)828 2150 y Fp(0)769 +2200 y Fl(endif)380 2300 y Fh(D)q(F)442 2306 y Fe(col;sq)541 +2300 y Fp(:)39 b Fh(])p Fp(A)o(ttac)o(ks\([Ro)q(ok],col,sq\))12 +b(+)592 2350 y(2)d Ff(\001)g Fh(])p Fp(A)o(ttac)o(ks\([Knigh)o +(t,Bishop,Queen],col,sq\))k(+)592 2399 y(3)c Ff(\001)g Fh(])p +Fp(A)o(ttac)o(ks\([P)o(a)o(wn],col,sq\))957 2574 y(83)p eop +%%Page: 84 86 +84 85 bop 380 307 a Fh(AD)445 313 y Fe(col;k)q(f)551 307 y +Fp(:)592 276 y Fc(P)636 286 y Fe(k)q(f)s Fk(+1)636 320 y Fe(f)s +Fk(=)p Fe(k)q(f)s Fd(\000)p Fk(1)769 307 y Fl(if)13 b Fp(\(Op)q(en\(f)s(\))i +Fl(or)f Fp(SemiOp)q(en\(Opp\(col\),f)s(\)\))828 360 y(3)769 +410 y Fl(else)828 460 y Fp(0)769 510 y Fl(endif)324 636 y Fp(This)19 +b(de\014nition)h(attempts)f(to)g(calculate)h(ho)o(w)f(m)o(uc)o(h)g(pressure)i +(in)f(terms)f(of)g(the)262 686 y(attac)o(k/defence)14 b(balance)e(is)h +(curren)o(tly)g(exerted)i(on)d(the)h(king)f(in)h(question.)k(The)d(higher)262 +736 y(the)e(v)n(alue)g(of)g(PK,)g(the)h(more)e(pressure)j(is)f(though)o(t)f +(to)g(exist.)18 b(This)12 b(de\014nition)g(will)e(form)262 +786 y(the)15 b(basis)f(of)g(a)h(decision)g(as)f(to)h(whether)h(an)e(assault)h +(against)f(the)h(king)f(is)g(lik)o(ely)g(to)g(b)q(e)262 836 +y(w)o(orth)o(while.)324 921 y(This)i(de\014nition)g(tak)o(es)h(in)o(to)f +(accoun)o(t)h(attac)o(ks)g(b)o(y)f(b)q(oth)g(sides)i(on)e(squares)h(within) +262 971 y(a)f(4)g(square,)h(2)f(\014le)g(b)q(oundary)g(of)g(eac)o(h)h(king.) +25 b(The)16 b(v)n(alue)g(of)g(the)h(attac)o(k)f(dep)q(ends)i(on)262 +1020 y(the)d(t)o(yp)q(e)h(of)e(pieces)i(in)o(v)o(olv)o(ed.)k(The)c(defensiv)o +(e)f(v)n(alue)g(is)f(calculated)i(in)e(a)h(similar)d(w)o(a)o(y)m(,)262 +1070 y(except)k(the)g(relativ)o(e)e(v)n(alue)h(of)f(the)i(attac)o(ks)f(b)o(y) +g(pieces)h(are)f(di\013eren)o(t.)23 b(F)m(or)14 b(example,)g(a)262 +1120 y(pa)o(wn)f(is)h(considered)h(to)f(p)q(erform)f(a)g(b)q(etter)j +(defensiv)o(e)f(role)e(than)h(an)g(attac)o(king)f(one.)324 +1205 y(Mobile)18 b(pa)o(wns)i(in)e(attac)o(k)i(are)f(considered)i(sup)q +(erior)f(to)f(blo)q(c)o(k)o(ed)g(pa)o(wns.)34 b(Also,)262 1255 +y(an)19 b(allo)o(w)o(ance)g(is)h(made)f(for)h(op)q(en)g(or)g(semi{op)q(en)f +(\014les)i(a)o(v)n(ailable)d(to)i(the)g(attac)o(king)262 1305 +y(side)f(b)q(ecause)h(this)f(ob)o(viously)e(impro)o(v)o(es)g(the)j(lik)o +(eliho)q(o)q(d)d(of)h(an)g(attac)o(k)h(on)f(the)h(king)262 +1355 y(succeeding.)262 1506 y Fu(4.11.2)55 b(De\014nition)17 +b(38)i(:)25 b(Plan)18 b(Selection)344 1597 y Fh(P)6 b(S)402 +1603 y Fe(col)460 1597 y Fp(=)100 b Fl(if)13 b Fp(\(phase)i +Fh(<)f Fp(8\))651 1647 y Fl(if)f Fp(\()p Fh(])p Fp(P)o(a)o(wns)h +Fh(>)g Fp(0\))710 1697 y Fh(P)6 b(l)q(anT)g(y)q(pe)894 1703 +y Fe(col)953 1697 y Fp(=)14 b(EndGameKP)710 1747 y Fh(P)6 b(l)q(anW)g(ing)907 +1753 y Fe(col)965 1747 y Fp(=)14 b(QueenSide)h Ff([)e Fp(KingSide)651 +1797 y Fl(endif)592 1846 y(else)651 1896 y(if)g Fp(\()p Fh(P)6 +b(K)777 1903 y Fe(O)q(pp)p Fk(\()p Fe(col)p Fk(\))919 1896 +y Fh(>)14 b Fp(phase\))710 1946 y Fl(if)f Fp(\()p Fh(P)6 b(K)836 +1953 y Fe(O)q(pp)p Fk(\()p Fe(col)p Fk(\))978 1946 y Fh(>)14 +b Fp(phase+3)g Fl(or)g Fp(Opp)q(ositeFlanks\))769 1996 y Fh(P)6 +b(l)q(anT)g(y)q(pe)953 2002 y Fe(col)1012 1996 y Fp(=)14 b(P)o(a)o(wnA)o +(ttac)o(k)g Ff([)f Fp(PieceA)o(ttac)o(k)710 2046 y Fl(else)769 +2096 y Fh(P)6 b(l)q(anT)g(y)q(pe)953 2102 y Fe(col)1012 2096 +y Fp(=)14 b(PieceA)o(ttac)o(k)710 2145 y Fl(endif)710 2195 +y Fh(P)6 b(l)q(anW)g(ing)907 2201 y Fe(col)965 2195 y Fp(=)14 +b(Wing\(KingSq\(Opp\(col\)\)\))651 2245 y Fl(else)710 2295 +y(if)f Fp(\(Opp)q(ositeFlanks\))769 2345 y Fh(P)6 b(l)q(anT)g(y)q(pe)953 +2351 y Fe(col)1012 2345 y Fp(=)14 b(P)o(a)o(wnA)o(ttac)o(k)769 +2394 y Fh(P)6 b(l)q(anW)g(ing)966 2400 y Fe(col)1024 2394 y +Fp(=)14 b(Wing\(KingSq\(Opp\(col\)\)\))710 2444 y Fl(else)957 +2574 y Fp(84)p eop +%%Page: 85 87 +85 86 bop 769 307 a Fl(if)13 b Fp(\(phase)i Fh(>)f Fp(10\))828 +357 y Fh(P)6 b(l)q(anT)g(y)q(pe)1012 363 y Fe(col)1071 357 +y Fp(=)14 b(Lev)o(erP)o(a)o(wns)828 407 y Fh(P)6 b(l)q(anW)g(ing)1025 +413 y Fe(col)1083 407 y Fp(=)14 b(QueenSide)h Ff([)f Fp(KingSide)769 +457 y Fl(else)828 506 y Fh(P)6 b(l)q(anT)g(y)q(pe)1012 512 +y Fe(col)1071 506 y Fp(=)14 b(None)769 556 y Fl(endif)710 606 +y(endif)651 656 y(endif)592 706 y(endif)262 832 y Fp(This)k(de\014nition)g +(attempts)h(to)f(select)i(the)g(b)q(est)g(plan)e(at)g(its)h(disp)q(osal)f +(based)i(on)e(the)262 882 y(kno)o(wn)e(information.)25 b(It)17 +b(ma)o(y)e(b)q(e)j(the)g(case)g(that)f(no)g(plan)f(is)h(clear,)h(in)f(this)g +(case)h(no)262 932 y(plan)13 b(will)f(b)q(e)j(selected.)324 +1017 y(In)i(the)g(endgame)f(only)g(one)h(plan)f(is)h(kno)o(wn,)g(that)f(of)h +(king{pa)o(wn)e(co-ordination.)262 1067 y(In)e(the)h(op)q(ening)g(or)f +(middle)f(game,)g(if)h(the)h(attac)o(k{defence)h(balance)e(\(pressure\))k(on) +c(the)262 1117 y(opp)q(onen)o(ts)i(king)e(app)q(ears)i(to)f(o\013er)h(some)f +(lik)o(eliho)q(o)q(d)e(of)i(success,)i(then)f(a)f(piece)i(attac)o(k)262 +1167 y(plan)d(is)g(considered)i(suitable.)j(If)c(the)g(pressure)i(is)e(ev)o +(en)g(greater,)h(a)e(pa)o(wn)h(assault)f(plan)262 1217 y(is)g(also)h +(selected.)20 b(The)15 b(idea)f(here)h(is)f(to)g(only)f(use)i(pa)o(wns)f +(when)g(there)i(is)e(enough)g(piece)262 1266 y(co)o(v)o(erage)g(to)g(mak)o(e) +e(their)i(use)h(e\013ectiv)o(e.)324 1352 y(Pressure)21 b(is)d(in)g(fact)g(a)g +(measure)g(of)g(the)h(balance)f(b)q(et)o(w)o(een)i(attac)o(k)e(and)h +(defence,)262 1401 y(therefore)i(a)f(king)f(assault)h(plan)g(ma)o(y)e(ev)o +(en)j(b)q(e)f(considered)i(if)d(no)h(relev)n(an)o(t)g(attac)o(ks)262 +1451 y(curren)o(tly)10 b(exist.)17 b(This)9 b(of)g(course)i(dep)q(ends)g(on)e +(the)h(enem)o(y)f(defence)i(b)q(eing)e(w)o(eak.)17 b(Hence,)262 +1501 y(once)12 b(a)f(w)o(eakness)h(is)g(detected)h(b)o(y)e(the)h(program)e +(it)h(ma)o(y)f(switc)o(h)h(its)h(atten)o(tion)f(to)g(a)g(king)262 +1551 y(assault.)18 b(Hop)q(efully)c(this)g(will)f(help)h(the)h(program)d(to)i +(exhibit)g(a)g(more)f(h)o(uman)g(st)o(yle)h(of)262 1601 y(pla)o(y)m(.)324 +1686 y(Additionally)m(,)8 b(if)i(the)h(kings)f(ha)o(v)o(e)g(castled)h(on)f +(opp)q(osite)h(\015anks,)f(a)h(plan)e(to)i(encourage)262 1736 +y(an)i(assault)h(b)o(y)g(pa)o(wns)g(will)e(b)q(e)i(selected.)324 +1821 y(If)c(none)h(of)f(these)i(plans)f(are)g(selected,)h(a)f(general)g(goal) +e(of)h(using)g(pa)o(wn)h(lev)o(ers)g(ma)o(y)e(b)q(e)262 1871 +y(used.)18 b(The)12 b(idea)g(here)h(is)e(to)h(use)h(pa)o(wns)e(as)h(lev)o +(ers)h(against)e(the)h(enem)o(y)f(pa)o(wn)h(structure,)262 +1921 y(therefore,)i(creating)g(dynamic)e(t)o(yp)q(e)j(p)q(ositions)e(whic)o +(h)h(are)g(b)q(est)h(suited)f(to)f(a)h(programs)262 1970 y(tactical)f(abilit) +o(y)m(.)957 2574 y(85)p eop +%%Page: 86 88 +86 87 bop 262 307 a Fu(4.11.3)55 b(De\014nition)17 b(39)i(:)25 +b(P)n(a)n(wn)20 b(Square)e(T)-5 b(able)p 641 413 673 5 v 641 +1077 5 665 v 646 496 a Fg(0Z0Z0Z0Z)646 579 y(Z0Z0Z0Z0)646 662 +y(0Z0Z0Z0Z)646 745 y(Z0Z0Z0Z0)646 828 y(0Z0Z0Z0Z)646 911 y(Z0Z0Z0Z0)646 +994 y(0Z0Z0Z0Z)646 1077 y(Z0Z0Z0Z0)p 1310 1077 V 641 1081 673 +5 v 675 473 a Fl(0)59 b(0)f(0)h(0)g(0)f(0)h(0)g(0)675 556 y(20)35 +b(20)f(24)h(28)g(28)f(24)h(20)g(20)675 639 y(16)g(16)f(20)h(24)g(24)f(20)h +(16)g(16)675 722 y(12)g(12)f(16)h(20)g(20)f(16)h(12)g(12)675 +805 y(8)59 b(8)f(12)35 b(16)g(16)f(12)h(8)59 b(8)675 888 y(6)g(6)f(8)h(12)35 +b(12)f(8)59 b(6)g(6)675 971 y(4)g(4)f(6)h(8)g(8)f(6)h(4)g(4)675 +1054 y(0)g(0)f(0)h(0)g(0)f(0)h(0)g(0)479 1180 y Fp(Figure)14 +b(4.10:)i(Initial)d(W)m(eigh)o(tings)f(for)i(P)o(a)o(wn)f(Square)i(T)m(able.) +344 1292 y Fh(P)6 b(S)r(T)428 1298 y Fe(col;sq)528 1292 y Fp(:)52 +b Fl(for)15 b(eac)o(h)h(square)d Fp(sq)h Fl(do)651 1342 y Fh(P)6 +b(S)r(T)735 1348 y Fe(col;sq)833 1342 y Fp(=)12 b Fh(S)r(T)928 +1348 y Fe(col;sq)1024 1342 y Fp(+)d Fh(K)s(S)1128 1348 y Fe(col;sq)1224 +1342 y Fp(+)h Fh(P)c(A)1330 1348 y Fe(col;sq)1424 1342 y Fp(+)k +Fh(P)c(L)1527 1348 y Fe(col;sq)592 1392 y Fl(endfor)344 1491 +y(where)380 1541 y Fh(S)r(T)431 1547 y Fe(col;sq)531 1541 y +Fp(:)49 b(Static)14 b(w)o(eigh)o(tings)f(as)h(de\014ned)h(in)f(\014gure)g +(4.10.)380 1641 y Fh(K)s(S)443 1647 y Fe(col;sq)543 1641 y +Fp(:)37 b Fl(if)13 b Fp(\()p Fh(])p Fp(UnMo)o(v)o(ed\(col,King\))g(=)h(0\)) +651 1691 y Fl(if)f Fp(\(KingDistance\(KingSq\(col\),sq\))h +Fh(<)g Fp(2\))710 1741 y Fl(case)g Fp(Distance\(KingSq\(col\),sq\))g +Fl(of)769 1790 y Fp(1)g(:)k(phase)769 1840 y(2)c(:)k(phase/2)710 +1890 y Fl(else)769 1940 y Fp(0)710 1990 y Fl(endcase)651 2039 +y(else)710 2089 y Fp(0)651 2139 y Fl(endif)592 2189 y(else)651 +2239 y(if)13 b Fp(\(\(OnFile\(sq\))i(=)f(1)f Fl(or)h Fp(2)f +Fl(or)h Fp(7)f Fl(or)h Fp(8\))f Fl(and)g Fp(OnRank\(col,sq\))h +Ff(\024)g Fp(3\))710 2288 y(phase)h(/)e(OnRank\(col,sq\))651 +2338 y Fl(else)710 2388 y Fp(0)651 2438 y Fl(endif)957 2574 +y Fp(86)p eop +%%Page: 87 89 +87 88 bop 592 307 a Fl(endif)380 407 y Fh(P)6 b(A)444 413 y +Fe(col;sq)543 407 y Fp(:)37 b Fl(if)13 b Fp(\(\(P)o(a)o(wnA)o(ttac)o(k)h +Ff(2)d Fh(P)6 b(l)q(anT)g(y)q(pe)1125 413 y Fe(col)1184 407 +y Fl(and)13 b Fp(OnWing\()p Fh(P)6 b(l)q(anW)g(ing)1641 413 +y Fe(col)1684 407 y Fp(,sq\)\))592 457 y Fl(and)13 b Fp(P)o(a)o(wnLev)o +(er\(OnFile\(sq\),col\)\))651 506 y(40)h Ff(\000)g Fp(8)p Ff(\001)p +Fp(T)m(axicab\(Lev)o(erSq\(OnFile\(sq\),col\),sq\))592 556 +y Fl(else)651 606 y Fp(0)592 656 y Fl(endif)380 756 y Fh(P)6 +b(L)441 762 y Fe(col;sq)540 756 y Fp(:)40 b Fl(if)13 b Fp(\(Lev)o(erP)o(a)o +(wns)i Ff(2)c Fh(P)6 b(l)q(anT)g(y)q(pe)1103 762 y Fe(col)1161 +756 y Fl(and)14 b Fp(P)o(a)o(wnLev)o(er\(OnFile\(sq\),col\)\))651 +805 y(10)g Ff(\000)g Fp(2)p Ff(\001)p Fp(T)m(axicab\(Lev)o +(erSq\(OnFile\(sq\),col\),sq\))592 855 y Fl(else)651 905 y +Fp(0)592 955 y Fl(endif)262 1082 y Fp(A)f(general)h(table)g(of)f(v)n(alues)h +(for)f(pa)o(wn)h(o)q(ccupation)g(is)f(used.)19 b(Once)c(a)f(king)f(has)h(mo)o +(v)o(ed,)262 1131 y(the)19 b(pa)o(wns)f(near)i(the)f(king)f(are)h +(discouraged)g(from)e(mo)o(ving)f(as)j(this)f(w)o(ould)g(w)o(eak)o(en)262 +1181 y(the)g(pa)o(wn)f(shield)h(around)g(the)g(king.)29 b(Before)19 +b(the)f(king)f(\014rst)i(mo)o(v)o(es,)e(the)h(pa)o(wns)g(on)262 +1231 y(either)e(\015ank)f(are)h(discouraged)g(from)d(mo)o(ving)g(as)i(they)h +(are)g(lik)o(ely)e(to)h(form)f(the)i(future)262 1281 y(pa)o(wn)i(shield.)32 +b(As)19 b(the)g(game)e(progresses)k(these)f(restrictions)f(are)g(reduced,)i +(thereb)o(y)262 1331 y(encouraging)13 b(pa)o(wn)h(adv)n(ances.)k(Cen)o(tre)d +(pa)o(wns)f(are)h(free)f(from)e(suc)o(h)j(restrictions.)324 +1416 y(A)10 b(pa)o(wn)f(attac)o(k)h(plan)f(is)h(implem)o(en)o(ted)e(b)o(y)i +(encouraging)f(pa)o(wn)h(mo)o(v)o(es)e(up)i(the)h(b)q(oard)262 +1466 y(whic)o(h)h(w)o(ould)g(result)i(in)f(pa)o(wn)f(lev)o(erage.)18 +b(The)c(b)q(on)o(us)f(giv)o(en)f(dep)q(ends)j(on)e(ho)o(w)f(close)i(to)262 +1515 y(the)g(lev)o(er)g(square)h(the)f(pa)o(wn)g(is.)324 1601 +y(A)e(general)h(pa)o(wn)f(lev)o(er)h(plan)f(is)g(actioned)g(in)g(a)h(similar) +c(manor)i(to)i(the)g(pa)o(wn)f(attac)o(k)262 1651 y(plan)h(ab)q(o)o(v)o(e,)g +(except)i(the)g(b)q(on)o(uses)g(used)f(are)h(signi\014can)o(tly)e(lo)o(w)o +(er.)324 1736 y(Remem)o(b)q(er,)19 b(these)i(v)n(alues)e(are)h(for)f(p)q +(ossible)h(pa)o(wn)f(o)q(ccupation.)35 b(Ev)o(en)20 b(though)262 +1786 y(no)14 b(pa)o(wns)i(exist)f(on)g(the)h(\014le)f(these)h(v)n(alues)f(ma) +o(y)e(still)h(b)q(e)i(imp)q(ortan)o(t)d(b)q(ecause)k(a)e(pa)o(wn)262 +1835 y(ma)o(y)c(capture)k(on)o(to)e(the)h(said)f(\014le)h(during)f(the)h +(searc)o(h)h(and)e(should)g(therefore)i(incur)f(the)262 1885 +y(relev)n(an)o(t)f(b)q(on)o(us)i(or)e(p)q(enalt)o(y)m(.)957 +2574 y(87)p eop +%%Page: 88 90 +88 89 bop 262 307 a Fu(4.11.4)55 b(De\014nition)17 b(40)i(:)25 +b(Knigh)n(t)18 b(Square)g(T)-5 b(able)p 641 413 673 5 v 641 +1077 5 665 v 646 496 a Fg(0Z0Z0Z0Z)646 579 y(Z0Z0Z0Z0)646 662 +y(0Z0Z0Z0Z)646 745 y(Z0Z0Z0Z0)646 828 y(0Z0Z0Z0Z)646 911 y(Z0Z0Z0Z0)646 +994 y(0Z0Z0Z0Z)646 1077 y(Z0Z0Z0Z0)p 1310 1077 V 641 1081 673 +5 v 675 473 a Fl(2)59 b(3)f(4)h(4)g(4)f(4)h(3)g(2)675 556 y(3)g(4)f(6)h(6)g +(6)f(6)h(4)g(3)675 639 y(4)g(6)f(8)h(8)g(8)f(8)h(6)g(4)675 +722 y(4)g(6)f(8)h(10)35 b(10)f(8)59 b(6)g(4)675 805 y(4)g(6)f(8)h(10)35 +b(10)f(8)59 b(6)g(4)675 888 y(4)g(6)f(8)h(8)g(8)f(8)h(6)g(4)675 +971 y(3)g(4)f(6)h(6)g(6)f(6)h(4)g(3)675 1054 y(2)g(3)f(4)h(4)g(4)f(4)h(3)g(2) +466 1180 y Fp(Figure)14 b(4.11:)i(Initial)d(W)m(eigh)o(tings)f(for)i(Knigh)o +(t)f(Square)i(T)m(able.)344 1328 y Fh(N)5 b(S)r(T)433 1334 +y Fe(col;sq)534 1328 y Fp(:)46 b Fl(for)15 b(eac)o(h)h(square)d +Fp(sq)h Fl(do)651 1377 y Fh(N)5 b(S)r(T)740 1383 y Fe(col;sq)839 +1377 y Fp(=)11 b Fh(S)r(T)933 1383 y Fe(col;sq)1029 1377 y +Fp(+)f Fh(P)c(H)1139 1383 y Fe(col;sq)1233 1377 y Fp(+)j Fh(K)s(C)1342 +1383 y Fe(col;sq)592 1427 y Fl(endfor)344 1527 y(where)380 +1577 y Fh(S)r(T)431 1583 y Fe(col;sq)531 1577 y Fp(:)18 b(Static)c(w)o(eigh)o +(tings)f(as)h(de\014ned)h(in)f(\014gure)g(4.11.)380 1676 y +Fh(P)6 b(H)448 1682 y Fe(col;sq)546 1676 y Fp(:)34 b Fl(if)13 +b Fp(\(P)o(a)o(wnHole\(sq,Opp\(col\)\)\))651 1726 y(phase)592 +1776 y Fl(else)651 1826 y Fp(0)592 1876 y Fl(endif)380 1975 +y Fh(K)s(C)448 1981 y Fe(col;sq)547 1975 y Fp(:)33 b Ff(\000)p +Fp(T)m(axicab\(KingSq\(col\),sq\))13 b Ff(\000)h Fp(T)m +(axicab\(KingSq\(Opp\(col\)\),sq\))262 2102 y(Knigh)o(ts)h(are)h(encouraged)h +(to)e(b)q(e)h(on)g(squares)h(where)f(they)g(ha)o(v)o(e)g(as)g(man)o(y)d +(options)j(as)262 2152 y(p)q(ossible.)35 b(They)21 b(are)f(also)f(encouraged) +i(to)e(o)q(ccup)o(y)i(pa)o(wn)e(holes,)i(the)g(b)q(on)o(us)f(b)q(eing)262 +2202 y(dep)q(enden)o(t)f(on)e(the)h(game)e(phase.)30 b(Knigh)o(ts)17 +b(are)h(p)q(enalised)g(for)f(their)h(distance)g(from)262 2251 +y(eac)o(h)g(king.)28 b(This)18 b(encourages)h(a)f(knigh)o(t)f(to)g(main)o +(tain)e(a)j(p)q(osition)f(from)f(where)i(it)g(is)262 2301 y(p)q(oised)c(to)f +(attac)o(k)h(the)h(enem)o(y)e(king)g(or)h(protect)h(its)f(o)o(wn)f(king)g(as) +h(the)h(need)g(arises.)957 2574 y(88)p eop +%%Page: 89 91 +89 90 bop 262 307 a Fu(4.11.5)55 b(De\014nition)17 b(41)i(:)25 +b(Bishop)18 b(Square)g(T)-5 b(able)p 641 413 673 5 v 641 1077 +5 665 v 646 496 a Fg(0Z0Z0Z0Z)646 579 y(Z0Z0Z0Z0)646 662 y(0Z0Z0Z0Z)646 +745 y(Z0Z0Z0Z0)646 828 y(0Z0Z0Z0Z)646 911 y(Z0Z0Z0Z0)646 994 +y(0Z0Z0Z0Z)646 1077 y(Z0Z0Z0Z0)p 1310 1077 V 641 1081 673 5 +v 675 473 a Fl(0)59 b(2)f(2)h(2)g(2)f(2)h(2)g(0)675 556 y(2)g(8)f(8)h(8)g(8)f +(8)h(8)g(2)675 639 y(2)g(8)f(10)35 b(10)g(10)f(10)h(8)59 b(2)675 +722 y(2)g(8)f(10)35 b(12)g(12)f(10)h(8)59 b(2)675 805 y(2)g(8)f(10)35 +b(12)g(12)f(10)h(8)59 b(2)675 888 y(2)g(8)f(10)35 b(10)g(10)f(10)h(8)59 +b(2)675 971 y(2)g(8)f(8)h(8)g(8)f(8)h(8)g(2)675 1054 y(0)g(2)f(2)h(2)g(2)f(2) +h(2)g(0)466 1180 y Fp(Figure)14 b(4.12:)j(Initial)c(W)m(eigh)o(tings)f(for)i +(Bishop)g(Square)g(T)m(able.)344 1328 y Fh(B)r(S)r(T)428 1334 +y Fe(col;sq)529 1328 y Fp(:)51 b Fl(for)15 b(eac)o(h)h(square)d +Fp(sq)h Fl(do)651 1377 y Fh(B)r(S)r(T)735 1383 y Fe(col;sq)834 +1377 y Fp(=)e Fh(S)r(T)929 1383 y Fe(col;sq)1025 1377 y Fp(+)e +Fh(P)c(H)1135 1383 y Fe(col;sq)592 1427 y Fl(endfor)344 1527 +y(where)380 1577 y Fh(S)r(T)431 1583 y Fe(col;sq)531 1577 y +Fp(:)49 b(Static)14 b(w)o(eigh)o(tings)f(as)h(de\014ned)h(in)f(\014gure)g +(4.12.)380 1676 y Fh(P)6 b(H)448 1682 y Fe(col;sq)546 1676 +y Fp(:)34 b Fl(if)13 b Fp(\(P)o(a)o(wnHole\(sq,Opp\(col\)\)\))651 +1726 y(phase/2)592 1776 y Fl(else)651 1826 y Fp(0)592 1876 +y Fl(endif)262 2002 y Fp(Bishops)e(are)g(encouraged)h(to)f(k)o(eep)g(on)g +(long)f(diagonals)f(and)i(ha)o(v)o(e)g(p)q(o)o(w)o(er)g(in)f(as)h(man)o(y)e +(di-)262 2052 y(rections)i(as)g(p)q(ossible.)17 b(A)11 b(static)g(table)g +(pro)o(vides)g(appropriate)f(initial)f(b)q(on)o(uses.)18 b(Bishops)262 +2102 y(are)d(additionally)d(encouraged)k(to)f(o)q(ccup)o(y)h(pa)o(wn)e +(holes,)h(the)h(b)q(on)o(us)f(b)q(eing)g(dep)q(enden)o(t)262 +2152 y(on)e(the)i(game)d(phase.)957 2574 y(89)p eop +%%Page: 90 92 +90 91 bop 262 307 a Fu(4.11.6)55 b(De\014nition)17 b(42)i(:)25 +b(King)18 b(Square)g(T)-5 b(able)p 641 408 673 5 v 641 1072 +5 665 v 646 491 a Fg(0Z0Z0Z0Z)646 574 y(Z0Z0Z0Z0)646 657 y(0Z0Z0Z0Z)646 +740 y(Z0Z0Z0Z0)646 823 y(0Z0Z0Z0Z)646 906 y(Z0Z0Z0Z0)646 989 +y(0Z0Z0Z0Z)646 1072 y(Z0Z0Z0Z0)p 1310 1072 V 641 1076 673 5 +v 651 463 a Ff(\000)p Fl(2)27 b(+0)22 b Ff(\000)p Fl(4)k Ff(\000)p +Fl(8)h Ff(\000)p Fl(8)g Ff(\000)p Fl(4)f(+0)c Ff(\000)p Fl(2)651 +546 y Ff(\000)p Fl(2)27 b Ff(\000)p Fl(2)g Ff(\000)p Fl(6)f +Ff(\000)p Fl(8)h Ff(\000)p Fl(8)g Ff(\000)p Fl(6)f Ff(\000)p +Fl(2)h Ff(\000)p Fl(2)651 628 y Ff(\000)p Fl(16)s Ff(\000)p +Fl(16)s Ff(\000)p Fl(18)s Ff(\000)p Fl(20)s Ff(\000)p Fl(20)s +Ff(\000)p Fl(18)s Ff(\000)p Fl(16)s Ff(\000)p Fl(16)651 711 +y Ff(\000)p Fl(18)s Ff(\000)p Fl(18)s Ff(\000)p Fl(22)s Ff(\000)p +Fl(26)s Ff(\000)p Fl(26)s Ff(\000)p Fl(22)s Ff(\000)p Fl(18)s +Ff(\000)p Fl(18)651 794 y Ff(\000)p Fl(18)s Ff(\000)p Fl(18)s +Ff(\000)p Fl(22)s Ff(\000)p Fl(26)s Ff(\000)p Fl(26)s Ff(\000)p +Fl(22)s Ff(\000)p Fl(18)s Ff(\000)p Fl(18)651 877 y Ff(\000)p +Fl(16)s Ff(\000)p Fl(16)s Ff(\000)p Fl(18)s Ff(\000)p Fl(20)s +Ff(\000)p Fl(20)s Ff(\000)p Fl(18)s Ff(\000)p Fl(16)s Ff(\000)p +Fl(16)651 960 y Ff(\000)p Fl(2)g Ff(\000)p Fl(2)g Ff(\000)p +Fl(6)f Ff(\000)p Fl(8)h Ff(\000)p Fl(8)g Ff(\000)p Fl(6)f Ff(\000)p +Fl(2)h Ff(\000)p Fl(2)651 1043 y Ff(\000)p Fl(2)g(+0)22 b Ff(\000)p +Fl(4)k Ff(\000)p Fl(8)h Ff(\000)p Fl(8)g Ff(\000)p Fl(4)f(+0)c +Ff(\000)p Fl(2)485 1165 y Fp(Figure)14 b(4.13:)i(Initial)d(W)m(eigh)o(tings)f +(for)i(King)f(Square)i(T)m(able.)344 1303 y Fh(K)s(S)r(T)433 +1309 y Fe(col;sq)534 1303 y Fp(:)46 b Fl(for)15 b(eac)o(h)h(square)d +Fp(sq)h Fl(do)651 1353 y Fh(K)s(S)r(T)740 1359 y Fe(col;sq)839 +1353 y Fp(=)e Fh(S)r(T)934 1359 y Fe(col;sq)1030 1353 y Fp(+)d +Fh(K)s(E)1140 1359 y Fe(col;sq)1235 1353 y Ff(\000)h Fh(P)c(C)1340 +1359 y Fe(col;sq)592 1403 y Fl(endfor)344 1503 y(where)380 +1553 y Fh(S)r(T)431 1559 y Fe(col;sq)531 1553 y Fp(:)49 b(Static)14 +b(w)o(eigh)o(tings)f(as)h(de\014ned)h(in)f(\014gure)g(4.13.)380 +1652 y Fh(K)s(E)449 1658 y Fe(col;sq)548 1652 y Fp(:)32 b(\()p +Ff(\000)p Fh(S)r(T)691 1658 y Fe(col;sq)779 1652 y Fp(\))p +Ff(\001)13 b Fp(revPhase/8)380 1752 y Fh(P)6 b(C)443 1758 y +Fe(col;sq)541 1752 y Fp(:)39 b Fl(if)13 b Fp(\(EndgameKP)g +Ff(2)f Fh(P)6 b(l)q(anT)g(y)q(pe)1117 1758 y Fe(col)1161 1752 +y Fp(\))651 1802 y Fl(for)15 b(eac)o(h)h(square)d Fp(sq2)h +Fl(do)710 1851 y(if)f Fp(\(Occup)o(y\([P)o(a)o(wn],col,sq\)\))769 +1901 y Fl(if)g Fp(\(P)o(assed\(col,sq2\)\))828 1951 y(P)o(a)o(wnMass)i(=)f(P) +o(a)o(wnMass)g(+)g(4)g Ff(\001)f Fp(T)m(axicab\(sq,sq2\))828 +2001 y(P)o(a)o(wnMass)i(=)f(P)o(a)o(wnMass)g(+)g(T)m +(axicab\(sq,PSq\(col,sq2\)\))769 2051 y Fl(else)828 2100 y +Fp(P)o(a)o(wnMass)h(=)f(P)o(a)o(wnMass)g(+)g(T)m(axicab\(sq,sq2\))769 +2150 y Fl(endif)710 2200 y(else)769 2250 y(if)f Fp(\(Occup)o(y\([P)o(a)o +(wn],Opp\(col\),sq\)\))828 2300 y Fl(if)g Fp(\(P)o(assed\(Opp\(col\),sq2\)\)) +888 2350 y(P)o(a)o(wnMass)h(=)g(P)o(a)o(wnMass)g(+)g(4)g Ff(\001)f +Fp(T)m(axicab\(sq,sq2\))888 2399 y(P)o(a)o(wnMass)h(=)g(P)o(a)o(wnMass)g(+)g +(T)m(axicab\(sq,PSq\(col,sq2\)\))828 2449 y Fl(else)957 2574 +y Fp(90)p eop +%%Page: 91 93 +91 92 bop 888 307 a Fp(P)o(a)o(wnMass)14 b(=)g(P)o(a)o(wnMass)g(+)g(T)m +(axicab\(sq,sq2\))828 357 y Fl(endif)769 407 y(endif)710 457 +y(endif)651 506 y(endfor)651 556 y Fh(P)6 b(C)714 562 y Fe(col;sq)811 +556 y Fp(=)14 b(\(P)o(a)o(wnMass/)p Fh(])p Fp(P)o(a)o(wns)g +Ff(\000)p Fp(8\))g Ff(\001)f Fp(\(revPhase)p Ff(\000)p Fp(8\))592 +606 y Fl(else)651 656 y Fp(0)592 706 y Fl(endif)262 832 y Fp(A)o(t)h(the)h(b) +q(eginning)f(of)g(the)h(game)e(the)i(king)e(is)i(encouraged)g(to)f(seek)i(a)e +(safe)h(ha)o(v)o(en)f(near)262 882 y(one)j(of)g(the)h(corner)g(squares.)29 +b(As)18 b(the)g(game)e(progresses)j(the)f(king)e(is)h(encouraged)i(to)262 +932 y(pla)o(y)12 b(a)h(more)g(activ)o(e)g(role.)18 b(Ev)o(en)o(tually)m(,)12 +b(the)i(king)f(will)f(receiv)o(e)i(more)f(b)q(on)o(us)h(p)q(oin)o(ts)f(for) +262 982 y(b)q(eing)h(in)g(the)g(cen)o(tre)i(than)f(near)f(the)h(edge)g(of)f +(the)h(b)q(oard.)k(Ho)o(w)o(ev)o(er,)14 b(this)g(c)o(hange)h(will)262 +1032 y(b)q(e)f(gradual)f(as)h(it)g(is)f(related)i(to)e(the)i(game)d(phase.) +324 1117 y(When)k(in)g(the)h(endgame,)f(the)h(king)e(gets)i(b)q(on)o(uses)h +(for)e(main)o(taining)d(an)j(optim)o(um)262 1167 y(distance)e(from)e(all)h +(the)h(pa)o(wns)g(with)g(particular)g(emphasis)f(on)g(passed)i(pa)o(wns.)957 +2574 y(91)p eop +%%Page: 92 94 +92 93 bop 262 307 a Fu(4.11.7)55 b(De\014nition)17 b(43)i(:)25 +b(Square)18 b(Con)n(trol)h(T)-5 b(able)p 641 413 673 5 v 641 +1077 5 665 v 646 496 a Fg(0Z0Z0Z0Z)646 579 y(Z0Z0Z0Z0)646 662 +y(0Z0Z0Z0Z)646 745 y(Z0Z0Z0Z0)646 828 y(0Z0Z0Z0Z)646 911 y(Z0Z0Z0Z0)646 +994 y(0Z0Z0Z0Z)646 1077 y(Z0Z0Z0Z0)p 1310 1077 V 641 1081 673 +5 v 687 473 a Fl(2)58 b(2)h(2)g(2)f(2)h(2)g(2)f(2)687 556 y(2)g(2)h(2)g(2)f +(2)h(2)g(2)f(2)687 639 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f(2)687 +722 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f(2)687 805 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1) +687 888 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)687 971 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f +(1)687 1054 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)383 1180 y Fp(Figure)14 +b(4.14:)j(Initial)12 b(W)m(eigh)o(tings)h(for)g(White's)h(Square)g(Con)o +(trol)f(T)m(able.)p 641 1280 V 641 1944 5 665 v 646 1363 a +Fg(0Z0Z0Z0Z)646 1446 y(Z0Z0Z0Z0)646 1529 y(0Z0Z0Z0Z)646 1612 +y(Z0Z0Z0Z0)646 1695 y(0Z0Z0Z0Z)646 1778 y(Z0Z0Z0Z0)646 1861 +y(0Z0Z0Z0Z)646 1944 y(Z0Z0Z0Z0)p 1310 1944 V 641 1948 673 5 +v 687 1341 a Fl(1)58 b(1)h(1)g(1)f(1)h(1)g(1)f(1)687 1424 y(1)g(1)h(1)g(1)f +(1)h(1)g(1)f(1)687 1507 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)687 +1590 y(1)g(1)h(1)g(1)f(1)h(1)g(1)f(1)687 1673 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f +(2)687 1755 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f(2)687 1838 y(2)g(2)h(2)g(2)f(2)h(2) +g(2)f(2)687 1921 y(2)g(2)h(2)g(2)f(2)h(2)g(2)f(2)388 2048 y +Fp(Figure)14 b(4.15:)j(Initial)c(W)m(eigh)o(tings)f(for)i(Blac)o(k's)f +(Square)i(Con)o(trol)e(T)m(able.)344 2195 y Fh(S)369 2201 y +Fe(col;sq)469 2195 y Fp(:)111 b Fl(for)15 b(eac)o(h)h(square)d +Fp(sq)h Fl(do)651 2245 y Fh(S)676 2251 y Fe(col;sq)774 2245 +y Fp(=)e Fh(S)r(T)869 2251 y Fe(col;sq)965 2245 y Fp(+)d Fh(P)d(L)1067 +2251 y Fe(col;sq)592 2295 y Fl(endfor)344 2394 y(where)380 +2444 y Fh(S)r(T)431 2450 y Fe(col;sq)531 2444 y Fp(:)49 b(Static)14 +b(w)o(eigh)o(tings)f(indexed)i(b)o(y)e(colour)h(and)g(square,)g(see)h +(\014gures)957 2574 y(92)p eop +%%Page: 93 95 +93 94 bop 592 307 a Fp(4.14)13 b(and)h(4.15)380 407 y Fh(P)6 +b(L)441 413 y Fe(col;sq)540 407 y Fp(:)40 b Fl(if)13 b Fp(\(PieceA)o(ttac)o +(k)i Ff(2)f Fh(P)6 b(l)q(anT)g(y)q(pe)1107 413 y Fe(col)1165 +407 y Fl(and)13 b Fp(OnWing\()p Fh(P)6 b(l)q(anW)g(ing)1622 +413 y Fe(col)1665 407 y Fp(,sq\))592 457 y Fl(and)13 b Fp(Side\(sq\))i(=)f +(Opp\(col\)\))651 506 y(2)592 556 y Fl(else)651 606 y Fp(0)592 +656 y Fl(endif)262 783 y Fp(This)k(table)g(will)e(b)q(e)j(used)g(b)o(y)f(the) +h(ev)n(aluation)e(function)h(criterion,)h(Square)g(Con)o(trol,)262 +832 y(to)14 b(help)h(direct)g(attac)o(ks.)21 b(The)15 b(table)f(is)h +(initially)d(set)j(up)g(to)f(encourage)i(attac)o(ks)f(in)f(the)262 +882 y(enem)o(y)9 b(half)h(of)g(the)h(b)q(oard.)17 b(This)11 +b(is)f(further)i(mo)q(di\014ed)d(dep)q(ending)i(on)g(the)g(plan)f(selected) +262 932 y(to)j(further)i(encourage)g(attac)o(ks)f(on)g(the)g(planned)g(attac) +o(k)g(wing.)957 2574 y(93)p eop +%%Page: 94 96 +94 95 bop 262 307 a Fr(4.12)69 b(De\014nition)20 b(44)j(:)30 +b(T)-6 b(otal)21 b(Ev)l(aluation)h(F)-6 b(unction)452 382 y(V)g(alue)344 +487 y Fh(T)6 b(E)r(F)g(V)464 493 y Fe(col)522 487 y Fp(=)62 +b Fh(M)5 b(T)685 493 y Fe(col)738 487 y Fp(+)10 b Fh(M)5 b(B)856 +493 y Fe(col)909 487 y Fp(+)10 b Fh(D)q(V)1010 493 y Fe(col)1064 +487 y Fp(+)f Fh(C)s(C)1168 493 y Fe(col)1221 487 y Fp(+)g Fh(S)r(C)1319 +493 y Fe(col)1373 487 y Fp(+)g Fh(P)d(V)1471 493 y Fe(col)1529 +487 y Fp(+)616 537 y Fh(N)f(V)678 543 y Fe(col)731 537 y Fp(+)10 +b Fh(B)r(V)830 543 y Fe(col)884 537 y Fp(+)f Fh(RV)981 543 +y Fe(col)1034 537 y Fp(+)h Fh(QV)1133 543 y Fe(col)1186 537 +y Fp(+)g Fh(K)s(V)1290 543 y Fe(col)1343 537 y Fp(+)g Fh(P)c(N)1451 +543 y Fe(col)1504 537 y Fp(+)j Fh(AP)1603 543 y Fe(col)344 +637 y Fl(where)380 686 y Fh(M)c(T)449 692 y Fe(col)498 686 +y Fp(:)47 b Fl(Material)14 b(\(De\014niti)o(on)f(1\).)380 786 +y Fh(M)5 b(B)456 792 y Fe(col)498 786 y Fp(:)47 b Fl(Mobilit)o(y)13 +b(\(De\014niti)o(on)f(3\).)380 886 y Fh(D)q(V)439 892 y Fe(col)498 +886 y Fp(:)47 b Fl(Dev)o(elopmen)o(t)12 b(\(De\014niti)o(on)g(4\).)380 +985 y Fh(C)s(C)443 991 y Fe(col)498 985 y Fp(:)47 b Fl(Cen)o(tre)14 +b(Con)o(trol)g(\(De\014niti)o(on)f(5\).)380 1085 y Fh(S)r(C)437 +1091 y Fe(col)498 1085 y Fp(:)47 b Fl(Square)15 b(Con)o(trol)e +(\(De\014nition)f(6\).)380 1185 y Fh(P)6 b(V)437 1191 y Fe(col)498 +1185 y Fp(:)47 b Fl(P)o(a)o(wn)15 b(V)l(alue)g(\(De\014niti)o(on)d(12\).)380 +1284 y Fh(N)5 b(V)442 1290 y Fe(col)498 1284 y Fp(:)47 b Fl(Knigh)o(t)14 +b(V)l(alue)g(\(De\014nitio)o(n)f(13\).)380 1384 y Fh(B)r(V)437 +1390 y Fe(col)498 1384 y Fp(:)47 b Fl(Bishop)14 b(V)l(alue)h(\(De\014nit)o +(ion)d(20\).)380 1483 y Fh(RV)436 1489 y Fe(col)498 1483 y +Fp(:)47 b Fl(Ro)q(ok)16 b(V)l(alue)f(\(De\014niti)o(on)d(25\).)380 +1583 y Fh(QV)437 1589 y Fe(col)498 1583 y Fp(:)47 b Fl(Queen)14 +b(V)l(alue)h(\(De\014niti)o(on)e(28\).)380 1683 y Fh(K)s(V)442 +1689 y Fe(col)498 1683 y Fp(:)47 b Fl(King)15 b(V)l(alue)g(\(De\014niti)o(on) +d(34\).)380 1782 y Fh(P)6 b(N)446 1788 y Fe(col)498 1782 y +Fp(:)47 b Fl(Pinned)13 b(Pieces)i(\(De\014niti)o(on)d(35\).)380 +1882 y Fh(AP)438 1888 y Fe(col)498 1882 y Fp(:)47 b Fl(A)o(ttac)o(k)o(ed)14 +b(Pieces)h(\(De\014nit)o(ion)d(36\).)262 2009 y Fp(The)j(ev)n(aluation)f +(function)h(will)f(return)j(a)e(single)g(v)n(alue)g(for)g(the)h(p)q(osition.) +22 b(T)m(o)14 b(ac)o(hiev)o(e)262 2059 y(this,)d(all)g(the)h(ev)n(aluation)e +(criteria)i(m)o(ust)f(b)q(e)h(summed.)k(The)c(p)q(osition)f(v)n(alue)g(from)f +(either)262 2108 y(sides)k(p)q(oin)o(t)g(of)f(view)h(can)g(then)g(b)q(e)h +(easily)e(calculated,)h(e.g.:)344 2206 y Fh(V)368 2212 y Fe(W)t(hite)477 +2206 y Fp(=)e Fh(T)6 b(E)r(F)g(V)641 2212 y Fe(W)t(hite)747 +2206 y Ff(\000)k Fh(T)c(E)r(F)g(V)909 2212 y Fe(B)q(lack)324 +2324 y Fp(A)19 b(v)o(ery)g(imp)q(ortan)o(t)e(decision)i(is)g(when)g(to)g +(apply)f(the)i(ev)n(aluation)e(function)g(to)h(a)262 2374 y(p)q(osition.)k +(After)17 b(a)f(lot)f(of)h(delib)q(eration,)f(I)h(decided)h(the)g(ev)n +(aluation)e(function)g(will)g(b)q(e)262 2424 y(applied)e(at)h(leaf)f(no)q +(des)h(of)g(the)g(main)e(searc)o(h)j(in)f(all)e(cases)j(except:)957 +2574 y(94)p eop +%%Page: 95 97 +95 96 bop 324 307 a Ff(\017)20 b Fp(It)14 b(is)g(nev)o(er)h(applied)e(if)g +(one)h(side)h(is)e(in-c)o(hec)o(k.)324 390 y Ff(\017)20 b Fp(It)14 +b(is)f(not)g(applied)g(if)f(the)i(de\014cit)g(b)q(et)o(w)o(een)h +Fh(\013)e Fp(and)g(the)h(curren)o(t)h(material)c(v)n(alue)i(is)365 +440 y(larger)h(than)f(the)i(greatest)g(p)q(ositional)d(v)n(alue)h(so)h(far)f +(encoun)o(tered)j(in)d(the)h(searc)o(h.)262 558 y(The)h(\014rst)h(condition)e +(a)o(v)o(oids)h(application)e(to)i(p)q(ositions)g(whic)o(h)g(are)h(clearly)e +(not)h(quies-)262 608 y(cen)o(t.)24 b(The)16 b(second)h(condition)e(attempts) +g(to)h(only)f(apply)g(the)h(ev)n(aluation)e(function)i(to)262 +658 y(p)q(ositions)d(whic)o(h)h(ha)o(v)o(e)g(a)f(reasonable)h(c)o(hance)h(of) +f(a\013ecting)g(the)g(searc)o(h)h(result.)957 2574 y(95)p eop +%%Page: 96 98 +96 97 bop 262 654 a Fn(Chapter)34 b(5)262 897 y Fo(T)-10 b(ree)40 +b(Searc)m(hing)262 1148 y Fp(The)11 b(ev)n(aluation)e(function)i(con)o(tains) +f(criteria)i(to)e(assess)j(p)q(ositional)c(and)i(tactical)f(v)n(alues.)262 +1198 y(The)17 b(tactical)f(ev)n(aluation)f(is)i(ho)o(w)o(ev)o(er,)g(far)g +(from)e(complete)h(in)g(terms)g(of)h(deriving)f(an)262 1248 +y(accurate)g(tactical)f(v)n(alue.)23 b(The)16 b(tactical)f(part)g(of)g(the)h +(ev)n(aluation)e(function)i(therefore,)262 1298 y(only)11 b(attempts)h(to)g +(giv)o(e)g(a)g(rough)g(estimate)f(of)h(the)h(tactical)f(p)q(ossibilities.)17 +b(It)12 b(tak)o(es)h(par-)262 1347 y(ticular)h(accoun)o(t)h(of)f(uncertain)o +(ties)i(in)f(the)g(p)q(osition.)20 b(F)m(or)15 b(example,)e(a)h(p)q(osition)g +(where)262 1397 y(t)o(w)o(o)e(pieces)j(are)f(sim)o(ultaneously)d(en-prise)k +(w)o(ould)d(constitute)j(a)e(degree)h(of)f(uncertain)o(t)o(y)262 +1447 y(ab)q(out)g(the)i(true)g(v)n(alue)e(of)g(the)i(p)q(osition.)324 +1532 y(A)f(sw)o(ap)g(o\013)g(algorithm)d([37)o(])i(could)h(ha)o(v)o(e)g(b)q +(een)h(additionally)c(used)k(to)f(impro)o(v)o(e)e(the)262 1582 +y(accuracy)18 b(of)f(this)g(tactical)g(v)n(alue.)28 b(Ho)o(w)o(ev)o(er,)18 +b(this)f(w)o(ould)g(still)f(not)h(tak)o(e)g(accoun)o(t)h(of)262 +1632 y(pinned)13 b(pieces)i(or)f(exc)o(hanges)h(whic)o(h)e(exp)q(ose)i +(hidden)f(attac)o(ks)g(on)g(other)g(squares.)19 b(The)262 1682 +y(added)c(complexit)o(y)d(in)o(v)o(olv)o(ed)i(in)g(attempting)f(to)i(correct) +h(these)g(faults)e(w)o(ould)g(b)q(e)h(v)o(ery)262 1732 y(exp)q(ensiv)o(e)h +(in)f(terms)f(of)h(pro)q(cessing)h(time.)21 b(Therefore,)16 +b(I)f(feel)h(suc)o(h)g(analysis)e(is)h(b)q(etter)262 1781 y(left)f(to)h(a)g +(dynamic)e(searc)o(h.)23 b(Using)15 b(v)n(arious)f(additional)g(tree)i +(pruning)f(mec)o(hanisms,)e(I)262 1831 y(hop)q(e)h(to)g(sho)o(w)f(that)h +(this)g(searc)o(h)h(can)f(b)q(e)h(done)f(e\016cien)o(tly)m(.)324 +1916 y(Hence,)f(it)f(is)g(imp)q(ortan)o(t)e(to)i(supp)q(ort)h(the)g(ev)n +(aluation)e(function)h(b)o(y)g(the)g(tree)i(searc)o(h-)262 +1966 y(ing)20 b(of)g(p)q(ossibilities.)39 b(This)20 b(will)g(enable)h(the)h +(program)d(to)i(explore)g(p)q(ossible)g(mo)o(v)o(e)262 2016 +y(sequences)f(and)e(therefore)h(c)o(hose)g(mo)o(v)o(es)d(whic)o(h)i(lead)g +(to)g(fa)o(v)o(ourable)e(p)q(ositional)h(and)262 2066 y(tactical)c(outcomes.) +324 2151 y(In)e(this)h(c)o(hapter,)h(I)f(will)e(explain)h(what)g(searc)o +(hing)h(sc)o(hemes)h(will)d(b)q(e)i(used)h(and)e(ho)o(w)h(I)262 +2201 y(in)o(tend)g(to)g(complemen)o(t)e(the)j(ev)n(aluation)d(function)i(b)o +(y)g(the)h(use)g(of)f(a)g(quiescence)i(searc)o(h.)324 2286 +y(The)k(o)o(v)o(erall)f(searc)o(h)h(pro)q(cedure)i(is)e(as)f(follo)o(ws:)24 +b(The)19 b(main)c(searc)o(h)k(will)d(progress)262 2336 y(iterativ)o(ely)f(to) +i(deep)q(er)h(lev)o(els)e(of)g(the)h(searc)o(h)h(tree.)27 b(Selected,)18 +b(more)e(in)o(teresting)h(lines)262 2386 y(will)g(b)q(e)j(extended.)36 +b(A)o(t)19 b(the)h(leaf)f(no)q(des)h(of)f(this)g(main)e(searc)o(h)k(tree)f +(the)g(ev)n(aluation)262 2436 y(function)c(will)e(b)q(e)j(applied.)25 +b(The)17 b(ev)n(aluation)e(function)h(ma)o(y)e(then)j(advise)g(the)f(searc)o +(h)957 2574 y(96)p eop +%%Page: 97 99 +97 98 bop 262 307 a Fp(to)13 b(tak)o(e)h(one)g(of)g(t)o(w)o(o)f(p)q(ossible)h +(actions:)312 426 y(1.)20 b(The)15 b(p)q(osition)f(is)g(suitable)g(for)g(the) +h(quiescence)i(searc)o(h)e(to)f(b)q(e)h(applied.)k(A)14 b(quies-)365 +475 y(cence)f(searc)o(h)g(will)c(then)j(b)q(e)g(used)g(to)f(explore)g(an)o(y) +g(dynamic)e(tactical)i(p)q(ossibilities)365 525 y(whic)o(h)i(need)h +(resolving.)j(This)c(will)e(allo)o(w)h(a)g(more)g(accurate)i(tactical)f(v)n +(alue)f(to)h(b)q(e)365 575 y(deriv)o(ed)g(at)f(the)g(leaf)g(no)q(de)g(than)g +(the)h(v)n(alue)e(calculated)i(purely)f(in)f(the)i(ev)n(aluation)365 +625 y(function.)32 b(The)19 b(main)d(searc)o(h)j(can)g(therefore)h(ha)o(v)o +(e)e(higher)h(con\014dence)h(in)e(the)365 675 y(\014nal)c(leaf)f(no)q(de)h(v) +n(alue)f(calculated.)312 758 y(2.)20 b(The)14 b(p)q(osition)f(is)g +(considered)i(to)e(b)q(e)h(to)q(o)f(unstable)h(for)f(the)h(quiescence)h +(searc)o(h)g(to)365 808 y(b)q(e)j(applied)f(accurately)m(.)28 +b(This)17 b(means)g(the)h(main)d(searc)o(h)j(should)f(b)q(e)h(extended)365 +857 y(in)e(order)g(to)g(resolv)o(e)h(the)f(uncertain)o(t)o(y)m(.)24 +b(This)16 b('Quiescence)i(Decision')d(ma)o(y)f(also)365 907 +y(cause)i(the)f(main)e(searc)o(h)j(to)e(b)q(e)i(re{en)o(tered)h(from)c(no)q +(des)i(that)g(are)g(already)f(part)365 957 y(of)g(the)g(quiescence)i(searc)o +(h.)262 1075 y(The)e(results)i(obtained)e(from)e(searc)o(hing)j(eac)o(h)g(no) +q(de)f(is)h(then)g(passed)g(bac)o(k)f(up)g(the)h(tree)262 1125 +y(where)10 b(searc)o(h)h(heuristics)g(can)f(mak)o(e)e(use)i(of)f(the)h +(information)d(in)i(searc)o(hing)h(other)g(no)q(des.)262 1175 +y(It)16 b(is)h(imp)q(ortan)o(t)e(to)i(realise)g(the)g(searc)o(h)h(tree)g +(explored)f(b)o(y)g(suc)o(h)g(a)g(searc)o(h)h(will)d(b)q(e)i(of)262 +1225 y(v)n(ariable)10 b(depth,)i(the)g(deep)q(est)h(lines)e(b)q(eing)g(those) +h(of)f(most)f(in)o(terest)i(to)g(the)f(searc)o(h.)19 b(This)262 +1275 y(sho)o(ws)13 b(some)f(similarities)f(to)h(the)i(w)o(a)o(y)e(h)o(umans)g +(approac)o(h)h(the)h(task)f(of)f(tree)j(searc)o(hing.)324 1360 +y(The)f(follo)o(wing)d(sections)k(explain)e(this)h(searc)o(h)h(pro)q(cess)h +(in)e(more)f(detail.)262 1533 y Fr(5.1)69 b(Main)23 b(Searc)n(h)262 +1659 y Fp(The)14 b(main)e(searc)o(h)j(will)e(use)i(the)f(alpha{b)q(eta)g(\()p +Fh(\013\014)r Fp(\))g(tree)i(pruning)e(algorithm)d(on)j(nega-)262 +1709 y(max)i(trees.)32 b(This)18 b(algorithm)d(has)k(man)o(y)d(deriv)n(ativ)o +(es)i(and)g(enhancemen)o(ts,)h(some)e(of)262 1759 y(whic)o(h)c(w)o(ere)i +(explained)f(in)f(c)o(hapter)i(3.)324 1844 y(A)o(t)j(\014rst)i(sigh)o(t,)e +(the)i(principle)e(v)n(ariation)f Fh(\013\014)j Fp(searc)o(h)g(\(PVS\))f(app) +q(ears)h(to)e(b)q(e)h(the)262 1894 y(b)q(est)c(algorithm)c(to)i(select)j(as)e +(it)f(t)o(ypically)g(visits)g(few)o(er)i(no)q(des)g(than)e(other)i +Fh(\013\014)h Fp(deriv)n(a-)262 1943 y(tiv)o(es)h([40)o(].)28 +b(Ho)o(w)o(ev)o(er,)19 b(I)e(in)o(tend)g(to)h(use)g(searc)o(h)g(extensions)h +(whic)o(h)e(actually)g(use)h(the)262 1993 y(v)n(alues)11 b(of)h(the)g(curren) +o(t)i Fh(\013\014)g Fp(windo)o(w)d(as)h(part)h(of)e(their)h(searc)o(h)h +(extension)g(decision.)18 b(This)262 2043 y(breaks)13 b(one)h(of)f(the)g(ma)r +(jor)f(principles)h(of)g(the)h Fh(\013\014)h Fp(algorithm)c(:-)h(the)i(v)n +(alue)f(of)f(a)h(mo)o(v)o(e)f(is)262 2093 y(indep)q(enden)o(t)j(of)e(the)i +Fh(\013\014)h Fp(windo)o(w)d(used)i(to)e(searc)o(h)i(it.)324 +2178 y(The)h(PV)h(searc)o(h)g(uses)h(a)d(minimal)d(windo)o(w)k(as)g(its)g +(basis.)25 b(When)16 b(the)h(searc)o(h)g(of)f(a)262 2228 y(subtree)c(fails)d +(high)h(\(score)i Ff(\025)f Fh(\014)r Fp(\),)h(it)e(is)g(re-searc)o(hed)j +(using)d(a)g(suitably)g(adjusted)h(windo)o(w.)262 2278 y(When)16 +b(the)h(v)n(alue)f(is)g(not)h(dep)q(enden)o(t)h(on)e(the)h(windo)o(w)f(used,) +h(ev)o(erything)g(w)o(orks)g(\014ne.)262 2328 y(Ho)o(w)o(ev)o(er,)d(if)f(the) +h(v)n(alue)g(is)g(dep)q(enden)o(t,)h(a)f(situation)f(could)h(arise)h(where)g +(a)f(mo)o(v)o(e)e(found)262 2377 y(whic)o(h)h(fails)g(high,)g(is)g(re-searc)o +(hed)k(with)c(an)h(enlarged)g(windo)o(w,)e(only)i(to)f(fail)g(lo)o(w.)k(This) +262 2427 y(violates)g(the)h(PVS's)h(abilit)o(y)d(to)i(searc)o(h)h(minim)o(al) +14 b(trees)20 b(for)d(all)g(mo)o(v)o(es)g(except)i(those)957 +2574 y(97)p eop +%%Page: 98 100 +98 99 bop 262 307 a Fp(whic)o(h)12 b(constitute)h(a)f(new)g(principle)g(v)n +(ariation.)k(This)c(can)g(cause)i(serious)f(problems)e(not)262 +357 y(only)i(for)g(the)i(e\016ciency)f(of)g(the)g(PVS,)g(but)g(also)f(for)h +(its)g(correctness.)324 442 y(I)19 b(also)f(wish)i(to)f(use)h(the)g(curren)o +(t)g(searc)o(h)h(windo)o(w)d(as)h(part)h(of)e(a)h(decision)g(as)h(to)262 +492 y(whether)15 b(to)e(apply)g(the)h(ev)n(aluation)f(function)g(at)h(a)f +(giv)o(en)g(no)q(de)h(in)f(the)i(tree.)k(After)14 b(all,)262 +542 y(if)j(the)h(de\014cit)h(b)q(et)o(w)o(een)g(the)f(required)h(score)g(\()p +Ff(\025)g Fh(\013)p Fp(\))f(necessary)i(to)d(e\013ect)j(the)e(searc)o(h)262 +592 y(result)e(and)f(the)h(curren)o(t)g(material)e(v)n(alue)g(is)h(so)h +(large)f(that)g(ev)o(en)h(the)g(maxim)n(um)11 b(p)q(osi-)262 +641 y(tional)h(v)n(alue)i(cannot)g(alter)g Fh(\013)p Fp(,)f(then)i(it)e(w)o +(ould)h(constitute)h(w)o(asted)f(e\013ort)h(to)f(apply)f(the)262 +691 y(ev)n(aluation)f(function.)18 b(This)c(approac)o(h)f(could)h(also)f(adv) +o(ersely)i(a\013ect)g(the)f(PV)g(searc)o(h.)324 777 y(These)k(problems)e +(lead)g(me)g(to)g(prefer)i(an)f(aspiration)f Fh(\013\014)j +Fp(searc)o(h.)27 b(Although)17 b(this)262 826 y(searc)o(h)e(algorithm)c(ma)o +(y)h(still)i(giv)o(e)f(rise)i(to)f(some)f(of)h(the)g(problems)g(already)f +(explained,)262 876 y(they)i(will)e(b)q(e)j(to)f(a)f(far)h(lesser)h(exten)o +(t.)23 b(The)15 b(imp)q(ortan)o(t)e(asp)q(ect)j(ab)q(out)f(this)g(algorithm) +262 926 y(as)g(far)g(as)h(searc)o(h)h(extensions)f(are)g(concerned,)i(is)d +(that)h(the)g Fh(\013\014)i Fp(v)n(alues)d(of)g(the)h(curren)o(t)262 +976 y(windo)o(w)10 b(constitute)j(the)f(true)g(b)q(est)h(score)f(attained)g +(b)o(y)f(eac)o(h)h(side.)17 b(The)12 b(only)f(exception)262 +1026 y(b)q(eing)18 b(when)h(one)g(\(or)g(b)q(oth\))g(of)f(the)i(initial)c +(aspiration)i Fh(\013\014)j Fp(b)q(ounds)f(are)f(still)f(b)q(eing)262 +1075 y(used.)26 b(Ev)o(en)17 b(in)f(this)h(case)g(the)g(initial)e(aspiration) +g(windo)o(w)h(can)g(b)q(e)i(sa)o(v)o(ed)e(and)g(tak)o(en)262 +1125 y(in)o(to)d(accoun)o(t)h(b)o(y)g(the)g(searc)o(h)h(extension)g +(heuristics.)324 1210 y(In)j(the)h(past,)g(I)g(ha)o(v)o(e)f(observ)o(ed)h +(man)o(y)e(commercial)e(c)o(hess)20 b(programs)d(whic)o(h)i(un-)262 +1260 y(doubtedly)c(use)i(an)f(aspiration)f Fh(\013\014)j Fp(searc)o(h.)25 +b(I)16 b(ha)o(v)o(e)f(also)h(noticed)g(in)f(some)g(p)q(ositions,)262 +1310 y(a)e(particular)g(searc)o(h)h(to)f(depth)i Fh(n)e Fp(tak)o(es)h +(considerably)f(longer)g(than)h(exp)q(ected.)19 b(This)14 b(is)262 +1360 y(b)q(ecause)i(of)f(a)g(problem)f(whic)o(h)h(I)g(b)q(eliev)o(e)h(can)f +(b)q(e)h(solv)o(ed)f(b)o(y)g(an)g(enhancemen)o(t)h(to)f(the)262 +1410 y(aspiration)g Fh(\013\014)k Fp(algorithm.)j(The)17 b(problem)e(is)h(as) +g(follo)o(ws:)21 b(A)c(searc)o(h)g(to)f(depth)h Fh(n)11 b Ff(\000)g +Fp(1)262 1460 y(deriv)o(es)18 b(a)f(v)n(alue)g(for)g(the)i(b)q(est)f(mo)o(v)o +(e)e(found.)29 b(This)18 b(v)n(alue)f(then)h(forms)e(the)i(basis)g(b)o(y)262 +1509 y(whic)o(h)e(the)h(new)g Fh(\013\014)i Fp(windo)o(w)d(is)h(set)g(for)g +(the)g(next)g(iteration.)26 b(A)17 b(searc)o(h)g(to)g(the)g(next)262 +1559 y(iteration)12 b(is)h(then)h(p)q(erformed.)k(If)12 b(this)i(searc)o(h)g +(disco)o(v)o(ers)g(something)e(whic)o(h)h(refutes)i(its)262 +1609 y(previous)f(analysis)f(\(b)q(ecause)j(of)d(the)h(horizon)g(e\013ect\),) +h(eac)o(h)g(and)e(ev)o(ery)i(mo)o(v)o(e)d(ma)o(y)g(fail)262 +1659 y(lo)o(w)h(in)h(turn.)21 b(This)15 b(will)e(tak)o(e)i(some)f(time)f(to)h +(o)q(ccur)i(at)f(the)g(greater)h(iteration)e(depths.)262 1709 +y(After)d(all)f(this)i(rather)g(w)o(asted)g(e\013ort,)g(a)f(re-searc)o(h)i +(is)e(then)h(necessary)h(with)e(an)g(adjusted)262 1758 y Fh(\013\014)16 +b Fp(windo)o(w.)324 1844 y(I)g(ha)o(v)o(e)h(found)f(that)g(if)g(the)h +(principle)g(mo)o(v)o(e)e(fails)g(lo)o(w)h(when)h(searc)o(hed,)h(then)g(it)e +(is)262 1893 y(b)q(etter)j(to)e(abandon)h(the)g(curren)o(t)h +Fh(\013\014)h Fp(windo)o(w)d(immediately)l(,)f(adjust)h(it)h(and)f(restart) +262 1943 y(the)f(iteration.)25 b(I)17 b(b)q(eliev)o(e)f(this)h(to)f(b)q(e)h +(a)f(b)q(etter)i(approac)o(h)e(b)q(ecause)i(if)e(the)h(b)q(est)g(mo)o(v)o(e) +262 1993 y(is)d(refuted,)i(it)f(is)f(lik)o(ely)g(that)h(all)f(other)h(mo)o(v) +o(es)f(will)f(b)q(e)j(similarly)11 b(refuted)16 b(when)g(using)262 +2043 y(the)f(same)f(searc)o(h)i(windo)o(w.)k(Of)15 b(course)h(this)f(ma)o(y)e +(not)i(alw)o(a)o(ys)f(b)q(e)i(the)f(case,)h(ho)o(w)o(ev)o(er,)262 +2093 y(I)f(b)q(eliev)o(e)h(the)g(sa)o(vings)g(will)e(clearly)h(out)o(w)o +(eigh)g(an)o(y)h(time)e(lost)h(when)h(a)o(v)o(eraged)g(o)o(v)o(er)g(a)262 +2143 y(n)o(um)o(b)q(er)10 b(of)g(games.)16 b(In)11 b(summary)m(,)d(b)q(oth)j +(fail)e(lo)o(ws)i(and)f(fail)g(highs)g(are)i(treated)g(similarly)262 +2192 y(at)h(the)i(\014rst)f(ply)m(.)324 2278 y(T)m(o)c(summarise,)f(m)o(y)g +(c)o(hosen)i(main)e(searc)o(h)j(will)d(consist)i(of)f(an)h(iterativ)o(e,)g +(depth)g(\014rst,)262 2327 y(aspiration)k Fh(\013\014)k Fp(searc)o(h)e(with)f +(the)h(enhancemen)o(ts)g(outlined)f(ab)q(o)o(v)o(e.)25 b(The)17 +b Fh(\013\014)h Fp(windo)o(w)262 2377 y(will)d(b)q(e)i(based)h(around)f(the)g +(result)h(of)e(the)i(previous)f(iteration)g(at)f(depths)i Ff(\025)f +Fp(2.)27 b(The)262 2427 y(initial)11 b(iteration)j(windo)o(w)f(will)f(b)q(e)j +(based)f(on)g(a)g(preliminary)d(analysis.)957 2574 y(98)p eop +%%Page: 99 101 +99 100 bop 262 307 a Fr(5.2)69 b(Searc)n(h)23 b(Extensions)262 +434 y Fp(The)12 b(basic)g(approac)o(h)g(when)g(using)f(an)o(y)h(of)f(the)h +Fh(\013\014)j Fp(deriv)n(ativ)o(es)c(is)h(to)g(searc)o(h)h(to)e(a)h(depth)262 +483 y(n,)17 b(ev)n(aluate)f(the)i(leaf)e(no)q(des)i(and)f(minim)o(ax)d(the)j +(results.)28 b(This)17 b(metho)q(d)f(exempli\014es)262 533 +y(the)e(full)f(width)g(approac)o(h.)18 b(Ho)o(w)o(ev)o(er,)c(it)g(su\013ers)h +(from)d(a)i(n)o(um)o(b)q(er)f(of)g(w)o(eaknesses:)312 652 y(1.)20 +b(The)15 b(searc)o(h)g(is)e(terminated)h(at)g(a)f(\014xed)h(depth,)h +(therefore,)g(the)f(ev)n(aluation)f(func-)365 701 y(tion)h(ma)o(y)e(b)q(e)j +(applied)f(to)g(non)g(quiescen)o(t)i(p)q(ositions)e(leading)f(to)h(grossly)h +(inaccu-)365 751 y(rate)g(results.)312 834 y(2.)20 b(This)c(approac)o(h)g +(mak)o(es)e(ine\016cien)o(t)i(use)h(of)e(the)i Fh(\013\014)h +Fp(algorithm)13 b(b)q(ecause)k(its)f(leaf)365 884 y(no)q(des)f(are)f +(inaccurately)g(ev)n(aluated.)312 967 y(3.)20 b(Equal)14 b(e\013ort)g(is)g +(applied)f(throughout)h(the)g(tree)i(with)d(resp)q(ect)j(to)e(depth.)19 +b(There-)365 1017 y(fore,)c(stupid)g(unin)o(teresting)g(v)n(ariations)e(are)i +(explored)g(as)g(deeply)g(as)g(in)o(teresting)365 1067 y(or)f(go)q(o)q(d)g(v) +n(ariations.)312 1150 y(4.)20 b(The)15 b(horizon)e(e\013ect)j(is)e(sev)o +(erely)h(exasp)q(erated)g(b)o(y)f(the)g(\014xed)h(depth)f(searc)o(h.)262 +1268 y(The)e(\014rst)g(t)o(w)o(o)f(problem)g(areas)h(can)g(b)q(e)g +(signi\014can)o(tly)f(eased)i(b)o(y)e(the)h(use)h(of)e(a)g(quiescence)262 +1318 y(searc)o(h)j(at)f(the)h(leaf)f(\(horizon\))h(no)q(des)g(of)f(a)g(main)e +(searc)o(h.)20 b(This)13 b(quiescence)i(searc)o(h)g(will)262 +1368 y(b)q(e)i(a)f(form)f(of)h(selectiv)o(e)i(searc)o(h,)g(only)e(exploring)f +(tactical)i(p)q(ossibilities.)25 b(See)18 b(section)262 1418 +y(5.4)12 b(for)i(more)f(details.)324 1503 y(It)f(is)g(surprising)g(ho)o(w)f +(man)o(y)f(commercial)f(and)j(tournamen)o(t)f(c)o(hess)j(programs)c(su\013er) +262 1553 y(from)16 b(the)i(third)g(problem)e(area.)30 b(I)18 +b(b)q(eliev)o(e)g(the)g(solution)f(to)h(this)g(problem)e(lies)i(in)f(a)262 +1603 y(program's)8 b(abilit)o(y)h(to)h(select)i(and)e(searc)o(h)i(in)o +(teresting)f(or)f(go)q(o)q(d)g(v)n(ariations)g(more)f(deeply)m(.)324 +1688 y(Harris)j([26)o(])f(prop)q(osed)i(a)e(similar)e(idea)j(of)f(exploring)g +(in)o(teresting)h(v)n(ariations,)e(except)262 1738 y(he)i(suggested)i(doing)e +(so)g(without)g(the)h Fh(\013\014)i Fp(algorithm.)g(Harris)e(omitted)e(sp)q +(eci\014c)j(details)262 1787 y(of)i(ho)o(w)i(his)f(ideas)h(migh)o(t)d(b)q(e)k +(implem)o(en)o(ted.)27 b(Levy)18 b(et)g(al)f([38)o(])g(ha)o(v)o(e)h(implem)o +(en)o(ted)e(a)262 1837 y(n)o(um)o(b)q(er)e(of)g(programs)g(using)g(the)i +(idea)e(of)h(in)o(terestingness,)h(ho)o(w)o(ev)o(er,)f(their)h(approac)o(h) +262 1887 y(to)10 b(classifying)g(in)o(teresting)i(mo)o(v)o(es)e(di\013ers)i +(from)d(the)j(approac)o(h)f(I)g(am)e(taking.)17 b(In)11 b(partic-)262 +1937 y(ular,)h(m)o(y)g(use)i(of)f(the)h(aspiration)e Fh(\013\014)k +Fp(searc)o(h)e(and)g(its)f(b)q(ounds)h(in)f(m)o(y)e(searc)o(h)k(extension)262 +1987 y(heuristics)g(is)e(no)o(v)o(el.)324 2072 y(I)j(de\014ne)i(an)e(in)o +(teresting)h(v)n(ariation)e(as)i(one)f(whic)o(h)h(con)o(tains)f(tactical)g +(mo)o(v)o(es)g(that)262 2122 y(o\013er)c(some)f(p)q(ossibilit)o(y)g(of)g +(a\013ecting)h(the)h(searc)o(h)g(result,)g(e.g.)k(pro)q(ducing)12 +b(a)g(score)h(whic)o(h)262 2172 y(is)h(inside)h(the)h Fh(\013\014)h +Fp(searc)o(h)f(windo)o(w.)k(I)15 b(de\014ne)h(go)q(o)q(d)e(v)n(ariations)g +(as)h(those)h(whic)o(h)e(w)o(ould)262 2221 y(a\013ect)g(the)h(searc)o(h)g +(result)g(if)e(the)h(searc)o(h)h(w)o(ere)g(terminated)e(immediately)l(.)324 +2307 y(Applying)j(these)j(de\014nitions)f(to)f(create)i(searc)o(h)g +(extension)f(heuristics,)h(I)f(hop)q(e)g(to)262 2356 y(encourage)f(the)g +(searc)o(h)h(to)e(explore)h(v)n(ariations)f(o\013ering)g(some)g(lik)o(eliho)q +(o)q(d)f(of)h(success,)262 2406 y(and)c(ignore)h(unin)o(teresting)h(v)n +(ariations)d(whic)o(h)i(o\013er)h(little)e(or)h(no)g(lik)o(eliho)q(o)q(d)e +(of)i(success.)957 2574 y(99)p eop +%%Page: 100 102 +100 101 bop 262 307 a Fp(This)12 b(approac)o(h)g(sho)o(ws)h(some)f +(similarities)e(to)i(the)h(w)o(a)o(y)f(h)o(umans)f(pla)o(y)h(the)h(game.)j +(Ho)o(w-)262 357 y(ev)o(er,)j(b)q(ecause)h(these)f(heuristics)h(are)e(far)g +(less)g(sophisticated)h(than)f(a)g(strong)g(h)o(uman)262 407 +y(c)o(hess)f(pla)o(y)o(ers,)f(the)g(program)f(will)f(attempt)h(to)h(bridge)g +(this)g(gap)g(b)o(y)f(exploring)g(man)o(y)262 457 y(more)c(v)n(ariations)h +(than)h(its)f(h)o(uman)f(coun)o(ter)j(part.)k(These)c(searc)o(h)g(extension)f +(heuristics)262 506 y(m)o(ust)i(therefore)i(b)q(e)g(free)g(enough)f(to)g +(extend)h(man)o(y)d(in)o(teresting)j(v)n(ariations,)e(but)h(also)262 +556 y(b)q(e)d(selectiv)o(e)h(enough)e(to)h(a)o(v)o(oid)e(the)i(searc)o(h)h +(blo)o(wing)d(sky)i(high.)k(A)c(searc)o(h)h(whic)o(h)e(is)h(not)262 +606 y(depth)i(limited)e(and)i(can)h(explore)f(in)o(teresting)h(v)n(ariations) +e(deeply)m(,)h(is)g(m)o(uc)o(h)f(less)i(lik)o(ely)262 656 y(to)d(su\013er)i +(from)e(the)h(horizon)g(e\013ect)h(\(problem)e(area)h(4\).)324 +741 y(In)j(order)h(to)f(determine)g(what)g(is)g(an)g(in)o(teresting)h(or)f +(go)q(o)q(d)f(v)n(ariation,)g(mo)o(v)o(es)g(are)262 791 y(classi\014ed)d(and) +f(receiv)o(e)i('p)q(oin)o(ts')d(dep)q(ending)i(on)g(ho)o(w)f(dynamic)f(eac)o +(h)i(mo)o(v)o(e)e(is.)17 b(In)o(terest)262 841 y(p)q(oin)o(ts)d(are)i(passed) +g(do)o(wn)e(the)i(searc)o(h)g(tree)g(from)d(no)q(de)j(to)f(no)q(de.)21 +b(Eac)o(h)16 b(ply)e(of)g(searc)o(h)262 891 y(deducts)i(16)e(p)q(oin)o(ts)g +(w)o(orth)h(of)f(in)o(terest)i(from)c(the)k(v)n(ariation.)i(When)d(the)g(in)o +(terest)h(falls)262 940 y(b)q(elo)o(w)f(zero,)j(the)e(no)q(de)h(will)e(b)q(e) +h(considered)i(as)e(a)g(leaf)g(or)g(horizon)g(no)q(de)g(of)g(the)h(main)262 +990 y(searc)o(h.)33 b(A)o(t)18 b(this)h(p)q(oin)o(t)f(a)g(quiescence)j +(decision)e(is)f(made,)g(leading)g(to)g(a)g(quiescence)262 +1040 y(searc)o(h)d(or)e(con)o(tin)o(uation)g(of)h(the)g(main)e(searc)o(h.)324 +1125 y(All)e(in)o(teresting)h(mo)o(v)o(es)f(are)h(classi\014ed)h(under)g(t)o +(w)o(o)e(categories,)i(Threats)g(and)f(Threat)262 1175 y(Execution.)262 +1326 y Fu(5.2.1)55 b(Threats)262 1438 y Fp(F)m(or)18 b(threatening)i(mo)o(v)o +(es)e(to)i(b)q(e)g(considered)g(in)o(teresting)g(they)g(m)o(ust)e(indicate)h +(some)262 1488 y(lik)o(eliho)q(o)q(d)14 b(of)h(a\013ecting)h(the)h(searc)o(h) +g(result)g(and)f(therefore)h(b)q(ecoming)e(the)i(main)d(line.)262 +1538 y(Assuming)j(a)i(negamax)e(approac)o(h,)j(the)f(no)q(de)h(resulting)f +(from)e(a)i(threatening)g(mo)o(v)o(e)262 1588 y(m)o(ust)12 +b(meet)i(the)g(follo)o(wing)e(criteria:)344 1683 y(Est)j(+)f(Thres)h +Fh(>)d(\013)h Fl(or)h Fh(\013)f Fp(=)h(Aspir)p Fh(\013)262 +1783 y Fl(where)312 1904 y Fp(1.)20 b Fl(Est)p Fp(:)j(This)17 +b(is)f(an)g(estimate)g(of)g(the)h(curren)o(t)h(no)q(de's)f(v)n(alue,)f +(mostly)f(dominated)365 1954 y(b)o(y)f(material.)312 2036 y(2.)20 +b Fl(Thres)p Fp(:)c(Represen)o(ts)e(the)e(v)n(alue)f(of)g(ha)o(ving)g(the)h +(mo)o(v)o(e)e(\(a)i(temp)q(o\))e(and)i(what)g(that)365 2086 +y(mo)o(v)o(e)h(migh)o(t)e(ac)o(hiev)o(e.)312 2168 y(3.)20 b +Fh(\013)p Fp(:)f(This)c(is)f(the)h(curren)o(t)h(v)n(alue)e(of)g(alpha)f(at)i +(this)f(no)q(de,)h(whic)o(h)f(therefore)i(repre-)365 2218 y(sen)o(ts)e +(either)g(the)f(v)n(alue)f(of)g(the)h(b)q(est)h(v)n(ariation)c(found)j(for)f +(this)h(side)g(elsewhere)h(in)365 2267 y(the)h(searc)o(h)g(tree)g(or)f(an)f +(initial)f(aspiration)h(v)n(alue.)312 2350 y(4.)20 b Fl(Aspir)p +Fh(\013)p Fp(:)15 b(This)d(is)f(the)i(initial)d(aspiration)g(v)n(alue)i(used) +g(for)g(the)g(b)q(est)h(v)n(alue)e(ac)o(hiev-)365 2399 y(able)k(b)o(y)g(the)h +(curren)o(t)h(side)f(to)f(mo)o(v)o(e.)21 b(A)o(t)15 b(ev)o(en)h(depths)g(b)q +(elo)o(w)f(the)h(ro)q(ot,)f(this)h(is)365 2449 y(the)f(initial)d +Fh(\013)h Fp(v)n(alue;)g(at)h(o)q(dd)g(depths,)g(it)g(is)f(the)i(initial)d +Fh(\014)k Fp(v)n(alue.)946 2574 y(100)p eop +%%Page: 101 103 +101 102 bop 262 307 a Fp(The)11 b(idea)f(of)g(this)g(heuristic)i(is)e(to)h +(exclude)g(mo)o(v)o(es)e(whic)o(h)i(ma)o(y)d(otherwise)k(b)q(e)f(in)o +(teresting)262 357 y(if)e(they)i(are)g(unlik)o(ely)f(to)g(c)o(hange)h(the)g +(curren)o(t)i Fh(\013)d Fp(v)n(alue.)16 b(This)11 b(v)n(alue)f(after)g(all,)g +(represen)o(ts)262 407 y(the)g(score)i(of)e(the)g(b)q(est)i(v)n(ariation)c +(that)j(the)g(side)f(to)g(mo)o(v)o(e)f(can)h(ac)o(hiev)o(e.)17 +b(Of)11 b(course)g(if)f(this)262 457 y(score)15 b(happ)q(ens)g(to)g(b)q(e)g +(an)f(aspiration)g(v)n(alue,)f(then)i(the)g(score)h(of)d(the)i(b)q(est)h(v)n +(ariation)d(is)262 506 y(not)d(y)o(et)h(kno)o(wn,)f(it)g(w)o(ould)g +(therefore)i(b)q(e)f(un)o(wise)g(to)f(assume)g(that)h(the)g(curren)o(t)h(v)n +(ariation)262 556 y(cannot)i(a\013ect)g(the)h(searc)o(h)g(result.)324 +641 y(The)e(e\013ect)h(of)d(this)i(heuristic)g(is)f(to)g(a)o(v)o(oid)f +(extending)i(when)g(the)g(line)f(app)q(ears)h(fruit-)262 691 +y(less)j(relativ)o(e)g(to)f(what)h(can)g(b)q(e)h(ac)o(hiev)o(ed)f(elsewhere)h +(in)f(the)g(tree.)25 b(F)m(or)16 b(example,)e(it)i(is)262 741 +y(lik)o(ely)e(to)i(b)q(e)h(w)o(orthless)g(exploring)f(a)f(v)n(ariation)g +(whic)o(h)h(wins)g(a)g(pa)o(wn)g(after)g(thro)o(wing)262 791 +y(a)o(w)o(a)o(y)10 b(a)h(queen,)h(when)g(another,)g(b)q(etter)h(v)n(ariation) +c(is)j(already)f(kno)o(wn)f(to)i(b)q(e)g(ac)o(hiev)n(able.)324 +876 y(Giv)o(en)i(that)i(the)g(ab)q(o)o(v)o(e)f(criteria)g(are)h(met,)f(the)g +(follo)o(wing)e(threatening)j(mo)o(v)o(es)e(are)262 926 y(classi\014ed)e(and) +g(the)g(appropriate)g(in)o(terest)h(p)q(oin)o(ts)f(added)g(to)f(the)i(curren) +o(t)g(in)o(terest)g(v)n(alue)262 976 y(at)g(this)h(no)q(de.)312 +1093 y(1.)20 b Fl(In-c)o(hec)o(k)15 b(with)g(one)g(legal)f(reply)365 +1159 y Fp(This)c(heuristic)g(pro)o(vides)f(a)h(searc)o(h)g(extension)g(along) +f(v)n(ariations)f(whic)o(h)h(are)h(highly)365 1209 y(forced.)21 +b(Often)15 b(mating)d(sequences)17 b(in)o(v)o(olv)o(e)c(forced)i(c)o(hec)o +(ks)h(where)f(there)h(is)e(only)365 1258 y(one)g(legal)f(resp)q(onse.)20 +b Fm(R)n(e)n(c)n(eives)15 b(24)g(p)n(oints)g(of)g(inter)n(est)p +Fp(.)312 1341 y(2.)20 b Fl(Double)14 b(Chec)o(k)365 1407 y +Fp(This)k(heuristic)h(pro)o(vides)f(a)f(searc)o(h)j(extension)e(when)g(a)g +(side)g(is)g(in-c)o(hec)o(k)g(from)365 1456 y(more)12 b(than)h(one)h(piece.)k +(By)c(de\014nition)e(this)i(m)o(ust)e(additionally)e(b)q(e)k(a)f(disco)o(v)o +(ered)365 1506 y(c)o(hec)o(k.)24 b(Extensions)16 b(along)e(v)n(ariations)g +(in)o(v)o(olving)f(double)i(c)o(hec)o(k)i(are)e(imp)q(ortan)o(t)365 +1556 y(as)f(it)g(is)g(implicit)d(that)j(at)f(least)h(t)o(w)o(o)g(pieces)h +(are)f(co{op)q(erating)g(in)g(the)g(attac)o(k)g(on)365 1606 +y(the)h(king.)i Fm(R)n(e)n(c)n(eives)e(24)g(p)n(oints)g(of)g(inter)n(est.)312 +1688 y Fp(3.)20 b Fl(Disco)o(v)o(ered)13 b(Single)h(Chec)o(k)365 +1754 y Fp(This)k(heuristic)h(pro)o(vides)f(a)f(searc)o(h)j(extension)e(when)g +(a)g(side)g(is)g(in-c)o(hec)o(k)g(from)365 1804 y(a)f(disco)o(v)o(ered)g +(attac)o(k.)26 b(It)16 b(is)h(implicit)d(that)i(the)h(piece)h(mo)o(v)o(ed)d +(is)h(not)h(the)g(piece)365 1854 y(giving)g(c)o(hec)o(k.)31 +b(As)18 b(this)g(e\013ectiv)o(ely)h(giv)o(es)f(the)h(mo)o(ving)c(piece)k(a)e +(free)i(mo)o(v)o(e,)e(it)365 1904 y(is)e(v)o(ery)f(imp)q(ortan)o(t)f(to)h +(explore)h(suc)o(h)g(mo)o(v)o(es)e(throughly)m(.)19 b Fm(R)n(e)n(c)n(eives)c +(20)h(p)n(oints)g(of)365 1953 y(inter)n(est.)312 2036 y Fp(4.)k +Fl(In-c)o(hec)o(k)15 b(with)g(no)g(legal)g(king)f(reply)365 +2102 y Fp(This)f(heuristic)h(pro)o(vides)f(a)g(searc)o(h)h(extension)g(when)g +(a)e(side)i(is)f(in-c)o(hec)o(k)g(and)g(the)365 2151 y(king)e(has)g(no)g +(legal)f(escap)q(e)j(mo)o(v)o(es.)j(The)11 b(idea)g(b)q(eing)g(to)g(iden)o +(tify)f(p)q(ossible)i(mating)365 2201 y(nets.)19 b Fm(R)n(e)n(c)n(eives)c(20) +h(p)n(oints)f(of)f(inter)n(est.)312 2283 y Fp(5.)20 b Fl(In-c)o(hec)o(k)15 +b(with)g(more)g(than)g(one)g(legal)f(reply)365 2350 y Fp(This)i(heuristic)h +(is)e(common)e(to)j(a)f(n)o(um)o(b)q(er)h(of)f(top)g(programs,)g(Hitec)o(h)h +(included)365 2399 y([7].)j(Ho)o(w)o(ev)o(er,)c(m)o(y)d(program)h(is)i(more)e +(selectiv)o(e)j(b)q(ecause)g(this)f(heuristic)g(is)f(only)365 +2449 y(applied)k(where)i(the)f(searc)o(h)h(result)f(is)g(lik)o(ely)e(to)h(b)q +(e)h(a\013ected.)34 b(I)18 b(feel)h(this)f(is)h(a)946 2574 +y(101)p eop +%%Page: 102 104 +102 103 bop 365 307 a Fp(signi\014can)o(t)21 b(adv)n(an)o(tage)e(o)o(v)o(er)i +(its)g(otherwise)h(unrestricted)h(application.)37 b(It)21 b(is)365 +357 y(imp)q(ortan)o(t)14 b(to)i(explore)g(in)f(c)o(hec)o(k)i(v)n(ariations)d +(throughly)h(b)q(ecause)j(other)e(tactics)365 407 y(ma)o(y)c(\015o)o(w)i +(from)e(a)h(c)o(hec)o(k.)19 b Fm(R)n(e)n(c)n(eives)c(16)h(p)n(oints)f(of)f +(inter)n(est.)312 488 y Fp(6.)20 b Fl(P)o(a)o(wn)15 b(mo)o(v)o(es)g(to)h(the) +e(7th)h(Rank)365 553 y Fp(This)22 b(heuristic)g(encourages)h(exploration)e +(of)g(v)n(ariations)f(where)j(the)f(pa)o(wn)g(is)365 603 y(pushed)15 +b(near)g(to)e(promotion.)j Fm(R)n(e)n(c)n(eives)f(16)g(p)n(oints)g(of)g +(inter)n(est.)312 684 y Fp(7.)20 b Fl(P)o(a)o(wn)15 b(mo)o(v)o(es)g(to)h(the) +e(6th)h(Rank)365 749 y Fp(This)g(is)g(a)f(subset)j(of)d(the)h(ab)q(o)o(v)o(e) +g(heuristic)g(and)g(serv)o(es)i(to)d(increase)i(exploration)365 +799 y(of)e(p)q(ositions)g(where)i(passed)f(pa)o(wns)g(can)g(b)q(e)g(pushed,)g +(esp)q(ecially)g(in)f(or)g(near)h(the)365 849 y(endgame.)i +Fm(R)n(e)n(c)n(eives)e(r)n(evPhase)g(p)n(oints)g(of)g(inter)n(est.)312 +929 y Fp(8.)20 b Fl(Piece)15 b(Threats)365 995 y Fp(The)d(follo)o(wing)d +(searc)o(h)k(heuristics)g(are)f(concerned)i(with)d(threats)i(on)e(pieces)i +(of)e(the)365 1045 y(side)k(curren)o(tly)f(to)g(mo)o(v)o(e:)383 +1125 y(\(a\))21 b Fl(More)15 b(than)g(one)g(piece)g(is)g(en-prise)457 +1182 y Fm(R)n(e)n(c)n(eives)g(16)g(p)n(oints)g(of)g(inter)n(est.)381 +1247 y Fp(\(b\))21 b Fl(A)16 b(pinned)d(piece)h(whic)o(h)h(is)g(en-prise)457 +1304 y Fm(R)n(e)n(c)n(eives)g(16)g(p)n(oints)g(of)g(inter)n(est.)385 +1368 y Fp(\(c\))22 b Fl(A)16 b(trapp)q(ed)e(piece)g(whic)o(h)h(is)g(en-prise) +457 1425 y Fm(R)n(e)n(c)n(eives)g(16)g(p)n(oints)g(of)g(inter)n(est.)365 +1506 y Fp(These)22 b(heuristics)g(pro)o(vide)e(searc)o(h)h(extensions)h +(along)d(v)n(ariations)g(of)h(complex)365 1556 y(dynamic)c(p)q(ossibilities.) +30 b(The)18 b(quiescence)i(searc)o(h)f(will)d(resolv)o(e)i(suc)o(h)h(p)q +(ositions)365 1605 y(when)f(the)h(threatened)g(pla)o(y)o(er)e(is)h +Fl(not)e Fp(to)i(mo)o(v)o(e.)27 b(Hence)19 b(these)g(heuristics)g(are)365 +1655 y(only)d(applied)h(in)f(p)q(ositions)h(where)h(the)f(threatened)i(pla)o +(y)o(er)e(has)g(the)g(mo)o(v)o(e.)26 b(In)365 1705 y(this)11 +b(w)o(a)o(y)f(the)i(pla)o(y)o(er)e(m)o(ust)g(sho)o(w)h(the)g(existence)i(of)d +(an)g(adequate)i(defensiv)o(e)f(mo)o(v)o(e)365 1755 y(or)j(the)h(ensuing)f +(quiescence)i(searc)o(h)f(will)d(refute)j(the)g(v)n(ariation.)312 +1836 y(9.)20 b Fl(Mate)c(threat)e(against)h(the)g(side)f(to)h(mo)o(v)o(e)365 +1901 y Fp(This)10 b(heuristic)g(pro)o(vides)g(a)g(searc)o(h)g(extension)h +(when)f(mate)e(is)i(directly)g(threatened)365 1951 y(against)i(the)i(side)f +(to)f(mo)o(v)o(e.)k(This)d(will)e(force)j(exploration)d(of)i(v)n(ariations)e +(to)i(sho)o(w)365 2001 y(whether)18 b(the)e(mate)f(threat)i(can)f(b)q(e)g +(defended)h(against.)24 b Fm(R)n(e)n(c)n(eives)17 b(24)g(p)n(oints)g(of)365 +2051 y(inter)n(est.)262 2165 y Fp(Searc)o(h)c(heuristics)h(8a,)e(8b,)h(8c)g +(and)f(9)h(are)g(only)f(applied)g(during)h(the)g(quiescence)i(searc)o(h)262 +2214 y(after)k(a)g(full)g(p)q(ositional)f(ev)n(aluation.)33 +b(An)o(y)19 b(of)g(the)h(heuristics)h(1)e(through)g(6)g(can)h(b)q(e)262 +2264 y(applied)14 b(in)g(either)i(the)g(main)c(or)j(quiescence)i(searc)o +(hes.)23 b(More)16 b(details)f(ab)q(out)f(this)h(can)262 2314 +y(b)q(e)f(found)f(in)h(sections)h(5.3)e(and)g(5.4.)18 b(Heuristics)d(1)e(to)h +(5)g(are)g(m)o(utually)d(exclusiv)o(e.)324 2399 y(Eac)o(h)h(ply)f(of)g(searc) +o(h)i(consumes)f(16)g(in)o(terest)h(p)q(oin)o(ts.)k(It)12 b(can)g(therefore)h +(b)q(e)f(seen)i(that)262 2449 y(some)j(heuristics)j(whic)o(h)e(equal)g(or)h +(exceed)h(an)e(in)o(terest)i(v)n(alue)e(of)g(16)g(ma)o(y)e(in)i(theory)946 +2574 y(102)p eop +%%Page: 103 105 +103 104 bop 262 307 a Fp(cause)15 b(the)f(searc)o(h)h(to)f(b)q(e)h(un)o(b)q +(ounded.)j(Ho)o(w)o(ev)o(er,)c(in)g(practice)h(this)f(should)g(not)f(b)q(e)i +(the)262 357 y(case)f(as:)324 464 y Ff(\017)20 b Fp(It)14 b(is)g(rare)h(to)e +(get)h(out)g(of)g(c)o(hec)o(k)g(with)g(a)g(c)o(hec)o(k)g(mo)o(v)o(e)f +(itself.)324 541 y Ff(\017)20 b Fp(Heuristics)15 b(8a,)d(8b,)h(8c)g(and)g(9)g +(are)g(only)g(applied)f(once)i(or)f(t)o(wice)h(do)o(wn)e(an)o(y)h(giv)o(en) +365 591 y(v)n(ariation.)324 669 y Ff(\017)20 b Fp(Heuristics)15 +b(6)f(and)g(7)f(are)i(self)f(limiti)o(ng)d(as)j(a)g(pa)o(wn)f(can)h(only)f +(mo)o(v)o(e)g(forw)o(ard.)262 776 y(F)m(or)19 b(added)i(protection)g(against) +e(an)h(un)o(b)q(ounded)h(searc)o(h,)h(all)d(no)q(des)i(visited)f(in)g(the)262 +826 y(main)9 b(searc)o(h)14 b(whic)o(h)e(are)g(deep)q(er)i(than)e(t)o(wice)g +(the)h(iteration)e(depth,)i(ha)o(v)o(e)f(their)g(in)o(terest)262 +875 y(v)n(alue)e(decreased)k(b)o(y)d(the)h(amoun)o(t)e(whic)o(h)h(the)h +(curren)o(t)h(ply)e(exceeds)i(t)o(wice)f(the)g(iteration)262 +925 y(depth.)262 1074 y Fu(5.2.2)55 b(Threat)18 b(Execution)262 +1186 y Fp(The)d(execution)h(of)f(a)g(previous)h(threat)g(is)f(only)f(in)o +(teresting)i(if)e(at)i(the)g(curren)o(t)g(no)q(de)g(it)262 +1236 y(lo)q(oks)d(lik)o(ely)f(to)i(a\013ect)h(the)f(searc)o(h)h(result.)324 +1322 y(F)m(or)20 b(an)o(y)g(mo)o(v)o(e)e(whic)o(h)i(constitutes)i(the)f +(execution)g(of)f(a)g(threat,)i(the)f(follo)o(wing)262 1371 +y(criteria)14 b(m)o(ust)f(b)q(e)h(meet)g(for)f(the)i(mo)o(v)o(e)d(to)i(b)q(e) +g(further)h(considered)g(as)f(in)o(teresting:)344 1457 y(Est)h +Ff(\000)f Fp(Thres)h Fh(<)d(\014)k Fl(or)e Fh(\014)i Fp(=)e(Aspir)p +Fh(\014)262 1557 y Fl(where)312 1656 y Fp(1.)20 b Fl(Est)p +Fp(:)j(This)17 b(is)f(an)g(estimate)g(of)g(the)h(curren)o(t)h(no)q(de's)f(v)n +(alue,)f(mostly)f(dominated)365 1706 y(b)o(y)f(material)e(v)n(alues.)312 +1783 y(2.)20 b Fl(Thres)p Fp(:)c(Represen)o(ts)e(the)e(v)n(alue)f(of)g(ha)o +(ving)g(the)h(mo)o(v)o(e)e(\(a)i(temp)q(o\))e(and)i(what)g(that)365 +1833 y(mo)o(v)o(e)h(migh)o(t)e(ac)o(hiev)o(e.)312 1910 y(3.)20 +b Fh(\014)r Fp(:)d(This)10 b(is)g(the)h(curren)o(t)h(v)n(alue)d(of)h(b)q(eta) +g(at)g(this)g(no)q(de,)h(whic)o(h)f(therefore)i(represen)o(ts)365 +1960 y(either)k(the)g(v)n(alue)e(of)h(the)g(b)q(est)h(v)n(ariation)e(found)g +(for)h(this)g(side)g(elsewhere)i(in)e(the)365 2010 y(searc)o(h)g(tree)g(or)f +(an)g(initial)e(aspiration)h(v)n(alue.)312 2087 y(4.)20 b Fl(Aspir)p +Fh(\014)r Fp(:)c(This)c(is)g(the)g(initial)e(aspiration)h(v)n(alue)g(used)i +(for)e(the)i(b)q(est)g(v)n(alue)e(ac)o(hiev-)365 2137 y(able)k(b)o(y)f(the)h +(side)g Fl(not)f Fp(to)g(mo)o(v)o(e.)19 b(A)o(t)c(ev)o(en)g(depths)h(b)q(elo) +o(w)e(the)h(ro)q(ot,)g(this)f(is)h(the)365 2187 y(initial)d +Fh(\014)17 b Fp(v)n(alue;)12 b(at)i(o)q(dd)g(depths,)h(it)e(is)h(the)g +(initial)e Fh(\013)i Fp(v)n(alue.)262 2300 y(This)20 b(heuristic)h(is)f +(almost)f(an)h(exact)h(mirror)e(image)f(of)i(the)h(one)g(used)g(for)f +(threats.)262 2350 y(Giv)o(en)e(that)h(the)h(ab)q(o)o(v)o(e)f(criteria)g(are) +h(met,)f(the)h(follo)o(wing)c(threat)k(execution)g(mo)o(v)o(es)262 +2399 y(are)13 b(classi\014ed)g(and)g(their)g(appropriate)g(in)o(terest)g(p)q +(oin)o(ts)g(added)g(to)g(the)g(curren)o(t)h(in)o(terest)262 +2449 y(v)n(alue)f(at)g(this)h(no)q(de.)946 2574 y(103)p eop +%%Page: 104 106 +104 105 bop 312 307 a Fp(1.)20 b Fl(Capture)365 374 y Fp(This)h(heuristic)h +(encourages)g(exploration)e(of)g(in)o(teresting)i(capture)g(sequences.)365 +423 y(P)o(articularly)c(where)h(greater)g(v)n(alued)e(pieces)j(are)e(in)o(v)o +(olv)o(ed.)30 b Fm(R)n(e)n(c)n(eives)18 b(inter)n(est)365 473 +y(p)n(oints)d(dep)n(ending)h(on)f(the)f(typ)n(e)h(of)g(pie)n(c)n(e)f(c)n +(aptur)n(e)n(d,)g(wher)n(e)g(p)n(awn)h(=)f(1;)h(knight)g(=)365 +523 y(2;)g(bishop)g(=)g(3;)g(r)n(o)n(ok)g(=)f(4)h(and)h(que)n(en)g(=)e(5.)312 +606 y Fp(2.)20 b Fl(P)o(a)o(wn)15 b(Promotion)365 672 y Fp(This)d(heuristic)g +(also)f(encourages)i(exploration)d(of)h(v)n(ariations)f(whic)o(h)i(are)g(in)o +(terest-)365 722 y(ing.)20 b(Assuming)13 b(the)i(promoted)f(pa)o(wn)g(cannot) +h(b)q(e)g(captured,)h(the)f(mo)o(v)o(e)e(is)h(v)o(ery)365 772 +y(lik)o(ely)k(to)h(b)q(e)h(go)q(o)q(d)f(and)g(therefore)h(in)o(teresting.)35 +b(If,)19 b(ho)o(w)o(ev)o(er,)i(the)f(promoted)365 822 y(pa)o(wn)13 +b(can)h(b)q(e)g(captured,)g(the)g(opp)q(onen)o(ts)h(options)e(ha)o(v)o(e)g(a) +g(degree)i(of)e(forcedness)365 872 y(ab)q(out)k(them)f(whic)o(h)h(therefore,) +h(also)e(mak)o(es)g(this)h(mo)o(v)o(e)e(in)o(teresting.)28 +b Fm(R)n(e)n(c)n(eives)365 922 y(inter)n(est)13 b(p)n(oints)g(dep)n(ending)i +(on)f(the)f(typ)n(e)h(of)f(pie)n(c)n(e)h(pr)n(omote)n(d)f(to,)g(wher)n(e)g +(knight)h(=)365 971 y(1;)h(bishop)g(=)g(2;)g(r)n(o)n(ok)g(=)f(3)h(and)h(que)n +(en)g(=)e(4.)312 1054 y Fp(3.)20 b Fl(Recapture)365 1121 y +Fp(This)12 b(heuristic)g(is)f(used)i(in)e(Hitec)o(h)h([7)o(].)17 +b(I)12 b(feel)f(it)g(is)h(of)f(great)h(b)q(ene\014t)g(in)g(that)f(it)g(en-) +365 1171 y(courages)j(not)e(only)g(exploration)g(of)g(simple)f(exc)o(hanges,) +j(but)f(also)f(captures)i(with)365 1220 y(p)q(ositional)h(con)o(ten)o(t)i +(e.g.)25 b(a)16 b(ro)q(ok)g(exc)o(hanged)h(for)f(knigh)o(t)f(and)h(p)q +(ositional)f(com-)365 1270 y(p)q(ensation.)k(This)14 b(heuristic)h(is)f(only) +f(applied)28 b(if:)17 b Ff(j)p Fh(LastS)r(ear)q(chV)11 b(al)q(ue)e +Ff(\000)h Fh(E)r(st)p Ff(j)h(\024)365 1320 y Fp(25)18 b(and)h(the)g(last)g(2) +f(mo)o(v)o(es)f(pla)o(y)o(ed)h(w)o(ere)i(captures.)66 b Fm(R)n(e)n(c)n(eives) +20 b(16)f(p)n(oints)h(of)365 1370 y(inter)n(est.)312 1453 y +Fp(4.)g Fl(Mate)c(Threat)f(against)f(the)h(side)g(not)g(to)g(mo)o(v)o(e)365 +1519 y Fp(This)20 b(heuristic)g(is)g(only)f(applied)g(during)g(the)i +(quiescence)h(searc)o(h)e(after)g(a)g(full)365 1569 y(p)q(osition)15 +b(ev)n(aluation.)20 b(It)15 b(is)g(extremely)g(useful)g(for)g(a)o(v)o(oiding) +e(early)i(termination)365 1619 y(of)e(the)h(searc)o(h)h(in)d(p)q(ossible)i +(mating)d(sequences.)21 b Fm(R)n(e)n(c)n(eives)14 b(16)h(p)n(oints)f(of)h +(inter)n(est.)262 1737 y Fp(It)g(should)h(b)q(e)g(noticed)g(that)f(some)g(of) +g(m)o(y)f(de\014nitions)i(of)f(in)o(terestingness)i(attempt)e(to)262 +1787 y(measure)c(the)i(forcedness)g(of)f(mo)o(v)o(es)e(and)i(replies.)18 +b(In)12 b(this)g(w)o(a)o(y)f(I)g(hop)q(e)i(to)e(ac)o(hiev)o(e)h(some)262 +1837 y(of)k(the)i(b)q(ene\014ts)i(found)d(b)o(y)g(F)m(eng-hsiung)g(Hsu)h(and) +f(his)h(team)e(in)h(their)h(recen)o(t)h(pap)q(er)262 1887 y("Singular)12 +b(Extensions:)19 b(Adding)13 b(Selectivit)o(y)h(to)g(Brute-F)m(orce)i(Searc)o +(hing")d([3].)324 1972 y(Unlik)o(e)g(singular)g(extensions)i(m)o(y)d(approac) +o(h)h(attempts)g(to)h(classify)f(forcedness)j(in)d(a)262 2022 +y(more)e(static)i(w)o(a)o(y)f(in)g(order)h(to)f(a)o(v)o(oid)f(exp)q(ensiv)o +(e)j(test)f(depth)g(searc)o(hes.)20 b(Therefore,)14 b(this)262 +2072 y(approac)o(h)j(do)q(es)i(su\013er)g(the)f(dra)o(wbac)o(k)g(that)g +(dynamic)e(non)h(static)h(forced)h(v)n(ariations)262 2122 y(are)c(not)g +(extended.)22 b(This)15 b(is)g(essen)o(tially)g(the)g(trade)h(o\013)f(b)q(et) +o(w)o(een)h(static)g(and)e(dynamic)262 2171 y(searc)o(h)20 +b(extensions.)35 b(Ho)o(w)o(ev)o(er,)21 b(I)e(ha)o(v)o(e)g(managed)f(to)h +(incorp)q(orate)h(dynamic)d(searc)o(h)262 2221 y(information)7 +b(in)o(to)i(the)i(searc)o(h)g(heuristics)g(without)e(added)i(cost.)17 +b(This)10 b(allo)o(ws)f(the)h(searc)o(h)262 2271 y(heuristics)21 +b(to)g(b)q(e)g(quite)f(selectiv)o(e)i(ab)q(out)e(whic)o(h)h(v)n(ariations)e +(are)i(w)o(orth)g(extending.)262 2321 y(Additionally)m(,)9 +b(some)j(of)f(m)o(y)g(searc)o(h)i(extension)g(heuristics)h(can)e(extend)i +(non{forced)e(but)262 2371 y(still)g(in)o(teresting)j(v)n(ariations.)i(I)c +(see)j(this)e(as)g(an)f(adv)n(an)o(tage)g(o)o(v)o(er)h(singular)f +(extensions.)946 2574 y(104)p eop +%%Page: 105 107 +105 106 bop 324 307 a Fp(T)m(o)12 b(illustrate)i(ho)o(w)f(these)i(extension)f +(heuristics)g(are)g(able)f(to)h(iden)o(tify)e(deep)j(com)o(bi-)262 +357 y(nations,)e(I)g(will)g(apply)g(them)g(to)h(the)g(p)q(osition)f(sho)o(wn) +h(in)g(\014gure)g(5.1.)p 641 451 673 5 v 641 1115 5 665 v 646 +534 a Fg(0ZqsrZnZ)646 617 y(Z0ZbZko0)646 700 y(0ZpApm0o)646 +783 y(ZpZ0OPZ0)646 866 y(pZ0O0Z0Z)646 949 y(ZBO0Z0Z0)646 1032 +y(PZ0ZQZPO)646 1115 y(Z0Z0SRJ0)p 1310 1115 V 641 1119 673 5 +v 594 1253 a Fp(Figure)g(5.1:)j(White)d(to)g(pla)o(y)f(and)h(mate)e(in)i(10.) +p 295 1327 1365 2 v 294 1377 2 50 v 320 1362 a Fm(Ply)p 403 +1377 V 50 w(Inter)n(est)p 590 1377 V 49 w(Move)p 790 1377 V +104 w(A)n(djust)g(Ply)p 1029 1377 V 50 w(Extension)i(typ)n(e)p +1344 1377 V 50 w(Inter)n(est)e(Bonus)p 1659 1377 V 295 1378 +1365 2 v 294 1428 2 50 v 339 1413 a Fp(1)p 403 1428 V 117 w(96)p +590 1428 V 97 w(Qh5+)p 790 1428 V 150 w Ff(\000)p Fp(16)p 1029 +1428 V 214 w(T4)p 1344 1428 V 253 w(+20)p 1659 1428 V 295 1430 +1365 2 v 294 1479 2 50 v 339 1465 a(2)p 403 1479 V 106 w(100)p +590 1479 V 87 w(...)j(Nxh5)p 790 1479 V 108 w Ff(\000)p Fp(16)p +1029 1479 V 200 w(TE1)p 1344 1479 V 249 w(+5)p 1659 1479 V +295 1481 1365 2 v 294 1531 2 50 v 339 1516 a(3)p 403 1531 V +117 w(89)p 590 1531 V 97 w(fxe6+)p 790 1531 V 152 w Ff(\000)p +Fp(16)p 1029 1531 V 159 w(T2+TE1)p 1344 1531 V 170 w(+24+1)p +1659 1531 V 295 1533 1365 2 v 294 1582 2 50 v 339 1567 a(4)p +403 1582 V 117 w(98)p 590 1582 V 97 w(...)g(Kg6)p 790 1582 +V 131 w Ff(\000)p Fp(16)p 1029 1582 V 233 w(-)p 1344 1582 V +297 w(0)p 1659 1582 V 295 1584 1365 2 v 294 1634 2 50 v 339 +1619 a(5)p 403 1634 V 117 w(82)p 590 1634 V 97 w(Bc2+)p 790 +1634 V 158 w Ff(\000)p Fp(16)p 1029 1634 V 214 w(T1)p 1344 +1634 V 253 w(+24)p 1659 1634 V 295 1636 1365 2 v 294 1685 2 +50 v 339 1670 a(6)p 403 1685 V 117 w(90)p 590 1685 V 97 w(...)g(Kg5)p +790 1685 V 131 w Ff(\000)p Fp(16)p 1029 1685 V 233 w(-)p 1344 +1685 V 297 w(0)p 1659 1685 V 295 1687 1365 2 v 294 1737 2 50 +v 339 1722 a(7)p 403 1737 V 117 w(74)p 590 1737 V 97 w(Rf5+)p +790 1737 V 161 w Ff(\000)p Fp(16)p 1029 1737 V 214 w(T5)p 1344 +1737 V 253 w(+16)p 1659 1737 V 295 1739 1365 2 v 294 1788 2 +50 v 339 1773 a(8)p 403 1788 V 117 w(74)p 590 1788 V 97 w(...)g(Kg6)p +790 1788 V 131 w Ff(\000)p Fp(16)p 1029 1788 V 233 w(-)p 1344 +1788 V 297 w(0)p 1659 1788 V 295 1790 1365 2 v 294 1840 2 50 +v 339 1825 a(9)p 403 1840 V 117 w(58)p 590 1840 V 97 w(Rf6+)p +790 1840 V 161 w Ff(\000)p Fp(16)p 1029 1840 V 214 w(T2)p 1344 +1840 V 253 w(+24)p 1659 1840 V 295 1841 1365 2 v 294 1891 2 +50 v 329 1876 a(10)p 403 1891 V 106 w(66)p 590 1891 V 97 w(...)g(Kg5)p +790 1891 V 131 w Ff(\000)p Fp(16)p 1029 1891 V 233 w(-)p 1344 +1891 V 297 w(0)p 1659 1891 V 295 1893 1365 2 v 294 1943 2 50 +v 329 1928 a(11)p 403 1943 V 106 w(50)p 590 1943 V 97 w(Rg6+)p +790 1943 V 153 w Ff(\000)p Fp(16)p 1029 1943 V 214 w(T5)p 1344 +1943 V 253 w(+16)p 1659 1943 V 295 1944 1365 2 v 294 1994 2 +50 v 329 1979 a(12)p 403 1994 V 106 w(50)p 590 1994 V 97 w(...)g(Kh4)p +790 1994 V 129 w Ff(\000)p Fp(16)p 1029 1994 V 233 w(-)p 1344 +1994 V 297 w(0)p 1659 1994 V 295 1996 1365 2 v 294 2046 2 50 +v 329 2031 a(13)p 403 2046 V 106 w(34)p 590 2046 V 97 w(Re4+)p +790 2046 V 156 w Ff(\000)p Fp(17)p 1029 2046 V 214 w(T1)p 1344 +2046 V 253 w(+24)p 1659 2046 V 295 2047 1365 2 v 294 2097 2 +50 v 329 2082 a(14)p 403 2097 V 106 w(41)p 590 2097 V 97 w(...)g(Nf4)p +790 2097 V 140 w Ff(\000)p Fp(18)p 1029 2097 V 233 w(-)p 1344 +2097 V 297 w(0)p 1659 2097 V 295 2099 1365 2 v 294 2149 2 50 +v 329 2134 a(15)p 403 2149 V 106 w(23)p 590 2149 V 97 w(Rxf4+)p +790 2149 V 139 w Ff(\000)p Fp(19)p 1029 2149 V 159 w(T1+TE1)p +1344 2149 V 170 w(+24+2)p 1659 2149 V 295 2150 1365 2 v 294 +2200 2 50 v 329 2185 a(16)p 403 2200 V 106 w(30)p 590 2200 +V 97 w(...)g(Kh5)p 790 2200 V 129 w Ff(\000)p Fp(20)p 1029 +2200 V 233 w(-)p 1344 2200 V 297 w(0)p 1659 2200 V 295 2202 +1365 2 v 294 2252 2 50 v 329 2237 a(17)p 403 2252 V 106 w(10)p +590 2252 V 97 w(g3)p 790 2252 V 216 w Ff(\000)p Fp(21)p 1029 +2252 V 214 w(T9)p 1344 2252 V 253 w(+24)p 1659 2252 V 295 2253 +1365 2 v 294 2303 2 50 v 329 2288 a(18)p 403 2303 V 106 w(13)p +590 2303 V 97 w(...)g(an)o(y)p 790 2303 V 140 w Ff(\000)p Fp(22)p +1029 2303 V 200 w(TE4)p 1344 2303 V 239 w(+16)p 1659 2303 V +295 2305 1365 2 v 294 2355 2 50 v 329 2340 a(19)p 403 2355 +V 116 w(7)p 590 2355 V 108 w(Rh4++)p 790 2355 V 149 w(-)p 1029 +2355 V 263 w(-)p 1344 2355 V 301 w(-)p 1659 2355 V 295 2356 +1365 2 v 314 2449 a(Figure)d(5.2:)j(A)d(table)f(sho)o(wing)h(in)o(terest)h(v) +n(alues)e(for)h(a)f(19)h(ply)f(mating)f(sequence.)946 2574 +y(105)p eop +%%Page: 106 108 +106 107 bop 262 307 a Fp(Note:)24 b(Tn)16 b(represen)o(ts)k(threat)d +(heuristic)h(n,)f(and)f(TEm)g(represen)o(ts)j(threat)f(execution)262 +357 y(heuristic)c(m.)324 442 y(In)e(the)g(p)q(osition)f(in)h(\014gure)g(5.1,) +f(white)h(can)g(force)g(c)o(hec)o(kmate)g(in)f(10)g(mo)o(v)o(es)g(\(19)g +(ply\).)262 492 y(The)g(table)g(sho)o(wn)g(in)f(\014gure)i(5.2)e(sho)o(ws)h +(ho)o(w)g(on)f(a)h(6)g(ply)f(iteration,)h(these)h(heuristics)g(are)262 +542 y(able)j(to)h(iden)o(tify)f(the)i(correct)g(19)f(ply)f(mo)o(v)o(e)f +(sequence.)27 b(Assume)16 b(for)f(simplicit)o(y)f(that)262 +592 y(aspiration)f(v)n(alues)g(of)g Fh(\013)h Fp(and)g Fh(\014)i +Fp(are)f(presen)o(t)g(when)f(the)h(giv)o(en)e(v)n(ariation)g(is)g(explored.) +262 764 y Fr(5.3)69 b(Quiescence)20 b(Decision)262 891 y Fp(Unlik)o(e)f(most) +g(other)i(c)o(hess)h(programs,)e(HIAR)o(CS)g(will)f(not)h(leap)g(in)o(to)f(a) +h(quiescence)262 941 y(searc)o(h)13 b(when)h(the)f(depth)h(of)e(the)h(full)f +(width)h(searc)o(h)h(reac)o(hes)g(zero.)19 b(The)13 b(reason)g(b)q(ehind)262 +990 y(this)g(lies)h(in)g(understanding)g(what)g(the)g(quiescence)i(searc)o(h) +f(is)f(capable)g(of.)324 1076 y(W)m(ere)d(it)g(truly)f(capable)h(of)g(searc)o +(hing)g(all)f(the)i(imp)q(ortan)o(t)d(p)q(ossibilities)h(in)h(a)f(p)q +(osition)262 1125 y(un)o(til)e(true)j(quiescence)h(is)d(ac)o(hiev)o(ed,)h +(there)h(w)o(ould)e(b)q(e)h(no)g(p)q(oin)o(t)f(in)g(ha)o(ving)g(a)g(main)e +(searc)o(h)262 1175 y(at)16 b(all.)25 b(The)18 b(quiescence)g(searc)o(h)g +(could)f(b)q(e)g(directly)g(applied)f(to)h(all)e(mo)o(v)o(es)h(at)g(ply)g(1.) +262 1225 y(Sadly)m(,)10 b(ho)o(w)o(ev)o(er,)j(w)o(e)f(do)g(not)g(y)o(et)h +(kno)o(w)e(ho)o(w)h(to)g(build)g(suc)o(h)g(a)g(near-p)q(erfect)i(quiescence) +262 1275 y(searc)o(h.)26 b(Therefore,)17 b(b)o(y)f(kno)o(wing)f(what)h(m)o(y) +f(quiescence)j(searc)o(h)f(is)f(capable)h(of,)e(I)h(am)262 +1325 y(able)d(to)h(select)h(when)g(the)f(p)q(osition)f(is)h(suitable)g(for)f +(suc)o(h)i(a)e(searc)o(h.)324 1410 y(The)g(quiescence)i(searc)o(h)f(is)f +(capable)g(of)f(exploring)g(lines)h(in)o(v)o(olving)e(captures,)j(pa)o(wn)262 +1460 y(promotions)c(and)i(some)g(c)o(hec)o(king)h(mo)o(v)o(es.)j(The)d +(curren)o(t)h(side)e(to)h(mo)o(v)o(e)d(is)j(alw)o(a)o(ys)e(giv)o(en)262 +1510 y(the)j(option)f(of)g(standing)g(pat)h(i.e.)j(not)d(making)d(an)o(y)i +(mo)o(v)o(e)f(and)i(accepting)g(the)g(curren)o(t)262 1559 y(ev)n(aluation)g +(score.)24 b(Therefore,)17 b('Threat')f(searc)o(h)g(extension)h(heuristics)g +(1)e(to)h(6)f(and)g(8,)262 1609 y(and)9 b('Threat)i(Execution')f(searc)o(h)h +(extension)g(heuristic)g(4)f(are)g(applied)g(in)g(the)g(quiescence)262 +1659 y(searc)o(h)18 b(p)q(ossibly)f(causing)h(a)f(rejoining)f(of)h(the)h +(main)e(searc)o(h.)30 b(Inside)17 b(the)h(quiescence)262 1709 +y(searc)o(h,)h(if)f(an)o(y)g(of)f(these)j(extension)f(heuristics)g(are)g +(applied)e(successfully)m(,)j(the)f(main)262 1759 y(searc)o(h)h(is)g +(rejoined)f(regardless)i(of)e(the)h(resulting)g(in)o(terest)h(v)n(alue.)34 +b(This)19 b(a)o(v)o(oids)g(the)262 1808 y(premature)13 b(termination)g(of)g +(the)h(searc)o(h)h(when)g(asp)q(ects)g(of)f(in)o(terest)h(still)e(exist.)324 +1894 y(This)k(approac)o(h)g(not)g(only)f(mak)o(es)g(a)h(quiescence)i +(decision)e(at)g(the)h(horizon)f(of)f(the)262 1943 y(main)c(searc)o(h,)k(but) +f(also)f(more)g(imp)q(ortan)o(tly)m(,)d(at)k(eac)o(h)g(and)g(ev)o(ery)g(ply)g +(during)f(the)h(qui-)262 1993 y(escence)g(searc)o(h.)k(This)12 +b(should)g(enable)h(the)h(program)d(to)h(\014nd)h(deep)g(com)o(binations)e +(ev)o(en)262 2043 y(after)18 b(the)g(quiescence)j(searc)o(h)e(is)f(underw)o +(a)o(y)m(.)30 b(F)m(or)18 b(example,)f(a)h(4)f(ply)h(iteration)g(ma)o(y)262 +2093 y(progress)j(do)o(wn)f(5)g(plies)h(of)f(main)e(searc)o(h)j(\(1)g(ply)f +(extension\),)i(join)d(the)i(quiescence)262 2143 y(searc)o(h)13 +b(for)e(1)h(more)e(ply)m(,)h(then)i(rejoin)e(the)i(main)c(searc)o(h)k(when)g +(something)d(in)o(teresting)j(is)262 2193 y(found)e(and)h(pro)q(ceed)i(for)e +(3)g(more)f(plies)h(in)f(the)i(restarted)h(main)c(searc)o(h)j(b)q(efore)g +(\014nding)f(a)262 2242 y(9)h(ply)g(com)o(bination)f(whic)o(h)i(w)o(ould)f +(otherwise)i(b)q(e)f(b)q(ey)o(ond)g(the)h(program's)d(capabilit)o(y)m(.)946 +2574 y(106)p eop +%%Page: 107 109 +107 108 bop 262 307 a Fr(5.4)69 b(Quiescence)20 b(Searc)n(h)262 +434 y Fp(A)12 b(quiescence)i(searc)o(h)f(is)e(p)q(erformed)h(to)g(c)o(hec)o +(k)h(out)f(purely)g(tactical)f(p)q(ossibilities)h(whic)o(h)262 +483 y(are)j(v)o(ery)g(di\016cult)g(to)g(assess)h(accurately)g(at)f(the)h +(horizon)f(of)f(a)h(main)e(searc)o(h)j(b)o(y)f(using)262 533 +y(a)e(static)h(ev)n(aluation)f(function.)324 618 y(This)g(searc)o(h)i(can)f +(therefore)h(b)q(e)f(seen)h(as)f(a)f(selectiv)o(e)i(tactical)e(searc)o(h)i +(complemen)o(t-)262 668 y(ing)h(the)h(static)g(tactical)g(parts)g(of)f(the)i +(ev)n(aluation)d(function.)26 b(Hence,)19 b(impro)o(ving)14 +b(the)262 718 y(accuracy)g(of)g(the)g(results)h(bac)o(k)o(ed)f(up)g(from)f +(the)h(horizon)g(no)q(des.)324 803 y(The)i(searc)o(h)h(explores)g(captures,)h +(pa)o(wn)e(promotions)e(and)i(some)f(c)o(hec)o(king)h(mo)o(v)o(es.)262 +853 y(Ideally)d(all)g(dynamic)g(mo)o(v)o(es)g(should)i(b)q(e)g(explored,)g +(these)g(include)g(c)o(hec)o(ks,)h(c)o(hec)o(k)f(ev)n(a-)262 +903 y(sion,)10 b(threats,)j(defences,)g(blo)q(c)o(ks,)e(X-ra)o(y)g(attac)o +(ks,)h(captures,)g(pa)o(wn)f(pushes,)i(promotion)262 953 y(etc.)23 +b(A)15 b(com)o(bination)e(of)i(a)g(full)f(n)o(ull)g(mo)o(v)o(e)g(algorithm)e +(and)k(m)o(y)d(prop)q(osed)j(quiescence)262 1003 y(searc)o(h)11 +b(w)o(ould)f(o\013er)h(some)f(hop)q(e)h(on)g(this)f(direction.)17 +b(Ho)o(w)o(ev)o(er,)12 b(t)o(w)o(o)e(reasons)h(ha)o(v)o(e)g(made)262 +1052 y(me)h(a)o(v)o(oid)h(suc)o(h)i(a)e(com)o(bination)f(in)h(this)h(pro)r +(ject:)312 1171 y(1.)20 b(The)e(searc)o(h)h(depth)f(is)f(v)o(ery)g +(di\016cult)g(to)g(con)o(trol)g(and)g(without)g(strict)h(con)o(trols)365 +1221 y(the)d(searc)o(h)g(can)f(easily)f(explo)q(de.)312 1304 +y(2.)20 b(This)10 b(t)o(yp)q(e)h(of)f(searc)o(h)h(w)o(ould)f(explore)h(man)o +(y)d(thousands)j(of)f(v)n(ariations)f(and)h(hence,)365 1353 +y(require)15 b(v)o(ery)f(fast)g(hardw)o(are)g(to)g(supp)q(ort)h(this)f +(additional)e(load.)262 1472 y(Pseudo)18 b(co)q(de)h(illustrating)d(m)o(y)g +(quiescence)k(searc)o(h)f(using)f(the)g(negamax)e(con)o(v)o(en)o(tion)262 +1522 y(can)e(b)q(e)g(found)g(in)f(\014gure)h(5.3.)324 1607 +y(This)c(searc)o(h)h(explores)f(mo)o(v)o(es)f(prop)q(osed)i(b)o(y)f(the)g +(GenerateQMo)o(v)o(es)i(function.)k(Eac)o(h)262 1657 y(mo)o(v)o(e)10 +b(is)i(searc)o(hed)j(only)c(if)h(it)g(can)g(c)o(hange)h(the)g(searc)o(h)g +(result)h(i.e.)j(ev)n(al)11 b(+)i Fh(V)c(al)q(ue)1568 1663 +y Fe(m)1612 1657 y Fh(>)i(\013)p Fp(.)262 1707 y(Eac)o(h)17 +b(side)h(to)g(mo)o(v)o(e)e(also)h(has)h(an)f(extra)h(option)f(of)g(standing)g +(pat)h(thereb)o(y)h(in)e(e\013ect)262 1756 y(pla)o(ying)12 +b(a)h(n)o(ull)g(mo)o(v)o(e,)f(see)j(section)g(3.1.6.)324 1842 +y(A)f(n)o(um)o(b)q(er)f(of)g(additional)f(tree)j(pruning)f(tec)o(hniques)h +(are)f(used)h(to)f(prune)h(the)f(tree:)324 1960 y Ff(\017)20 +b Fl(Note)14 b(1)p Fp(:)j(As)12 b(the)h(side)f(to)g(mo)o(v)o(e)f(alw)o(a)o +(ys)f(has)j(the)f(option)g(of)f(pla)o(ying)f(a)i(n)o(ull)f(mo)o(v)o(e)365 +2010 y(and)j(accepting)h(the)g(curren)o(t)h(static)e(score,)h(a)f(no)q(de)h +(with)f(a)g(static)g(score)i(already)365 2060 y(ab)q(o)o(v)o(e)g(the)g(searc) +o(h)h(windo)o(w)e(is)h(pruned.)25 b(Implicit)13 b(in)i(this)h(is)g(the)g +(fact)g(that)g(an)o(y)365 2110 y(subtree)g(b)q(elo)o(w)e(this)f(no)q(de)i(is) +f(also)f(pruned)i(b)q(efore)f(it)g(is)f(searc)o(hed.)324 2193 +y Ff(\017)20 b Fl(Note)j(2)p Fp(:)30 b(The)21 b(n)o(ull)e(mo)o(v)o(e)g +(option)g(giv)o(es)h(rise)h(to)f(the)g(p)q(ossibilit)o(y)f(of)h(further)365 +2242 y(reducing)d(the)f(width)g(of)f(the)h(searc)o(h)h(windo)o(w.)23 +b(This)16 b(is)g(b)q(ecause)h(the)g(w)o(orst)f(the)365 2292 +y(side)e(to)f(pla)o(y)f(can)i(do)f(is)g('stand)g(pat`)g(and)g(accept)h(the)g +(curren)o(t)h(ev)n(aluation)d(score.)324 2375 y Ff(\017)20 +b Fl(Note)h(3)p Fp(:)26 b(Eac)o(h)19 b(mo)o(v)o(e)d(prop)q(osed)j(b)o(y)f +(GenerateQMo)o(v)o(es)i(can)f(b)q(e)f(assigned)h(an)365 2425 +y(optimistic)11 b(v)n(alue)g(\()p Fh(V)f(al)q(ue)791 2431 y +Fe(m)823 2425 y Fp(\),)i(e.g.)17 b(captures)d(receiv)o(e)g(the)f(v)n(alue)f +(of)f(the)i(captured)946 2574 y(107)p eop +%%Page: 108 110 +108 109 bop 365 307 a Fp(piece)15 b(plus)e(an)g(optimistic)f(p)q(ositional)g +(score.)19 b(As)13 b(the)h(opp)q(onen)o(t)g(alw)o(a)o(ys)e(has)i(the)365 +357 y(option)g(of)h(making)d(a)j(n)o(ull)f(mo)o(v)o(e)905 342 +y Fk(1)922 357 y Fp(,)g(this)h(optimistic)e(v)n(alue)h(represen)o(ts)k(an)d +(upp)q(er)365 407 y(b)q(ound)h(on)g(the)g(score)h(deriv)n(able)e(from)f(the)j +(subtree)g(resulting)f(from)e(this)i(mo)o(v)o(e.)365 457 y(Therefore,)e(if)d +(ev)o(en)i(this)g(optimistic)d(v)n(alue)i(cannot)g(a\013ect)i(the)f(searc)o +(h)g(result,)g(the)365 506 y(p)q(oten)o(tial)h(no)q(de)g(and)g(its)f(subtree) +j(can)e(b)q(e)h(pruned.)262 625 y(These)22 b(3)e(forw)o(ard)g(pruning)h(mec)o +(hanisms)e(can)i(drastically)f(reduce)i(the)f(size)h(of)e(the)262 +675 y(quiescence)c(searc)o(h.)324 760 y(In)e(conclusion,)f(I)h(feel)g(this)g +(com)o(bination)e(of)h(main)f(searc)o(h,)j(quiescence)h(searc)o(h)f(and)262 +810 y(selectiv)o(e)h(extensions)g(should)f(signi\014can)o(tly)f(impro)o(v)o +(e)g(the)i(program's)d(tactical)i(abilit)o(y)m(.)262 860 y(Without)i(suc)o(h) +i(enhancemen)o(ts,)g(it)f(is)g(lik)o(ely)f(to)h(compare)g(unfa)o(v)o(ourably) +e(with)i(other)262 909 y(strong)10 b(programs)g(tactically)g(due)h(to)f(the)i +(signi\014can)o(t)e(amoun)o(t)f(of)h(p)q(ositional)f(kno)o(wledge)262 +959 y(elsewhere)15 b(in)f(the)g(program)f(consuming)f(large)i(c)o(h)o(unks)g +(of)f(time.)p 262 2371 573 2 v 308 2398 a Fj(1)325 2410 y Fi(this)f(ma)o(y)f +(not)g(b)q(e)h(the)g(case)f(if)h(the)g(main)f(searc)o(h)g(if)h(rejoined,)e +(ho)o(w)o(ev)o(er,)h(the)h(a\013ects)f(are)g(minimal)262 2449 +y(and)f(can)h(b)q(e)g(ignored.)946 2574 y Fp(108)p eop +%%Page: 109 111 +109 110 bop 262 307 a Fl(F)l(unction)11 b Fp(Quiescence\(P)17 +b(:)c Fl(p)q(osition)p Fp(;)d Fh(\013)p Fp(,)k Fh(\014)i Fp(:)i +Fl(in)o(teger)p Fp(\))11 b Fl(returns)j(in)o(teger)262 407 +y(v)m(ar)321 457 y Fp(m)82 b(:)18 b Fl(mo)o(v)o(e)321 506 y +Fp(b)q(est,)321 556 y(ev)n(al,)321 606 y(score)29 b(:)18 b +Fl(in)o(teger)262 706 y(b)q(egin)321 805 y Fp(b)q(est)d(:=)e(Ev)n(aluate\(P)m +(,)g Ff(\000)p Fh(\014)r Fp(,)h Ff(\000)p Fh(\013)p Fp(\))321 +855 y Fl(if)e Fp(\(b)q(est)j Ff(\025)d Fh(\014)r Fp(\))380 +905 y Fl(return)f Fp(\(b)q(est\))515 b(/*)14 b Fm(Se)n(e)h(note)g(1)f +Fp(*/)321 955 y Fl(endif)321 1005 y Fh(\013)f Fp(:=)h Fl(max)p +Fp(\()p Fh(\013)p Fp(,)f(b)q(est\))482 b(/*)14 b Fm(Se)n(e)h(note)g(2)f +Fp(*/)321 1104 y(GenerateQMo)o(v)o(es\(P\))458 b(/*)14 b Fm(Gener)n(ate)h +(moves)f Fp(*/)321 1154 y(ev)n(al)f(:=)g(b)q(est)611 b(/*)14 +b Fm(Can)h(always)f('Stand)i(Pat')e Fp(*/)321 1204 y Fl(for)h(eac)o(h)g(mo)o +(v)o(e)e Fp(m)f Fl(do)380 1254 y(if)g Fp(\(ev)n(al)i(+)g Fh(V)9 +b(al)q(ue)679 1260 y Fe(m)722 1254 y Fh(>)j(\013)p Fp(\))338 +b(/*)14 b Fm(Se)n(e)h(note)g(3)f Fp(*/)439 1303 y(/*)f Fm(Se)n(ar)n(ch)i +(move)g(m)g(to)g(next)g(depth)h(using)f(ne)n(gamax)h(c)n(onvention)f +Fp(*/)439 1353 y(score)g(:=)e Ff(\000)p Fp(Quiescence\()p Fh(P)871 +1359 y Fe(m)906 1353 y Fp(,)g Ff(\000)p Fh(\014)r Fp(,)h Ff(\000)p +Fh(\013)p Fp(\))439 1403 y Fl(if)e Fp(\(score)k Fh(>)e Fp(b)q(est\))498 +1453 y(b)q(est)h(:=)e(score)414 b(/*)14 b Fm(Stor)n(e)g(b)n(est)h(sc)n(or)n +(e)g(found)f Fp(*/)498 1503 y Fl(if)e Fp(\(b)q(est)k Ff(\025)11 +b Fh(\014)r Fp(\))557 1553 y Fl(return)g Fp(\(b)q(est\))338 +b(/*)14 b Fh(\014)j Fm(cut)e(o\013)h(:)j(r)n(eturn)14 b(b)n(est)h(sc)n(or)n +(e)e Fp(*/)498 1602 y Fl(endif)498 1652 y Fh(\013)g Fp(:=)h +Fl(max)p Fp(\()p Fh(\013)p Fp(,)f(b)q(est\))305 b(/*)14 b Fm(Up)n(date)h +(fail)f(soft)f Fp(*/)439 1702 y Fl(else)498 1752 y Fp(b)q(est)i(:=)e +Fl(max)p Fp(\(b)q(est,)i(ev)n(al)e(+)i Fh(V)9 b(al)q(ue)1091 +1758 y Fe(m)1123 1752 y Fp(\))439 1802 y Fl(endif)380 1851 +y(endif)321 1901 y(endfor)321 2001 y(return)i Fp(\(b)q(est\))574 +b(/*)14 b Fm(R)n(eturn)h(sc)n(or)n(e)f(of)h(b)n(est)g(move)g(found)g +Fp(*/)262 2100 y Fl(end)d Fp(Quiescence)513 2277 y(Figure)i(5.3:)j(Pseudo)e +(co)q(de)g(for)e(m)o(y)f(Quiescence)17 b(Searc)o(h.)946 2574 +y(109)p eop +%%Page: 110 112 +110 111 bop 262 654 a Fn(Chapter)34 b(6)262 897 y Fo(HIAR)m(CS)k(5.0)262 +1148 y Fp(In)10 b(this)h(c)o(hapter,)h(I)e(will)g(sho)o(w)g(ho)o(w)h(the)g(v) +n(arious)f(tec)o(hniques)i(I)e(ha)o(v)o(e)h(in)o(v)o(estigated)f(in)h(this) +262 1198 y(pro)r(ject)j(can)f(b)q(e)h(brough)o(t)f(together)i(and)e(implem)o +(en)o(ted)f(in)g(a)h(c)o(hess)i(program.)h(There)f(is)262 1248 +y(neither)g(the)g(time)f(nor)g(space)i(to)f(fully)e(explain)h(all)f(the)j +(design)e(issues,)i(some)e(of)g(whic)o(h)262 1298 y(ha)o(v)o(e)j(ev)o(olv)o +(ed)h(o)o(v)o(er)g(the)h(last)f(couple)g(of)g(y)o(ears.)31 +b(Ho)o(w)o(ev)o(er,)20 b(I)e(will)e(giv)o(e)i(an)g(o)o(v)o(erview)262 +1347 y(of)g(the)h(program's)e(design)j(and)e(structure.)35 +b(I)19 b(will)f(also)g(discuss)i(some)e(of)g(the)i(main)262 +1397 y(decisions)12 b(whic)o(h)f(ha)o(v)o(e)h(b)q(een)h(tak)o(en)f(relating)f +(to)h(the)g(algorithms)e(and)h(tec)o(hniques)i(used.)324 1483 +y(This)f(program)e(con)o(tains)i(around)g(a)f(50-50)g(split)h(of)f(old)g(co)q +(de)i(and)f(totally)e(new)j(co)q(de)262 1532 y(resulting)h(from)e(m)o(y)g(in) +o(v)o(estigations)h(since)h(b)q(eginning)g(this)g(pro)r(ject.)262 +1705 y Fr(6.1)69 b(Program)24 b(History)f(and)g(En)n(vironmen)n(t)262 +1831 y Fp(I)16 b(b)q(egan)h(writing)f(c)o(hess)i(programs)d(as)i(long)f(ago)g +(as)g(1979.)26 b(My)16 b(\014rst)i(c)o(hess)g(program,)262 +1881 y(UCT,)13 b(only)h(pla)o(y)o(ed)g(the)g(ending)h(of)e(king)h(and)g(ro)q +(ok)g(v)o(ersus)h(king.)k(Ho)o(w)o(ev)o(er,)14 b(this)g(only)262 +1931 y(serv)o(ed)k(to)e(w)o(et)h(m)o(y)e(app)q(etite)j(for)e(the)h(sub)r +(ject.)28 b(In)17 b(late)g(1980,)f(I)g(dev)o(elop)q(ed)i(m)o(y)d(\014rst)262 +1981 y(full)f(c)o(hess)j(program,)d(HIAR)o(CS.)g(Ho)o(w)o(ev)o(er,)i(it)g(w)o +(as)f(only)g(capable)g(of)g(pla)o(ying)f(random)262 2031 y(c)o(hess.)32 +b(Later,)19 b(in)e(1981,)h(the)g(c)o(hess)i(program)c(w)o(as)i(impro)o(v)o +(ed)f(to)h(searc)o(h)h(1)e(ply)h(with)262 2080 y(material)13 +b(and)h(mobilit)o(y)e(ev)n(aluation.)21 b(By)15 b(the)h(end)f(of)g(1983,)f +(HIAR)o(CS)g(w)o(as)h(enhanced)262 2130 y(to)g(a)g(4)g(ply)g(selectiv)o(e)i +(searc)o(h)g(program)d(applying)g(rudimen)o(tary)g(p)q(ositional)g(and)i(sw)o +(ap)262 2180 y(o\013)g(ev)n(aluations)g(at)h(its)g(leaf)f(no)q(des.)28 +b(The)17 b(program)e(w)o(as)i(written)g(in)g(compiled)e(Basic)262 +2230 y(with)c(some)h(Z80)g(assem)o(bly)f(routines)i(and)f(w)o(as)g(capable)g +(of)f(pla)o(ying)g(at)h(w)o(eak)g(club)g(lev)o(el,)262 2280 +y(ELO)i(1300,)e(on)i(a)f(Z80)h(pro)q(cessor.)324 2365 y(A)o(t)c(this)g(p)q +(oin)o(t)f(activit)o(y)g(stopp)q(ed)i(un)o(til)e(early)h(1987,)f(when)i(I)f +(b)q(egan)g(w)o(ork)f(dev)o(eloping)262 2415 y(a)15 b(totally)g(new)h(full)e +(width)i(c)o(hess)h(program)e(written)h(in)f(Mo)q(dula-2)g(for)g(an)h(Amiga.) +22 b(In)946 2574 y(110)p eop +%%Page: 111 113 +111 112 bop 262 307 a Fp(mid)12 b(1988,)g(the)i(program)f(w)o(as)g(rewritten) +j(in)d(the)i(C)e(language)g(for)h(t)o(w)o(o)f(main)f(reasons:)324 +426 y Ff(\017)20 b Fp(Co)q(de)15 b(e\016ciency)324 509 y Ff(\017)20 +b Fp(More)15 b(lo)o(w)e(lev)o(el)g(freedom)262 627 y(A)o(t)g(this)h(stage)h +(the)f(program)e(w)o(as)i(pla)o(ying)f(at)g(around)h(ELO)g(1550)f(while)h +(analysing)e(40)262 677 y(-)h(60)h(no)q(des)g(p)q(er)h(second.)324 +762 y(The)i(program)f(w)o(as)h(further)g(enhanced)i(during)d(1988/89)g(un)o +(til)g(b)o(y)h(August)g(1989,)262 812 y(when)12 b(it)g(w)o(as)g(en)o(tered)i +(in)d(the)i(1st)f(Computer)g(Olympiad,)d(HIAR)o(CS)j(4.1)f(as)h(it)g(w)o(as)g +(then)262 862 y(kno)o(wn,)j(w)o(as)g(analysing)f(at)i(the)g(rate)g(of)f(80)g +(-)g(180)g(no)q(des)h(p)q(er)h(second)f(and)g(pla)o(ying)e(at)262 +912 y(ab)q(out)f(ELO)i(1750.)324 997 y(Early)c(on)h(during)g(this)g(pro)r +(ject)h(I)f(decided)h(to)f(up)g(load)f(m)o(y)g(program)f(on)o(to)i(our)g(V)-5 +b(AX)262 1047 y(785)13 b(mac)o(hine)f(at)i(w)o(ork.)k(Three)d(reasons)g(la)o +(y)d(b)q(ehind)j(this)f(decision:)312 1165 y(1.)20 b Fl(Securit)o(y)l(.)g +Fp(The)15 b(p)q(ossibilit)o(y)f(of)g(m)o(y)f(Amiga)g(malfunctioning)f(or)j +(ev)o(en)g(ha)o(ving)f(a)365 1215 y(virus)j(p)q(osed)h(to)q(o)e(great)h(a)g +(risk.)26 b(I)17 b(therefore)h(felt)e(it)h(w)o(as)f(safer)i(to)e(dev)o(elop)h +(the)365 1265 y(program)12 b(on)h(a)f(mac)o(hine)g(where)i(regular)f(bac)o +(kup)h(securit)o(y)g(is)e(already)h(pro)o(vided.)312 1348 y(2.)20 +b Fl(Sp)q(eed.)27 b Fp(Ev)o(en)17 b(though)g(a)g(V)-5 b(AX)18 +b(785)e(mac)o(hine)f(is)i(slo)o(w)g(b)o(y)f(to)q(da)o(ys)h(standards,)365 +1398 y(it)f(is)h(still)e(faster)i(than)f(an)g(Amiga.)24 b(I)16 +b(found)g(that)g(the)h(H/W)f(c)o(hange)h(pro)o(vided)365 1447 +y(around)e(a)f(2-fold)f(sp)q(eed)j(impro)o(v)o(emen)o(t,)c(pro)o(vided)i(the) +h(mac)o(hine)e(w)o(as)i(otherwise)365 1497 y(un)o(used.)312 +1580 y(3.)20 b Fl(En)o(vironmen)o(t.)36 b Fp(I)20 b(felt)h(the)g(UNIX)989 +1565 y Fk(1)1028 1580 y Fp(op)q(erating)g(system)f(pro)o(vided)h(a)f(b)q +(etter)365 1630 y(en)o(vironmen)o(t)13 b(in)h(whic)o(h)f(to)h(dev)o(elop)g +(the)g(program.)262 1803 y Fr(6.2)69 b(Program)24 b(Structure)262 +1929 y Fp(HIAR)o(CS)9 b(5.0)g(is)g(a)h(large)g(and)f(complex)g(program.)15 +b(It)10 b(is)f(split)h(up)g(in)o(to)f(12)g(mo)q(dules)g(whic)o(h)262 +1979 y(eac)o(h)j(p)q(erform)e(a)h(particular)h(t)o(yp)q(e)g(of)f(job.)16 +b(In)c(\014gure)g(6.1,)f(a)g(diagram)e(is)i(pro)o(vided)h(whic)o(h)262 +2029 y(illustrates)i(ho)o(w)f(the)i(mo)q(dules)e(in)o(teract)h(with)g(eac)o +(h)g(other.)19 b(The)14 b(diagram)e(is)i(at)g(a)f(high)262 +2079 y(lev)o(el)d(and)g(m)o(uc)o(h)g(detail)g(has)h(b)q(een)g(omitted)f(for)g +(reasons)i(of)e(clarit)o(y)m(.)16 b(The)11 b(lines)f(represen)o(t)262 +2128 y(the)16 b(call)e(in)o(teraction)i(and)f(the)h(accompan)o(ying)d +(description)j(giv)o(es)g(the)g(reason)g(for)f(the)262 2178 +y(mo)q(dule)d(in)o(teraction.)324 2263 y(The)i(main)e(functions)i(p)q +(erformed)f(b)o(y)h(eac)o(h)g(mo)q(dule)f(are)h(explained)g(b)q(elo)o(w:)p +262 2298 573 2 v 308 2325 a Fj(1)325 2337 y Fi(UNIX)f(is)e(a)h(T)m(rademark)d +(of)i(Bell)g(Lab)q(oratories.)946 2574 y Fp(111)p eop +%%Page: 112 114 +112 113 bop 612 2462 a Fp(Figure)14 b(6.1:)j(Mo)q(dule)d(in)o(teraction)f +(diagram.)946 2574 y(112)p eop +%%Page: 113 115 +113 114 bop 312 307 a Fp(1.)20 b Fl(Hiarcs)p Fp(:)g(This)15 +b(is)g(the)h(main)d(program)h(mo)q(dule.)20 b(It)15 b(con)o(trols)g +(initialisation)e(and)365 357 y(o)o(v)o(ersees)k(the)f(in)o(teraction)g(b)q +(et)o(w)o(een)g(the)h(user,)f(via)e(the)i(MMI)g(mo)q(dule,)e(and)h(the)365 +407 y(c)o(hess)h(decision)e(algorithms.)312 488 y(2.)20 b Fl(HouseKeeping)p +Fp(:)c(This)e(mo)q(dule)e(deals)i(with)g(initialisation)d(for)i(a)h(new)g +(game.)312 570 y(3.)20 b Fl(HashDriv)o(er)p Fp(:)15 b(This)e(mo)q(dule)e(con) +o(trols)i(transp)q(osition)f(table)h(creation,)g(deletion)365 +620 y(and)f(en)o(try)g(storage)h(and)e(retriev)n(al.)18 b(It)11 +b(also)h(up)q(dates)g(hash)g(indexes)h(and)f(mo)q(di\014es)365 +670 y(the)j(transp)q(osition)f(table)g(b)q(et)o(w)o(een)h(searc)o(hes.)21 +b(An)14 b(op)q(ening)g(b)q(o)q(ok)g(transp)q(osition)365 719 +y(table)g(is)g(also)f(loaded)h(and)f(accessed)j(b)o(y)e(this)g(mo)q(dule.)312 +801 y(4.)20 b Fl(MMI)p Fp(:)d(This)f(mo)q(dule)f(deals)i(with)f(all)g(h)o +(uman/com)o(puter)f(in)o(teraction.)26 b(It)16 b(also)365 851 +y(c)o(hec)o(ks)g(en)o(tered)f(user)g(mo)o(v)o(es)e(for)g(legalit)o(y)f(and)i +(pro)q(cesses)j(v)n(arious)c(commands.)312 932 y(5.)20 b Fl(T)l(reeSearc)o(h) +p Fp(:)c(This)11 b(mo)q(dule)g(p)q(erforms)g(the)i(tree)g(searc)o(hing)g +(necessary)g(to)f(select)365 982 y(the)18 b(b)q(est)h(a)o(v)n(ailable)c(mo)o +(v)o(e.)26 b(T)m(o)17 b(ac)o(hiev)o(e)g(this)g(it)g(co)q(ordinates)h(the)g +(activities)f(of)365 1032 y(the)e(program)d(and)i(mak)o(es)f(extensiv)o(e)i +(use)f(of)g(most)e(other)j(mo)q(dules.)312 1113 y(6.)20 b Fl(Generate)p +Fp(:)28 b(This)19 b(mo)q(dule)f(con)o(tains)h(all)g(the)h(mo)o(v)o(e)d +(generation)j(routines)g(re-)365 1163 y(quired)14 b(b)o(y)g(the)h(program.) +312 1245 y(7.)20 b Fl(TimeCon)o(trol)p Fp(:)14 b(This)e(mo)q(dule)e(allo)q +(cates,)i(adjusts)g(and)g(con)o(trols)g(the)g(time)f(used)365 +1295 y(b)o(y)j(the)g(program.)312 1376 y(8.)20 b Fl(P)o(osEv)m(al)p +Fp(:)d(This)12 b(mo)q(dule)e(p)q(erforms)i(a)f(p)q(ositional)g(analysis)g(on) +h(a)f(giv)o(en)h(p)q(osition.)365 1426 y(It)i(con)o(tains)g(most)f(horizon)g +(no)q(de)i(ev)n(aluation)d(criteria.)312 1508 y(9.)20 b Fl(Planner)p +Fp(:)14 b(This)d(mo)q(dule)d(considers)k(and)e(selects)j(plans)d(to)g(direct) +h(the)g(searc)o(h)h(and)365 1557 y(up)q(dates)20 b(v)n(arious)e(w)o(eigh)o +(tings)f(asso)q(ciated)j(with)e(Pc/Sq)h(tables)g(and)f(the)h(game)365 +1607 y(phase.)291 1689 y(10.)h Fl(SqAnalysis)p Fp(:)j(This)17 +b(mo)q(dule)f(incremen)o(tally)g(up)q(dates)i(the)g(attac)o(k)f(tables)h(and) +365 1739 y(analyses)c(v)n(arious)g(attac)o(k)f(in)o(teractions)i(for)e(p)q +(ositional)g(ev)n(aluation)f(purp)q(oses.)291 1820 y(11.)20 +b Fl(Mo)o(v)o(er)p Fp(:)g(This)15 b(mo)q(dule)e(mak)o(es)h(and)h(unmak)o(es)f +(generated)i(mo)o(v)o(es.)k(It)15 b(also)g(con-)365 1870 y(trols)f(the)h +(incremen)o(tal)e(up)q(dating)g(of)g(the)i(attac)o(k)f(tables.)291 +1951 y(12.)20 b Fl(Utils)p Fp(:)i(Pro)o(vides)17 b(v)n(arious)f(utilit)o(y)g +(functions)g(whic)o(h)h(most)f(of)g(the)h(mo)q(dules)f(re-)365 +2001 y(quire.)262 2173 y Fr(6.3)69 b(Data)23 b(Structures)262 +2300 y Fp(The)16 b(data)g(structures)j(used)e(in)f(HIAR)o(CS)g(are)g(of)g +(cen)o(tral)g(imp)q(ortance)g(to)g(the)h(o)o(v)o(erall)262 +2350 y(design)d(of)h(the)g(program.)k(They)c(de\014ne)h(to)f(a)f(large)g +(exten)o(t)i(ho)o(w)f(in)o(telligen)o(t)e(the)j(in)o(ter-)262 +2399 y(nal)g(decisions)i(made)e(b)o(y)h(the)h(program)d(can)j(b)q(e.)29 +b(This)17 b(in)g(turn)g(largely)g(con)o(trols)g(the)262 2449 +y(kno)o(wledge)c(based)i(capabilities)e(of)g(the)h(program.)946 +2574 y(113)p eop +%%Page: 114 116 +114 115 bop 324 307 a Fp(This)17 b(section)h(explains)f(the)h(main)d(data)i +(structures)j(used,)f(the)f(reasons)g(for)f(their)262 357 y(giv)o(en)c(comp)q +(osition)f(and)i(their)g(application)e(to)i(the)h(program.)262 +509 y Fu(6.3.1)55 b(P)n(osition)18 b(Represen)n(tation)262 +621 y Fp(The)c(p)q(osition)f(is)h(represen)o(ted)i(b)o(y)e(t)o(w)o(o)g +(structures,)h(P)o(osition)f(and)f(Colour.)344 754 y(P)o(osition)88 +b(=)15 b(64)p Ff(f)p Fp(PieceT)o(yp)q(e)p Ff(g)p Fp(64)344 +803 y(PieceT)o(yp)q(e)49 b(=)15 b(NoPiece)f Ff(j)g Fp(P)o(a)o(wn)f +Ff(j)h Fp(Knigh)o(t)f Ff(j)h Fp(Bishop)g Ff(j)f Fp(Ro)q(ok)g +Ff(j)g Fp(Queen)i Ff(j)f Fp(King)344 853 y(NoPiece)90 b(=)15 +b(0)344 903 y(P)o(a)o(wn)136 b(=)15 b(1)344 953 y(Knigh)o(t)110 +b(=)15 b(2)344 1003 y(Bishop)112 b(=)15 b(3)344 1052 y(Ro)q(ok)140 +b(=)15 b(4)344 1102 y(Queen)122 b(=)15 b(5)344 1152 y(King)148 +b(=)15 b(6)344 1252 y(Colour)113 b(=)15 b(64)p Ff(f)p Fp(colour)p +Ff(g)p Fp(64)344 1301 y(colour)125 b(=)15 b(White)e Ff(j)h +Fp(Blac)o(k)f Ff(j)h Fp(None)344 1351 y(White)124 b(=)15 b(0)344 +1401 y(Blac)o(k)135 b(=)15 b(1)344 1451 y(None)143 b(=)15 b(2)262 +1569 y(These)f(t)o(w)o(o)e(structures)k(are)d(similar)d(to)j(the)g(ones)h +(Shannon)f(originally)d(suggested.)19 b(The)262 1619 y(di\013erences)c +(include)e(the)g(splitting)f(of)g(piece)i(t)o(yp)q(e)f(and)g(colour)g(to)f +(enable)h(generic)h(mo)o(v)o(e)262 1669 y(generation)k(and)h(square)g(con)o +(trol)g(functions.)32 b(Both)19 b(structures)j(are)d(linear)f(and)g(one)262 +1719 y(dimensional.)d(Note)e(that)g(no)f(o\013{b)q(oard)g(edge)i(is)e(used)i +(on)e(this)h(b)q(oard,)f(as)h(an)f(alternate)262 1769 y(mo)o(v)o(e)i +(generation)i(pro)q(cess)i(is)e(used.)25 b(This)16 b(enables)g(all)f(piece)i +(square)g(tables)f(to)g(b)q(e)g(of)262 1818 y(a)d(signi\014can)o(tly)h +(reduced)i(size)f(when)g(compared)e(to)h(a)g(10x12)f(b)q(oard)i(approac)o(h,) +f(for)f(ex-)262 1868 y(ample.)j(Although)c(the)i(structures)h(are)f(one)f +(dimensional)e(for)h(e\016ciency)m(,)h(conceptually)262 1918 +y(they)h(remain)e(t)o(w)o(o)i(dimensional.)324 2003 y(The)e(most)f(imp)q +(ortan)o(t)f(reason)j(for)e(suc)o(h)i(a)f(64)f(elemen)o(t)h(structure)i(is)e +(that)g(an)o(y)f(mo)o(v)o(e)262 2053 y(can)19 b(b)q(e)h(represen)o(ted)j(in)c +(12)g(bits,)h(6)f(bits)h(for)f(the)h(from-square)f(and)g(6)g(bits)h(for)f +(the)262 2103 y(to-square.)j(This)15 b(enables)h(sp)q(ecialised)f(searc)o(h)i +(tables)e(to)g(b)q(e)h(used)g(whic)o(h)f(are)g(directly)262 +2153 y(accessed)h(b)o(y)e(the)g(12)g(bit)g(mo)o(v)o(e)e(v)n(alue.)18 +b(Additionally)m(,)11 b(it)j(allo)o(ws)f(a)g(complete)h(mo)o(v)o(e)e(de-)262 +2203 y(scription)d(including)g(mo)o(v)o(e)f(t)o(yp)q(e,)j(suc)o(h)g(as)f +(castling,)f(pa)o(wn)h(promotion)d(etc,)12 b(to)d(b)q(e)i(stored)262 +2252 y(in)i(16)g(bits.)18 b(Th)o(us)d(mo)o(v)o(e)d(comparisons)h(and)g +(copies)i(can)f(b)q(e)g(done)h(in)e(one)h(op)q(eration.)946 +2574 y(114)p eop +%%Page: 115 117 +115 116 bop 262 307 a Fu(6.3.2)55 b(Game)17 b(T)-5 b(ree)344 +434 y Fp(T)m(ree)157 b(=)15 b(0)p Ff(f)p Fp(No)q(de)p Ff(g)p +Fp(2000)344 483 y(No)q(de)142 b(=)15 b(Mo)o(v)o(e)e(+)h(Score)174 +b(/*)13 b(4)h(b)o(ytes)g(*/)344 533 y(Mo)o(v)o(e)139 b(=)15 +b(t)o(yp)q(e)f(+)g(mo)o(v)o(e)192 b(/*)13 b(4)h(bit)f(t)o(yp)q(e,)h(12)g(bit) +f(mo)o(v)o(e)f(*/)344 583 y(mo)o(v)o(e)141 b(=)15 b(0..4095)297 +b(/*)13 b(12)h(bits)g(*/)344 633 y(t)o(yp)q(e)157 b(=)15 b(Capture)f +Ff(j)f Fp(Promotion)f Ff(j)i Fp(Castle)g Ff(j)f Fp(EnP)o(assan)o(t)344 +683 y(Promotion)42 b(=)15 b(PQueen)g Ff(j)e Fp(PKnigh)o(t)h +Ff(j)f Fp(PRo)q(ok)h Ff(j)f Fp(PBishop)344 732 y(Capture)89 +b(=)15 b(8)405 b(/*)13 b(bit)h(15)f(*/)344 782 y(PQueen)94 +b(=)15 b(4)405 b(/*)13 b(bit)h(14)f(*/)344 832 y(PKnigh)o(t)82 +b(=)15 b(5)405 b(/*)13 b(bit)h(14,12)e(*/)344 882 y(PRo)q(ok)112 +b(=)15 b(6)405 b(/*)13 b(bit)h(14,13)e(*/)344 932 y(PBishop)84 +b(=)15 b(7)405 b(/*)13 b(bit)h(14,13,12)d(*/)344 982 y(Castle)123 +b(=)15 b(2)405 b(/*)13 b(bit)h(13)f(*/)344 1031 y(EnP)o(assan)o(t)46 +b(=)15 b(1)405 b(/*)13 b(bit)h(12)f(*/)344 1081 y(Score)140 +b(=)15 b Ff(\000)p Fp(4096..4095)262 1208 y(A)o(t)f(least)g(part)h(of)e(the)i +(game)e(tree)i(m)o(ust)f(b)q(e)g(stored)i(so)e(it)g(can)g(b)q(e)h(tra)o(v)o +(ersed)h(e\016cien)o(tly)m(.)262 1258 y(This)j(structure)i(allo)o(ws)d(the)i +(storage)g(of)f(no)q(des)h(generated,)i(but)d(not)h(y)o(et)f(visited)h(at)262 +1308 y(the)d(curren)o(t)h(searc)o(h)g(iteration.)25 b(Only)17 +b(the)g(no)q(des)g(generated)h(do)o(wn)f(the)g(curren)o(t)h(line)262 +1357 y(of)g(exploration)h(need)h(to)f(b)q(e)h(stored)g(as)f(these)i(are)f +(the)f(ones)h(whic)o(h)f(ha)o(v)o(e)g(not)g(b)q(een)262 1407 +y(completely)11 b(searc)o(hed.)20 b(Eac)o(h)13 b(no)q(de)g(is)g(only)f +(generated)j(once)e(at)g(eac)o(h)h(iteration)e(except)262 1457 +y(when)j(a)g(fail)f(high)g(or)h(lo)o(w)f(o)q(ccurs.)23 b(While)15 +b(storage)g(of)g(the)g(whole)g(tree)i(w)o(ould)d(sligh)o(tly)262 +1507 y(impro)o(v)o(e)f(p)q(erformance,)h(it)h(w)o(ould)f(b)q(e)i(extremely)e +(costly)i(in)e(terms)h(of)f(memory)f(usage,)262 1557 y(particularly)g(in)g +(the)i(endgame.)324 1642 y(T)m(ogether)f(with)f(the)h(mo)o(v)o(e)d(stored)k +(at)e(eac)o(h)h(no)q(de,)f(a)g(score)i(is)e(used)h(to)g(enable)f(mo)o(v)o(e) +262 1692 y(ordering)g(at)h(in)o(ternal)g(no)q(des)g(of)g(the)g(searc)o(h)h +(tree.)262 1914 y Fu(6.3.3)55 b(T)-5 b(ransp)r(osition)18 b(T)-5 +b(able)262 2026 y Fp(In)17 b(c)o(hess,)i(the)f(game)e(tree)j(is)e(really)g(a) +h(directed)g(graph)g(of)f(mo)o(v)o(es.)27 b(As)18 b(the)g(depth)g(of)262 +2076 y(searc)o(h)13 b(increases,)g(the)g(n)o(um)o(b)q(er)e(of)g(p)q(oten)o +(tial)h(transp)q(ositions)g(increases)h(exp)q(onen)o(tially)m(.)262 +2126 y(Additionally)m(,)k(when)j(using)f(an)f(iterativ)o(e)i(deep)q(ening)g +(searc)o(h,)h(the)f(no)q(des)g(visited)f(at)262 2176 y(iteration)13 +b Fh(n)c Ff(\000)h Fp(1)k(are)g(also)f(usually)g(visited)h(at)g(iteration)g +Fh(n)p Fp(.)k(Therefore,)d(the)f(transp)q(osi-)262 2226 y(tion)f(table)i(pro) +o(vides)f(a)g(useful)h(w)o(a)o(y)e(of)h(storing)g(and)h(retrieving)f +(previously)g(calculated)262 2275 y(mo)o(v)o(es)h(and)i(scores.)28 +b(F)m(or)17 b(deep)q(er)h(searc)o(hes)h(\(depth)f Fh(>)f Fp(5\))f(a)h(transp) +q(osition)g(table)f(can)262 2325 y(signi\014can)o(tly)10 b(impro)o(v)o(e)f +(the)j(p)q(erformance)g(of)e(a)i(program.)j(This)c(is)h(particularly)e +(eviden)o(t)262 2375 y(in)j(the)h(endgame)f(where)i(m)o(uc)o(h)e(deep)q(er)j +(searc)o(hes)g(are)e(p)q(ossible.)946 2574 y(115)p eop +%%Page: 116 118 +116 117 bop 344 357 a Fp(T)m(ransT)m(able)21 b(=)14 b(1)p Ff(f)p +Fp(T)m(ableEn)o(try)p Ff(g)p Fp(32768)344 407 y(T)m(ableEn)o(try)20 +b(=)14 b(HashLo)q(c)o(k)g(+)g(HMo)o(v)o(e)g(+)g(TScore)344 +457 y(HashLo)q(c)o(k)47 b(=)14 b(long)f(in)o(teger)390 b(/*)14 +b(32)f(bits)h(*/)344 506 y(HMo)o(v)o(e)97 b(=)14 b(Depth)g(+)g(mo)o(v)o(e)344 +556 y(TScore)99 b(=)14 b(T)o(yp)q(e)g(+)g(Score)354 b(/*)14 +b(3)f(bit)h(t)o(yp)q(e,)g(13)f(bit)h(score)h(*/)344 606 y(Depth)113 +b(=)14 b(0..15)516 b(/*)14 b(4)f(bits)h(*/)344 656 y(T)o(yp)q(e)132 +b(=)14 b(Lo)q(c)o(k)o(ed)g(+)g(T)m(rueScore)h(+)f(Bound)56 +b(/*)14 b(MS)g(3)f(bits)h(of)f(TScore)i(*/)344 706 y(Lo)q(c)o(k)o(ed)98 +b(=)14 b(8)582 b(/*)14 b(bit)f(15)g(*/)344 756 y(T)m(rueScore)45 +b(=)14 b(4)582 b(/*)14 b(bit)f(14)g(*/)344 805 y(Bound)106 +b(=)14 b(2)582 b(/*)14 b(bit)f(13,)g(set)i(if)e(Upp)q(erBound)i(*/)1218 +855 y(/*)f(unset)g(if)g(Lo)o(w)o(erBound)g(*/)262 964 y(This)19 +b(data)f(structure)k(represen)o(ts)f(the)f(transp)q(osition)f(table)g(used)h +(b)o(y)f(HIAR)o(CS)g(5.0.)262 1013 y(Eac)o(h)14 b(en)o(try)g(stores)h(5)f +(distinct)g(t)o(yp)q(es)h(of)e(information:)312 1086 y(1.)20 +b(P)o(osition)13 b(lo)q(c)o(k.)312 1164 y(2.)20 b(V)m(alue)14 +b(of)f(the)h(p)q(osition.)312 1242 y(3.)20 b(Best)c(mo)o(v)o(e)c(kno)o(wn)h +(in)h(the)g(p)q(osition.)312 1320 y(4.)20 b(Depth)15 b(of)e(the)h(subtree)i +(from)c(whic)o(h)i(the)g(v)n(alue)g(is)f(calculated.)312 1398 +y(5.)20 b(Flags)14 b(indicating)e(the)j(score)g(t)o(yp)q(e)f(relativ)o(e)g +(to)g(the)g Fh(\013\014)j Fp(windo)o(w.)262 1504 y Fl(T)l(able)e(Access)262 +1616 y Fp(The)c(access)h(metho)q(d)e(used)h(is)g(similar)d(to)i(the)h(one)g +(prop)q(osed)h(b)o(y)e(Zobrist)h([63)o(].)16 b(A)11 b(set)h(S)e(of)262 +1666 y(2x2x6x64)i(randomly)h(generated)j(32)d(bit)i(in)o(tegers)g(are)g(used) +g(to)f(represen)o(t)j(all)c(p)q(ossible)262 1716 y(piece/square)k(com)o +(binations)d(\(2)j(in)o(tegers)g(p)q(er)g(square;)h(2)e(colours;)h(6)f(piece) +h(t)o(yp)q(es;)h(64)262 1766 y(squares\).)324 1851 y(A)c(single)f(hash)h +(index)g(can)g(then)h(b)q(e)f(calculated)g(for)g(an)o(y)f(p)q(osition)h(b)o +(y)f(applying:)347 1936 y Ff(8)p Fh(col)q(;)7 b(pc;)g(sq)48 +b(H)619 1942 y Fe(i)644 1936 y Fp(=)12 b Fh(H)723 1942 y Fe(i)748 +1936 y Fm(xor)k Fh(S)847 1942 y Fe(col;pc;sq)324 1986 y Fp(where)373 +2036 y(P)o(osition[sq])c(=)j(p)q(c)f Fl(and)f Fp(Colour[sq])g(=)h(col)324 +2121 y(The)e(hash)f(indexes)h(are)g(actually)f(incremen)o(tally)f(up)q(dated) +i(in)f(HIAR)o(CS.)f(F)m(or)h(exam-)262 2171 y(ple,)i(to)h(mo)o(v)o(e)e(from)g +(square)j Fm(fsq)e Fp(to)h(square)h Fm(tsq)p Fp(,)e(the)h(follo)o(wing)e(op)q +(eration)h(is)h(required:)608 2285 y Fh(H)643 2291 y Fe(i)p +Fk(2)684 2285 y Fp(=)e(\()p Fh(H)779 2291 y Fe(i)p Fk(1)821 +2285 y Fm(xor)k Fh(S)920 2291 y Fe(col;pc;f)s(sq)1068 2285 +y Fp(\))c Fm(xor)28 b Fh(S)1207 2291 y Fe(col;pc;tsq)324 2399 +y Fp(Captures,)c(pa)o(wn)e(promotion,)f(en-passan)o(t)h(and)g(castling)f(all) +g(use)h(a)g(similar,)e(if)262 2449 y(sligh)o(tly)12 b(more)h(complex)g +(approac)o(h.)946 2574 y(116)p eop +%%Page: 117 119 +117 118 bop 324 307 a Fp(Using)14 b(t)o(w)o(o)g(32)h(bit)f(hash)h(indexes,)g +(direct)h(transp)q(osition)e(table)h(access)h(is)f(p)q(ossible.)262 +357 y(The)g(\014rst)g(index)g(is)f(used)h(to)g(access)h(the)g(table)e(and)g +(the)i(second)f(is)g(used)g(as)g(a)f(p)q(osition)262 407 y(lo)q(c)o(k)d(to)g +(c)o(hec)o(k)i(that)f(the)g(correct)h(en)o(try)f(has)g(b)q(een)h(accessed)h +(and)d(reduce)j(the)e(p)q(ossibilit)o(y)262 457 y(of)h(an)g(undetected)k +(collision.)324 542 y(Unlik)o(e)10 b(normal)e(hashing,)i(only)g(one)h(table)f +(access)i(is)f(tried.)17 b(This)10 b(mak)o(es)g(the)h(pro)q(cess)262 +592 y(b)q(oth)k(simpler)f(and)h(more)f(e\016cien)o(t.)22 b(Additionally)m(,) +13 b(the)j(table)f(is)g(split)g(in)o(to)f(t)o(w)o(o)h(halfs,)262 +641 y(one)c(half)e(for)i(white)g(to)g(pla)o(y)f(p)q(ositions)g(and)h(the)g +(other)h(half)e(for)g(blac)o(k)h(to)f(pla)o(y)g(p)q(ositions.)262 +784 y Fl(En)o(try)k(Storage)262 896 y Fp(No)q(de)j(attributes)h(are)g(stored) +g(in)f(the)h(transp)q(osition)f(table)g(as)g(the)h(no)q(de)g(is)f(ab)q(out)g +(to)262 946 y(bac)o(k)11 b(up)g(its)h(results)g(to)f(its)h(paren)o(t)g(no)q +(de.)17 b(The)12 b(en)o(try)g(is)f Fl(not)f Fp(stored)j(if)d(it)h(will)f(o)o +(v)o(erwrite)262 996 y(an)k(existing)g(en)o(try)h(whose)g(information)d(is)i +(the)h(result)h(of)e(a)g(subtree)i(searc)o(h)g(of)e(greater)262 +1046 y(depth.)38 b(Therefore,)23 b(eac)o(h)d(en)o(try)h(stored)h(is)e +(privileged)g(dep)q(ending)h(on)f(the)h(subtree)262 1095 y(depth.)34 +b(As)20 b(v)n(alues)f(deriv)o(ed)h(from)d(a)i(deep)i(searc)o(h)f(can)f +(constitute)i(a)e(great)g(deal)g(of)262 1145 y(e\013ort,)14 +b(this)g(is)f(a)h(signi\014can)o(t)f(impro)o(v)o(emen)o(t)f(o)o(v)o(er)h(a)h +(simple)e(replacemen)o(t)i(algorithm.)324 1230 y(The)g(p)q(osition)e(score)j +(stored)f(in)f(an)g(en)o(try)h(ma)o(y)d(b)q(e)j(a)f(true)h(score)h(or)e(a)g +(score)h(outside)262 1280 y(the)g(curren)o(t)i Fh(\013\014)h +Fp(windo)o(w,)c(i.e.)18 b(a)c(cut)h(o\013.)k(In)14 b(the)h(latter)g(case,)g +(the)f(score)i(represen)o(ts)h(a)262 1330 y(searc)o(h)e(b)q(ound)f(whic)o(h)g +(ma)o(y)e(b)q(e)j(used)g(to)f(narro)o(w)g(an)g Fh(\013\014)j +Fp(windo)o(w)c(if)g(retriev)o(ed.)21 b(Hence,)262 1380 y(the)14 +b(score)h(t)o(yp)q(e)g(is)e(also)h(stored)g(in)g(the)g(en)o(try)m(.)324 +1465 y(The)f(b)q(est)i(kno)o(wn)d(mo)o(v)o(e)g(from)f(the)j(curren)o(t)h(no)q +(de)e(is)g(also)g(stored)h(to)f(impro)o(v)o(e)e(mo)o(v)o(e)262 +1515 y(ordering)i(on)h(retriev)n(al.)262 1657 y Fl(En)o(try)g(Retriev)m(al) +262 1769 y Fp(When)e(a)h(no)q(de)g(in)f(the)h(main)e(searc)o(h)j(is)e +(visited,)h(the)g(transp)q(osition)g(table)f(is)h(c)o(hec)o(k)o(ed)h(to)262 +1819 y(see)g(if)e(an)h(en)o(try)g(for)g(the)g(curren)o(t)i(p)q(osition)d +(exists.)19 b(If)12 b(an)h(en)o(try)h(exists,)f(it)g(is)f(c)o(hec)o(k)o(ed)j +(to)262 1869 y(see)e(if)f(it)g(is)h(storing)f(information)e(with)i(a)g(searc) +o(h)i(depth)f(equal)f(or)h(greater)g(to)g(the)g(depth)262 1919 +y(required)h(for)g(this)g(searc)o(h.)19 b(If)14 b(so,)f(the)h(en)o(try)h(can) +f(b)q(e)h(retriev)o(ed.)324 2004 y(Once)j(retriev)o(ed,)h(the)e(en)o(try's)h +(p)q(osition)e(score)j(can)e(b)q(e)g(used.)29 b(Dep)q(ending)17 +b(on)g(the)262 2054 y(score's)e(t)o(yp)q(e,)e(3)h(outcomes)f(are)i(p)q +(ossible.)312 2169 y(1.)20 b Fl(T)l(rue)c(Score)p Fp(:)i(The)d(v)n(alue)f +(stored)h(is)g(an)f(exactly)g(calculated)h(v)n(alue.)k(Therefore,)365 +2219 y(the)c(v)n(alue)e(of)g(this)h(no)q(de)g(and)g(its)f(subtree)j(is)e(kno) +o(wn)f(\(for)h(the)g(required)h(depth)f(of)365 2268 y(searc)o(h\))h(and)f +(can)g(b)q(e)h(returned)g(to)f(its)g(paren)o(t)g(no)q(de)h(without)e(searc)o +(hing.)312 2350 y(2.)20 b Fl(Upp)q(er)11 b(Bound)p Fp(:)k(The)c(v)n(alue)f +(stored)h(is)f(not)h(exact,)g(it)f(w)o(as)h(the)g(result)g(of)f(a)h(cut)g +(o\013)365 2399 y(in)h(the)h(subtree)h(b)q(elo)o(w)e(the)g(no)q(de)h(whic)o +(h)f(stored)h(it.)k(Therefore,)d(the)e(v)n(alue)g(of)g(this)365 +2449 y(no)q(de)k(is)f(not)h(kno)o(wn,)e(ho)o(w)o(ev)o(er,)i(the)g(v)n(alue)f +(stored)h(can)f(b)q(e)h(used)h(to)e(narro)o(w)g(the)946 2574 +y(117)p eop +%%Page: 118 120 +118 119 bop 365 307 a Fp(curren)o(t)15 b Fh(\013\014)g Fp(windo)o(w)d(b)o(y)h +(p)q(ossibly)g(reducing)g(the)h Fh(\014)h Fp(v)n(alue)e(and)f(p)q(erhaps)i +(thereb)o(y)365 357 y(causing)g(a)g(cut)g(o\013.)312 440 y(3.)20 +b Fl(Lo)o(w)o(er)f(Bound)p Fp(:)24 b(The)18 b(v)n(alue)f(stored)h(is)g(not)f +(an)g(exact)i(v)n(alue,)e(only)g(a)g(b)q(ound.)365 490 y(The)h(v)n(alue)f +(can,)h(ho)o(w)o(ev)o(er,)g(b)q(e)g(used)g(to)f(narro)o(w)h(the)g +Fh(\013\014)h Fp(windo)o(w)e(b)o(y)g(p)q(ossibly)365 540 y(increasing)d(the)h +Fh(\013)e Fp(v)n(alue)h(and)f(p)q(erhaps)i(thereb)o(y)g(causing)f(a)g(cut)g +(o\013.)324 658 y(Assuming)g(the)i(no)q(de)g(is)f(not)g(terminated)g(b)o(y)g +(a)g(true)h(score)g(or)g(cut)g(o\013,)f(the)h(stored)262 708 +y(mo)o(v)o(e)f(can)i(b)q(e)h(retriev)o(ed)g(and)f(searc)o(hed)h(\014rst)g +(from)d(this)i(no)q(de.)28 b(This)17 b(should)f(signi\014-)262 +758 y(can)o(tly)10 b(impro)o(v)o(e)g(mo)o(v)o(e)f(ordering)i(as)g(this)g(is)g +(v)o(ery)h(lik)o(ely)d(to)i(b)q(e)h(the)g(b)q(est)g(mo)o(v)o(e)d(a)o(v)n +(ailable.)262 901 y Fl(Op)q(ening)k(Bo)q(ok)262 1013 y Fp(This)18 +b(transp)q(osition)g(table)g(is)g(initially)e(loaded)i(with)g(an)g('Op)q +(ening)g(Bo)q(ok')g(of)g(mo)o(v)o(es)262 1063 y(b)q(efore)g(the)g(game)e(b)q +(egins.)30 b(This)17 b(allo)o(ws)g(the)h(program)e(to)h('kno)o(w')f(ab)q(out) +i(particular)262 1113 y(op)q(ening)f(sequences)k(commonly)15 +b(pla)o(y)o(ed)i(b)o(y)h(strong)g(c)o(hess)i(pla)o(y)o(ers.)30 +b(Instead)19 b(of)e(just)262 1163 y(mo)o(v)o(e)8 b(sequences)13 +b(b)q(eing)d(stored,)i(p)q(ositions)e(and)g(asso)q(ciated)h(mo)o(v)o(es)e +(are)i(stored)g(enabling)262 1212 y(the)j(program)e(to)i(detect)i(an)o(y)d +(transp)q(osition)h(of)f(mo)o(v)o(es.)k(This)d(a)o(v)o(oids)f(cases)i(where)g +(the)262 1262 y(opp)q(onen)o(t)i(can)g(fo)q(ol)f(the)h(program)f(b)o(y)g(pla) +o(ying)g(mo)o(v)o(es)f(in)i(an)g(un)o(usual)f(sequence.)30 +b(In)262 1312 y(fact,)12 b(sometimes)e(in)i(the)g(op)q(ening)g(the)h(program) +e(will)f(transp)q(ose)k(in)o(to)d(another)i(op)q(ening)262 +1362 y(itself,)d(e.g.)16 b(transp)q(osing)10 b(from)f(an)g(English)h(op)q +(ening)g(in)o(to)f(a)h(Queen's)h(Gam)o(bit)d(Declined.)262 +1513 y Fu(6.3.4)55 b(Refutation)18 b(T)-5 b(able)344 1640 y +Fp(RefutationT)m(able)60 b(=)14 b(1)p Ff(f)p Fp(V)m(ariation)p +Ff(g)p Fp(128)344 1690 y(V)m(ariation)185 b(=)14 b(1)p Ff(f)p +Fp(mo)o(v)o(e)p Ff(g)p Fp(32)262 1816 y(The)f(refutation)f(table)h(is)g(used) +h(to)e(store)i(the)g(exp)q(ected)g(con)o(tin)o(uation)e(follo)o(wing)f(eac)o +(h)i(1)262 1866 y(ply)f(mo)o(v)o(e.)k(Some)c(of)g(the)h(v)n(ariations)f(will) +f(represen)o(t)16 b(the)d(b)q(est)h(line)f(of)f(pla)o(y)m(,)f(others)j(will) +262 1916 y(represen)o(t)i(the)e(v)n(ariation)e(whic)o(h)i(refuted)h(the)g(1)e +(ply)h(mo)o(v)o(e)e(\(hence)j(the)g(name\).)324 2001 y(Ev)o(ery)21 +b(mo)o(v)o(e)d(searc)o(hed)23 b(at)d(iteration)g(n)g(has)h(its)f(exp)q(ected) +j(con)o(tin)o(uation)c(sa)o(v)o(ed.)262 2051 y(During)10 b(iteration)h(n+1,)h +(or)f(a)g(re-searc)o(h,)i(the)f(exp)q(ected)i(con)o(tin)o(uation)c(is)h +(searc)o(hed)i(\014rst.)262 2101 y(This)h(helps)i(to)f(drastically)f(impro)o +(v)o(e)f Fh(\013\014)k Fp(cut)f(o\013s)f(b)o(y)g(guiding)e(the)j(searc)o(h)g +(do)o(wn)f(lines)262 2151 y(whic)o(h)f(are)i(lik)o(ely)d(to)i(refute)h(the)f +(1)g(ply)f(mo)o(v)o(e)f(or)i(at)g(least)g(prime)e Fh(\013\014)18 +b Fp(with)c(reasonable)262 2201 y(v)n(alues.)946 2574 y(118)p +eop +%%Page: 119 121 +119 120 bop 262 307 a Fu(6.3.5)55 b(The)18 b(History)g(Heuristic)344 +434 y Fp(HistoryT)191 b(=)14 b(8192)p Ff(f)p Fp(V)m(alue)p +Ff(g)p Fp(8192)344 483 y(V)m(alue)253 b(=)14 b(0..65535)262 +597 y(The)f(History)g(Heuristic)h([50)o(])e(main)o(tains)f(a)h(record)j(of)d +(ev)o(ery)i(mo)o(v)o(e's)d(abilit)o(y)g(to)i(cause)h(a)262 +647 y(refutation.)22 b(The)16 b(table)f(is)h(split)f(in)o(to)g(t)o(w)o(o)g +(halfs;)g(one)h(half)e(for)h(white)h(mo)o(v)o(es)e(and)h(one)262 +697 y(half)h(for)i(blac)o(k)f(mo)o(v)o(es.)28 b(It)18 b(is)g(indexed)g(b)o(y) +f(the)i(12)e(bit)g(mo)o(v)o(e)f(v)n(alue)i(whic)o(h)f(uniquely)262 +747 y(iden)o(ti\014es)d(an)o(y)f(mo)o(v)o(e)609 732 y Fk(2)626 +747 y Fp(.)18 b(Therefore,)d(a)f(total)f(of)g(8192)g(table)h(en)o(tries)h +(are)f(required.)324 832 y(A)o(t)h(ev)o(ery)g(in)o(terior)g(no)q(de)g(of)f +(the)i(main)d(searc)o(h,)i(the)h(b)q(est)g(mo)o(v)o(e)d(found)h(is)h +(recorded)262 882 y(in)f(the)i(history)f(table)g(b)o(y)g(mo)q(difying)e(the)j +(appropriate)f(v)n(alue.)21 b(The)16 b(v)n(alue)e(is)i(actually)262 +932 y(mo)q(di\014ed)11 b(b)o(y)h(2)507 917 y Fe(d)526 932 y +Fp(,)g(where)i(d)e(is)h(the)g(minim)n(um)8 b(depth)13 b(of)f(the)h(subtree)i +(b)q(elo)o(w)d(the)h(deriv)o(ed)262 981 y(b)q(est)i(mo)o(v)o(e.)324 +1067 y(A)o(t)e(the)g(b)q(eginning)f(of)g(the)h(game)f(the)h(history)g(table)f +(has)h(all)f(its)g(en)o(tries)i(set)g(to)e(zero.)262 1116 y(Sc)o(hae\013er)18 +b([50)o(])f(suggests)h(that)f(the)h(table)f(is)g(reset)h(in)f(this)g(w)o(a)o +(y)f(at)h(the)h(start)g(of)e(eac)o(h)262 1166 y(new)e(searc)o(h.)21 +b(Ho)o(w)o(ev)o(er,)14 b(in)g(HIAR)o(CS,)g(the)h(table)f(is)g(not)h(reset)h +(b)q(et)o(w)o(een)f(searc)o(hes,)h(but)262 1216 y(adjusted.)27 +b(Eac)o(h)17 b(mo)o(v)o(e's)e(v)n(alue)h(is)h(adjusted)g(b)o(y)g(dividing)e +(it)i(b)o(y)f(4.)27 b(This)16 b(allo)o(ws)g(the)262 1266 y(table)d(to)h(ha)o +(v)o(e)g(some)f(in\015uence)i(on)e(the)i(next)f(searc)o(h.)324 +1351 y(The)19 b(history)g(heuristic)h(is)f(applied)g(at)g(eac)o(h)h(in)o +(terior)f(no)q(de)g(of)g(the)g(main)e(searc)o(h)262 1401 y(where)d(mo)o(v)o +(e)e(generation)h(is)g(required.)19 b(As)13 b(mo)o(v)o(es)f(are)i(generated,) +g(their)g(history)f(v)n(alue)262 1451 y(is)g(lo)q(ok)o(ed)g(up)g(in)g(the)h +(history)g(table)f(and)g(encorp)q(orated)i(in)o(to)e(a)g(sp)q(ecial)h(mo)o(v) +o(e)e(ordering)262 1501 y(score.)19 b(See)c(section)f(6.4.2)e(for)i(more)f +(details.)262 1650 y Fu(6.3.6)55 b(Incremen)n(tal)16 b(A)n(ttac)n(k)j(T)-5 +b(ables)344 1776 y Fp(A)o(ttac)o(kT)143 b(=)15 b(64)p Ff(f)p +Fp(A)o(ttac)o(kEn)o(try)p Ff(g)p Fp(64)344 1826 y(/*)f(16)f(b)o(yte)h(en)o +(try)h(*/)344 1876 y(A)o(ttac)o(kEn)o(try)69 b(=)15 b(A)o(ttac)o(kCo)q(de)f +(+)g(Coun)o(t)g(+)g(PieceList)344 1926 y(/*)g(16)f(bit)g(attac)o(k)h(co)q(de) +h(*/)344 1976 y(A)o(ttac)o(kCo)q(de)80 b(=)15 b(P)o(ad)e(+)h(A)o(ttP)h(+)f(A) +o(ttN)g(+)g(A)o(ttB)h(+)f(A)o(ttR)g(+)g(A)o(ttQ)g(+)g(A)o(ttK)344 +2026 y(P)o(ad)224 b(=)15 b(0)344 2075 y(A)o(ttP)205 b(=)15 +b(0..3)218 b(/*)14 b(Num)o(b)q(er)f(of)g(pa)o(wn)h(attac)o(ks,)f(2)h(bits)g +(*/)344 2125 y(A)o(ttN)202 b(=)15 b(0..7)218 b(/*)14 b(Num)o(b)q(er)f(of)g +(knigh)o(t)g(attac)o(ks,)h(3)g(bits)g(*/)344 2175 y(A)o(ttB)204 +b(=)15 b(0..7)218 b(/*)14 b(Num)o(b)q(er)f(of)g(bishop)h(attac)o(ks,)g(3)f +(bits)h(*/)344 2225 y(A)o(ttR)202 b(=)15 b(0..7)218 b(/*)14 +b(Num)o(b)q(er)f(of)g(ro)q(ok)h(attac)o(ks,)g(3)f(bits)h(*/)344 +2275 y(A)o(ttQ)201 b(=)15 b(0..7)218 b(/*)14 b(Num)o(b)q(er)f(of)g(queen)i +(attac)o(ks,)f(3)f(bits)h(*/)344 2324 y(A)o(ttK)201 b(=)15 +b(0..1)218 b(/*)14 b(Num)o(b)q(er)f(of)g(king)g(attac)o(ks,)h(1)g(bit)f(*/) +344 2374 y(Coun)o(t)183 b(=)15 b(0..255)176 b(/*)14 b(Coun)o(t)f(of)g(attac)o +(ks)i(*/)p 262 2411 573 2 v 308 2437 a Fj(2)325 2449 y Fi(although)9 +b(not)i(the)g(mo)o(v)o(e's)e(t)o(yp)q(e)946 2574 y Fp(119)p +eop +%%Page: 120 122 +120 121 bop 344 307 a Fp(PieceList)131 b(=)15 b(13)p Ff(f)p +Fp(A)o(ttSq)p Ff(g)p Fp(13)51 b(/*)14 b(List)f(of)h(attac)o(king)f(pieces)i +(*/)344 357 y(A)o(ttSq)188 b(=)15 b(square)168 b(/*)14 b(Square)g(of)f(piece) +i(attac)o(king)e(this)h(sq)g(*/)344 407 y(square)179 b(=)15 +b(0..63)262 534 y(Tw)o(o)20 b(attac)o(k)h(tables)g(are)g(main)o(tained,)f +(one)h(for)f(white)h(attac)o(ks)g(and)g(one)g(for)f(blac)o(k)262 +583 y(attac)o(ks.)j(These)17 b(tables)f(represen)o(t)i(p)q(erhaps)e(the)h +(most)d(imp)q(ortan)o(t)g(data)h(structure)j(in)262 633 y(the)d(program.)j +(Eac)o(h)d(table)g(records)h(all)e(the)h(attac)o(ks)g(b)o(y)f(a)h(giv)o(en)f +(colour)g(on)h(eac)o(h)g(and)262 683 y(ev)o(ery)k(square.)31 +b(Additionally)m(,)17 b(a)h(list)f(of)h(eac)o(h)h(piece)g(attac)o(king)e(eac) +o(h)i(square)g(is)f(also)262 733 y(main)o(tained.)324 818 y(This)f(table,)g +(allo)o(ws)f(complex)g(in)o(ter{piece)j(calculations)d(whic)o(h)h(w)o(ould)g +(otherwise)262 868 y(b)q(e)e(v)o(ery)g(time)e(consuming.)20 +b(F)m(or)14 b(example,)f(it)i(is)f(a)h(simple)e(matter)h(to)h(\014nd)f(the)i +(square)262 918 y(o)q(ccupied)k(b)o(y)g(a)g(c)o(hec)o(king)g(piece;)k(in)19 +b(turn)h(it)g(is)g(simple)e(to)i(calculate)g(whether)i(this)262 +968 y(c)o(hec)o(king)14 b(piece)g(is)g(itself)g(threatened)h(with)f(capture.) +324 1053 y(The)d(ev)n(aluation)e(function)h(mak)o(es)f(extensiv)o(e)i(use)g +(of)f(the)h(attac)o(k/defence)h(balance)e(of)262 1103 y(eac)o(h)j(square.)18 +b(Therefore,)13 b(these)h(tables)f(are)g(of)f(cen)o(tral)h(imp)q(ortance)f +(to)g(the)h(ev)n(aluation)262 1152 y(function)k(as)h(they)g(allo)o(w)e(it)i +(to)f(mak)o(e)g(v)n(arious)g(p)q(ositional)f(ev)n(aluations)h(whic)o(h)g(w)o +(ould)262 1202 y(otherwise)d(b)q(e)h(far)e(to)q(o)h(time)f(consuming.)324 +1287 y(These)18 b(tables)g(also)e(con)o(tribute)i(to)f(the)h(mo)o(v)o(e)d +(generation)i(and)g(in)g(particular)g(the)262 1337 y(legal)11 +b(c)o(hec)o(k)i(ev)n(asion)f(and)g(capture)i(mo)o(v)o(e)c(generation)j +(routines)g(of)e(the)i(program.)j(They)262 1387 y(are)e(also)f(imp)q(ortan)o +(t)f(in)h(the)i(mo)o(v)o(e)d(ordering)i(pro)q(cess)i(b)q(ecause)f +(information)c(ab)q(out)j(at-)262 1437 y(tac)o(k)o(ed)e(squares)h(is)f(used)i +(to)e(order)g(mo)o(v)o(es)f(according)i(to)f(ho)o(w)f(reasonable)i(they)g +(app)q(ear.)262 1487 y(F)m(or)h(example,)f(mo)o(ving)f(an)j(en-prise)g(piece) +h(or)e(capturing)h(an)g(undefended)h(piece)f(is)g(or-)262 1537 +y(dered)k(higher)f(than)g(mo)o(ving)e(a)i(piece)h(to)f(a)g(square)g(where)i +(it)d(will)g(b)q(e)i(en-prise.)32 b(See)262 1586 y(section)14 +b(6.4.2)e(for)i(more)f(details.)324 1672 y(All)f(this)h(attac)o(k)h(orien)o +(ted)f(information)e(is)i(far)g(to)q(o)g(time)f(consuming)g(to)h(regenerate) +262 1721 y(at)e(eac)o(h)g(new)h(no)q(de.)17 b(In)12 b(fact,)f(eac)o(h)h(mo)o +(v)o(e)d(only)h(c)o(hanges)i(some)f(of)f(the)i(attac)o(k)f(prop)q(erties)262 +1771 y(of)i(a)h(p)q(osition.)k(F)m(or)13 b(example,)g(in)g(the)i(op)q(ening)f +(p)q(osition,)f(the)i(mo)o(v)o(e)d(e4)i(w)o(ould)g(require)262 +1821 y(only)h(the)j(attac)o(ks)f(of)f(the)h(white)g(queen,)g(king's)f(bishop) +h(and)f(king's)g(pa)o(wn)g(to)h(b)q(e)g(ad-)262 1871 y(justed.)24 +b(Therefore,)17 b(an)e(incremen)o(tal)g(approac)o(h)h(seems)f(to)h(b)q(e)g(w) +o(arran)o(ted.)24 b(Although)262 1921 y(there)17 b(are)g(mo)o(v)o(es)e(whic)o +(h)h(mak)o(e)f(this)h(incremen)o(tal)f(approac)o(h)h(v)o(ery)h(complex,)e +(e.g.)25 b(an)262 1970 y(en-passan)o(t)18 b(mo)o(v)o(e;)f(and)h(the)g +(programming)c(of)j(suc)o(h)h(an)g(approac)o(h)f(is)h(v)o(ery)g(tric)o(ky)m +(,)g(I)262 2020 y(ha)o(v)o(e)13 b(found)h(it)f(to)h(b)q(e)g(v)o(ery)h(cost)f +(e\013ectiv)o(e.)324 2105 y(The)19 b(added)f(information)e(a)o(v)n(ailable)g +(at)i(all)f(no)q(des)i(is)f(extremely)g(useful)g(and)g(has)262 +2155 y(man)o(y)13 b(applications,)g(some)i(of)f(whic)o(h)h(ha)o(v)o(e)g(b)q +(een)h(sho)o(wn.)21 b(In)16 b(fact,)e(I)h(feel)g(the)h(full)e(p)q(o-)262 +2205 y(ten)o(tial)9 b(of)h(ha)o(ving)f(suc)o(h)i(a)f(w)o(ealth)h(of)e +(information)f(has)i(not)h(as)f(y)o(et)h(b)q(een)g(fully)e(exploited.)262 +2255 y(I)14 b(do)h(not)f(kno)o(w)h(of)f(an)o(y)g(other)h(c)o(hess)i(programs) +c(whic)o(h)i(incremen)o(tally)e(main)o(tain)f(suc)o(h)262 2305 +y(a)h(comprehensiv)o(e)h(attac)o(k)g(table)g(throughout)g(the)g(searc)o(h.) +946 2574 y(120)p eop +%%Page: 121 123 +121 122 bop 262 307 a Fu(6.3.7)55 b(Game)17 b(History)344 434 +y Fp(GameHistory)53 b(=)63 b(0)p Ff(f)p Fp(Mo)o(v)o(eRecord)p +Ff(g)p Fp(512)344 483 y(Mo)o(v)o(eRecord)71 b(=)63 b(GMo)o(v)o(e)13 +b(+)h(GScore)h(+)f(CPiece)h(+)f(CColour)f(+)h(EPsq)h(+)734 +533 y(Dra)o(wmn)d(+)i(Depth)g(+)h(UTime)d(+)i(No)q(des)h(+)f(Ev)n(al)f(+)734 +583 y(Hash1)h(+)g(Hash2)344 633 y(GMo)o(v)o(e)165 b(=)63 b(Mo)o(v)o(e)344 +683 y(GScore)166 b(=)63 b(Score)344 732 y(CPiece)171 b(=)63 +b(PieceT)o(yp)q(e)344 782 y(CColour)142 b(=)63 b(colour)344 +832 y(EPsq)201 b(=)63 b(square)344 882 y(Dra)o(wmn)138 b(=)63 +b(0..512)344 932 y(Depth)183 b(=)63 b(1..32)344 982 y(UTime)168 +b(=)63 b(long)13 b(in)o(teger)344 1031 y(No)q(des)185 b(=)63 +b(long)13 b(in)o(teger)344 1081 y(Ev)n(al)214 b(=)63 b(long)13 +b(in)o(teger)344 1131 y(Hash1)183 b(=)63 b(long)13 b(in)o(teger)344 +1181 y(Hash2)183 b(=)63 b(long)13 b(in)o(teger)262 1308 y(The)i(game)e +(history)i(data)g(structure)i(records)f(the)g(imp)q(ortan)o(t)d(elemen)o(ts)i +(of)f(eac)o(h)h(mo)o(v)o(e)262 1357 y(so)h(it)h(can)f(b)q(e)i(accurately)f +(rev)o(ersed,)i(if)d(necessary)m(.)28 b(This)16 b(structure)j(is)e(used)g +(for)f(b)q(oth)262 1407 y(actual)d(mo)o(v)o(es)g(pla)o(y)o(ed)g(in)g(the)i +(game)d(and)i(mo)o(v)o(es)f(made)f(while)i(searc)o(hing.)324 +1492 y(Dra)o(wmn)f(represen)o(ts)18 b(the)e(mo)o(v)o(e)e(n)o(um)o(b)q(er)h +(of)f(the)i(last)f(irrev)o(ersible)i(mo)o(v)o(e.)j(This)c(is)262 +1542 y(used)j(to)g(ease)g(detection)h(of)e(the)h(dra)o(w)g(b)o(y)f(3-fold)g +(rep)q(etition)h(or)f(the)i(50)e(mo)o(v)o(e)f(rule.)262 1592 +y(EPsq)e(is)f(stored)h(so)g(the)g(p)q(ossible)g(en-passan)o(t)g(capture)g +(square)g(can)g(b)q(e)g(restored)h(when)262 1642 y(the)f(mo)o(v)o(e)e(is)i +(rev)o(ersed.)23 b(GScore)15 b(stores)i(the)e(p)q(ositional)f(v)n(alue)g(of)g +(an)o(y)h(piece)g(captured)262 1692 y(to)d(enable)h(incremen)o(tal)f(ev)n +(aluation)g(and)h(restoration)g(while)g(searc)o(hing)g(and)g(stores)h(the)262 +1742 y(mo)o(v)o(e)e(score)j(for)e(mo)o(v)o(es)g(actually)g(pla)o(y)o(ed.)324 +1827 y(UTime,)18 b(No)q(des,)i(Ev)n(al)e(and)h(Depth)g(are)g(all)f +(measuremen)o(ts)g(stored)i(after)f(actual)262 1877 y(mo)o(v)o(es)10 +b(are)i(pla)o(y)o(ed.)17 b(The)12 b(other)g(\014elds,)g(GMo)o(v)o(e,)g +(CPiece,)g(CColour,)f(Hash1)h(and)g(Hash2)262 1926 y(are)i(used)h(to)e(allo)o +(w)g(easy)h(rev)o(ersal)h(of)e(an)o(y)g(mo)o(v)o(e.)946 2574 +y(121)p eop +%%Page: 122 124 +122 123 bop 262 307 a Fr(6.4)69 b(The)23 b(Algorithms)262 434 +y Fp(This)18 b(section)i(explains)e(some)g(of)g(the)h(more)f(critical)g +(algorithms)f(used)i(in)f(HIAR)o(CS.)262 483 y(Man)o(y)12 b(other)h +(algorithms)e(are)i(used)g(and)g(I)g(w)o(ould)e(refer)j(the)g(reader)g(to)e +(the)h(actual)g(co)q(de)262 533 y(listing)f(if)h(more)g(details)h(ab)q(out)g +(these)h(algorithms)d(are)i(required.)262 685 y Fu(6.4.1)55 +b(Mo)n(v)n(e)19 b(Generation)262 797 y Fp(The)11 b(mo)o(v)o(e)e(generation)h +(routine)h(used)h(dep)q(ends)g(on)e(the)i(t)o(yp)q(e)f(of)f(searc)o(h)i(b)q +(eing)e(emplo)o(y)o(ed)262 847 y(at)19 b(a)h(giv)o(en)f(no)q(de)i(and)e(the)i +(state)g(of)e(that)h(no)q(de.)36 b(Three)21 b(di\013eren)o(t)g(t)o(yp)q(es)g +(of)e(mo)o(v)o(e)262 896 y(generation)14 b(can)g(b)q(e)g(p)q(erformed:)312 +1015 y(1.)20 b Fl(F)l(ull)c(Pseudo)g(Legal)g(Mo)o(v)o(e)h(Generation)p +Fp(:)g(P)o(erformed)e(at)g(all)f(no)q(des)i(in)f(the)365 1065 +y(main)d(searc)o(h)j(tree)g(where)g(the)g(pla)o(y)o(er)e(to)h(mo)o(v)o(e)e +(is)i(not)p 1193 1072 60 2 v 14 w(in-c)o(hec)o(k.)312 1148 +y(2.)20 b Fl(F)l(ull)11 b(Legal)h(Mo)o(v)o(e)h(Generation)p +Fp(:)h(P)o(erformed)c(at)i(all)e(no)q(des)i(in)f(the)h(searc)o(h)g(tree)365 +1198 y(where)j(the)g(pla)o(y)o(er)e(to)h(mo)o(v)o(e)e(is)i(in-c)o(hec)o(k.) +312 1281 y(3.)20 b Fl(Selectiv)o(e)c(T)l(actical)i(Mo)o(v)o(e)h(Generation)p +Fp(:)h(P)o(erformed)c(at)g(all)f(no)q(des)i(in)f(the)365 1330 +y(quiescence)g(searc)o(h)f(tree)g(where)h(the)e(pla)o(y)o(er)g(to)f(mo)o(v)o +(e)f(is)i(not)p 1291 1337 V 14 w(in-c)o(hec)o(k.)262 1474 y +Fl(F)l(ull)g(Pseudo)g(Legal)h(Mo)o(v)o(e)g(Generation)262 1586 +y Fp(This)20 b(routine)g(generates)j(all)c(pseudo)i(legal)e(mo)o(v)o(es)g(in) +h(the)h(curren)o(t)h(p)q(osition.)37 b(The)262 1636 y(legalit)o(y)12 +b(of)h(eac)o(h)h(mo)o(v)o(e)f(is)g(not)h(c)o(hec)o(k)o(ed)h(at)f(this)g +(stage)g(for)g(2)g(reasons:)324 1754 y Ff(\017)20 b Fp(Most)14 +b(mo)o(v)o(es)f(ma)o(y)f(not)i(need)h(searc)o(hing)f(at)g(all)e(b)q(ecause)k +(of)d Fh(\013\014)k Fp(cut)d(o\013s.)324 1837 y Ff(\017)20 +b Fp(Most)14 b(mo)o(v)o(es)f(are)h(legal)f(in)g(p)q(ositions)g(where)i(a)f +(king)f(is)g(not)h(in)f(c)o(hec)o(k.)19 b(Therefore)365 1887 +y(it)14 b(w)o(ould)f(b)q(e)h(w)o(asteful)g(to)g(test)h(for)e(the)i +(exceptional)f(case)h(at)e(this)h(stage.)324 2005 y(All)d(mo)o(v)o(es)h(are)g +(generated)i(using)e(an)h(o\013set)g(metho)q(d)f(via)f(a)h(set)i(of)e(mo)o(v) +o(e)e(generation)262 2055 y(tables.)35 b(F)m(or)19 b(example,)g(to)g(mo)o(v)o +(e)f(in)h(direction)h(3)f(\()p Ff(\000)p Fp(8)h(o\013set\))g(the)g(curren)o +(t)h(square,)262 2105 y Fm(sq1)c Fp(sa)o(y)m(,)g(is)f(used)i(as)f(an)g(index) +g(in)o(to)g(a)f(table)h(whic)o(h)g(giv)o(es)g(the)h(resulting)f('to)f +(square')262 2155 y(\()p Fm(sq1)p Ff(\000)p Fp(8\).)23 b(If)15 +b(the)h('to)f(square')h(is)f(o\013)h(the)g(b)q(oard,)f(the)i(n)o(um)o(b)q(er) +d(128)h(is)g(returned)j(\(most)262 2205 y(signi\014can)o(t)10 +b(bit)h(set\).)18 b(This)11 b(metho)q(d)g(a)o(v)o(oids)f(the)i(need)g(to)f +(ha)o(v)o(e)g(a)g(b)q(oundary)g(around)g(the)262 2254 y(b)q(oard,)16 +b(therefore)i(allo)o(wing)c(a)i(64)g(square)h(b)q(oard.)25 +b(As)17 b(explained)f(earlier,)g(this)h(allo)o(ws)262 2304 +y(con)o(v)o(enien)o(t)d(12)f(bit)h(mo)o(v)o(e)e(storage.)324 +2389 y(All)h(non)h(capture/sp)q(ecial)h(mo)o(v)o(es)d(are)j(generated)g +(using)f(these)h(mo)o(v)o(e)e(tables.)18 b(Cap-)262 2439 y(tures)12 +b(are)g(generated)h(directly)f(from)d(the)j(appropriate)g(attac)o(k)f(table.) +18 b(P)o(a)o(wn)11 b(promotion)946 2574 y(122)p eop +%%Page: 123 125 +123 124 bop 262 307 a Fp(to)17 b(minor)e(pieces)k(is)e(catered)i(for,)e(eac)o +(h)h(mo)o(v)o(e)d(ha)o(ving)i(the)g(same)g(12)g(bit)g(mo)o(v)o(e)e(co)q(de,) +262 357 y(but)e(a)h(di\013eren)o(t)h(mo)o(v)o(e)d(t)o(yp)q(e.)18 +b(Castling)13 b(mo)o(v)o(es)f(are)j(generated)g(only)e(if)f(the)j(follo)o +(wing)c(5)262 407 y(conditions)i(are)h(met:)312 525 y(1.)20 +b(The)15 b(king)e(has)h(nev)o(er)h(mo)o(v)o(ed.)312 608 y(2.)20 +b(The)15 b(ro)q(ok)e(in)o(v)o(olv)o(ed)g(has)h(nev)o(er)h(mo)o(v)o(ed.)312 +691 y(3.)20 b(The)15 b(squares)g(b)q(et)o(w)o(een)g(the)f(king)g(and)f(ro)q +(ok)h(are)g(empt)o(y)m(.)312 774 y(4.)20 b(The)15 b(king)e(is)g(not)h(in)g(c) +o(hec)o(k.)312 857 y(5.)20 b(The)c(king)f(will)f(not)i(pass)g(through)g(or)f +(in)o(to)g(c)o(hec)o(k)i(as)e(part)h(of)f(the)h(castling)f(ma-)365 +907 y(no)q(euvre.)262 1026 y(The)f(incremen)o(tal)f(attac)o(k)h(table)f(is)h +(v)o(ery)g(useful)g(for)g(c)o(hec)o(king)g(conditions)g(4)f(and)h(5.)324 +1111 y(En-passan)o(t)h(mo)o(v)o(es)e(are)h(tested)i(and)e(generated)i(b)o(y)e +(c)o(hec)o(king)g(the)h(relev)n(an)o(t)g(attac)o(k)262 1161 +y(table)e(for)h(pa)o(wn)f(attac)o(ks)i(on)e(the)i(curren)o(t)g(en-passan)o(t) +g(square)f(\(if)f(an)o(y\).)262 1304 y Fl(F)l(ull)h(Legal)g(Mo)o(v)o(e)i +(Generation)262 1416 y Fp(When)10 b(the)h(king)e(is)h(in)g(c)o(hec)o(k,)i +(most)d(pseudo)i(legal)e(mo)o(v)o(es)g(are)i(in)f(fact)g(illegal.)15 +b(Therefore,)262 1466 y(it)e(mak)o(es)g(sense)i(to)f(generate)h(only)e(legal) +g(mo)o(v)o(es)g(when)h(the)h(king)e(is)h(in)f(c)o(hec)o(k.)324 +1551 y(It)h(is)f(surprising)h(ho)o(w)g(man)o(y)e(c)o(hess)j(programs)d(con)o +(tin)o(ue)i(to)g(generate)h(pseudo)g(legal)262 1601 y(mo)o(v)o(es)c(ev)o(en)j +(when)f(the)g(king)g(is)f(in)h(c)o(hec)o(k.)18 b(They)13 b(then)h(w)o(aste)f +(time)f(pro)o(ving)g(that)h(most)262 1651 y(of)e(the)i(mo)o(v)o(es)e +(generated)j(are)f(in)f(fact)g(illegal.)j(Admittedly)m(,)c(it)h(do)q(es)h +(tak)o(e)f(some)g(sophis-)262 1701 y(ticated)g(data)f(structures)k(to)c +(enable)h(suc)o(h)h(legal)d(mo)o(v)o(e)h(generation)h(to)f(b)q(e)i +(accomplished)262 1750 y(e\016cien)o(tly)m(.)j(My)10 b(incremen)o(tal)g +(attac)o(k)h(tables)g(do)f(pro)o(vide)g(enough)h(information)d(to)i(allo)o(w) +262 1800 y(suc)o(h)k(mo)o(v)o(e)f(generation)h(to)g(b)q(e)g(done)g(v)o(ery)h +(e\016cien)o(tly)m(.)i(In)d(fact,)g(in)f(tests,)i(I)f(ha)o(v)o(e)g(found)262 +1850 y(legal)f(mo)o(v)o(e)f(generation)j(is)f(appro)o(ximately)d(10)j(times)f +(faster)i(than)f(pseudo)h(legal)e(mo)o(v)o(e)262 1900 y(generation)h(and)f(v) +n(alidation,)e(assuming)i(no)g Fh(\013\014)k Fp(cut)d(o\013s)g(o)q(ccur.)324 +1985 y(Legal)f(mo)o(v)o(es)g(when)h(in)f(c)o(hec)o(k)i(fall)e(in)o(to)g(one)h +(of)f(the)i(follo)o(wing)c(3)j(categories:)312 2104 y(1.)20 +b(King)14 b(mo)o(v)o(es)e(to)i(unattac)o(k)o(ed)g(squares.)312 +2187 y(2.)20 b(Captures)15 b(of)e(the)i(c)o(hec)o(king)f(piece)h(b)o(y)f +(pieces)h(not)f(pinned)g(to)f(the)i(king.)312 2270 y(3.)20 +b(In)o(terp)q(osition)10 b(b)q(et)o(w)o(een)g(the)g(king)f(and)g(the)h(c)o +(hec)o(king)g(piece,)g(b)o(y)g(pieces)g(not)f(pinned)365 2319 +y(to)14 b(the)h(king.)946 2574 y(123)p eop +%%Page: 124 126 +124 125 bop 262 307 a Fp(In)16 b(category)h(1,)f(it)g(is)g(imp)q(ortan)o(t)f +(to)h(tak)o(e)h(accoun)o(t)g(of)e(c)o(hec)o(ks)j(b)o(y)e(v)o(ector)h(t)o(yp)q +(e)g(pieces)262 357 y(\(bishop,)e(ro)q(ok)h(and)f(queen\))i(as)f(these)h +(e\013ectiv)o(ely)f(attac)o(k)g(squares)h(through)f(the)g(king.)262 +407 y(These)f(attac)o(ks)f(are)g(not)g(ob)o(vious)f(from)f(the)j(attac)o(k)f +(tables)g(themselv)o(es.)324 492 y(Note)j(when)g(in)f(double)g(c)o(hec)o(k,)h +(only)f(king)g(mo)o(v)o(es)f(need)i(to)f(b)q(e)h(generated)h(as)f(it)f(is)262 +542 y(imp)q(ossible)c(to)i(get)g(out)f(of)h(c)o(hec)o(k)h(b)o(y)e(pla)o(ying) +g(mo)o(v)o(es)f(in)i(categories)g(2)g(or)g(3.)324 627 y(Generating)f(only)g +(legal)g(mo)o(v)o(es)f(giv)o(es)h(an)g(added)h(b)q(ene\014t)h(to)f(the)g +(program's)d(searc)o(h)262 677 y(extensions:)17 b(It)11 b(is)f(kno)o(wn)g(b)q +(efore)h(searc)o(hing)h(an)o(y)e(mo)o(v)o(es,)f(ho)o(w)h(man)o(y)f(legal)g +(mo)o(v)o(es)h(exist,)262 727 y(ho)o(w)f(man)o(y)g(legal)g(king)g(mo)o(v)o +(es)g(exist)i(and)f(whether)i(the)e(c)o(hec)o(k)i(is)e(doubled)g(or)g(disco)o +(v)o(ered.)262 870 y Fl(Selectiv)o(e)j(T)l(actical)i(Mo)o(v)o(e)g(Generation) +262 982 y Fp(Mo)o(v)o(es)f(generated)i(in)d(the)i(quiescence)i(searc)o(h)e +(when)g(not)f(in)g(c)o(hec)o(k)h(are)g(rather)g(limited)262 +1032 y(to)j(ob)o(vious)g(tactical)h(mo)o(v)o(es.)32 b(Only)18 +b(t)o(w)o(o)h(tactical)f(mo)o(v)o(e)g(categories)h(are)h(generated,)262 +1082 y(captures)15 b(and)f(pa)o(wn)f(promotions.)324 1167 y(Only)k(pa)o(wn)h +(promotions)e(to)h(a)h(queen)h(are)f(considered.)31 b(All)17 +b(capture)i(mo)o(v)o(es)d(are)262 1217 y(generated)h(with)e(the)i(exception)g +(of)e(en-passan)o(t.)25 b(These)17 b(sp)q(ecial)g(case)g(mo)o(v)o(es)d(are)j +(not)262 1267 y(considered)h(cost)g(e\013ectiv)o(e)h(enough)f(to)f(w)o(arran) +o(t)g(inclusion)g(in)g(this)h(mo)o(v)o(e)d(generation)262 1316 +y(pro)q(cess.)k(All)13 b(mo)o(v)o(es)g(generated)i(b)o(y)f(this)g(phase)g +(are)h(only)e(pseudo-legal.)262 1468 y Fu(6.4.2)55 b(Mo)n(v)n(e)19 +b(Ordering)262 1580 y Fp(As)f(explained)g(in)g(c)o(hapter)h(3,)f(mo)o(v)o(e)f +(ordering)h(is)g(vital)f(to)h(the)h(e\016ciency)g(of)f(the)g +Fh(\013\014)262 1630 y Fp(searc)o(h)d(algorithm.)i(T)m(o)c(ac)o(hiev)o(e)i +(the)g(optimal)d Fh(\013\014)k Fp(searc)o(h)g(tree,)f(it)f(is)g(not)p +1398 1637 60 2 v 14 w(necessary)j(to)262 1680 y(examine)12 +b(mo)o(v)o(es)h(in)g(a)h(strictly)g(b)q(est)h(to)f(w)o(orst)g(order)g(at)g +(eac)o(h)h(no)q(de.)324 1765 y(The)f(optimal)d Fh(\013\014)17 +b Fp(searc)o(h)e(tree)g(can)f(b)q(e)g(ac)o(hiev)o(ed)h(b)o(y:)324 +1883 y Ff(\017)20 b Fp(Along)13 b(a)g(v)n(ariation)e(whic)o(h)i(will)f(b)q +(ecome)h(the)h(new)f(principle)g(v)n(ariation,)f(the)h(b)q(est)365 +1933 y(mo)o(v)o(e)g(m)o(ust)f(b)q(e)j(examined)e(\014rst)h(at)g(eac)o(h)g +(ply)m(.)324 2016 y Ff(\017)20 b Fp(The)e(\014rst)g(mo)o(v)o(e)e(explored)i +(at)f(ev)o(en)h(ply)f(depths)h(m)o(ust)f(b)q(e)h(a)f(refutation)g(mo)o(v)o +(e,)365 2066 y(e.g.)h(one)c(that)g(causes)h(a)f Fh(\014)i Fp(cut)f(o\013.)324 +2149 y Ff(\017)20 b Fp(A)o(t)11 b(o)q(dd)f(ply)g(depths)i(whic)o(h)e(are)h +(not)f(part)h(of)f(a)g(new)h(principle)f(v)n(ariation,)g(ordering)365 +2199 y(is)16 b(unimp)q(ortan)o(t)f(pro)o(vided)h(a)f(refutation)h(mo)o(v)o(e) +f(is)h(examined)f(\014rst)h(at)g(the)h(next)365 2249 y(depth.)262 +2367 y(It)c(can)i(b)q(e)f(seen)h(from)d(these)k(p)q(oin)o(ts)d(that)h(it)g +(is)f(vital)g(to)h(examine)e(refutation)i(mo)o(v)o(es)f(as)262 +2417 y(early)k(as)g(p)q(ossible.)28 b(In)17 b(HIAR)o(CS,)f(the)i(mo)o(v)o(e)e +(ordering)h(algorithm's)d(basic)k(aim)d(is)i(to)946 2574 y(124)p +eop +%%Page: 125 127 +125 126 bop 262 307 a Fp(alw)o(a)o(ys)12 b(examine)g(the)i(b)q(est)h(mo)o(v)o +(e)d(\014rst.)18 b(Ho)o(w)o(ev)o(er,)c(emphasis)f(is)g(placed)h(on)f +(examining)262 357 y(mo)o(v)o(es)f(lik)o(ely)h(to)g(cause)i +Fh(\014)i Fp(cut)d(o\013)s('s,)g(e.g.)k(capturing)13 b(the)i(piece)g(just)f +(mo)o(v)o(ed.)324 442 y(The)19 b(main)e(mo)o(v)o(e)h(ordering)h(algorithm)e +(is)i(p)q(erformed)f(while)h(generating)g(mo)o(v)o(es.)262 +492 y(Ho)o(w)o(ev)o(er,)10 b(a)f(signi\014can)o(t)g(prop)q(ortion)g(of)g(the) +h(time,)f(HIAR)o(CS)g(do)q(es)h(not)g(need)g(to)f(generate)262 +542 y(an)o(y)i(mo)o(v)o(es.)16 b(This)c(is)g(b)q(ecause)h(at)f(eac)o(h)g(no)q +(de)h(the)f(refutation)g(and)g(transp)q(osition)f(tables)262 +592 y(are)16 b(prob)q(ed,)h(p)q(ossibly)e(resulting)h(in)g(a)f(mo)o(v)o(e)g +(b)q(eing)h(prop)q(osed.)25 b(An)o(y)15 b(mo)o(v)o(e)g(prop)q(osed)262 +641 y(b)o(y)h(these)j(tables)e(has)h(a)f(high)f(probabilit)o(y)g(of)g +(causing)h(a)g(refutation.)28 b(It)17 b(is)g(therefore)262 +691 y(explored)d(\014rst)g(without)g(generating)g(an)o(y)f(mo)o(v)o(es.)k(If) +d(a)f(cut)i(o\013)f(is)f(ac)o(hiev)o(ed,)h(the)g(costly)262 +741 y(exercise)h(of)f(mo)o(v)o(e)e(generation)i(and)g(ordering)f(is)h(a)o(v)o +(oided)f(altogether.)324 826 y(Tw)o(o)i(mo)o(v)o(e)g(ordering)h(algorithms)e +(are)j(used,)g(one)f(during)g(b)q(oth)g(the)h(pseudo)g(legal)262 +876 y(and)12 b(legal)f(mo)o(v)o(e)g(generation)i(routines)g(and)f(one)h +(during)f(quiescence)j(mo)o(v)o(e)c(generation.)262 1020 y +Fl(F)l(ull)j(Mo)o(v)o(e)h(Ordering)262 1132 y Fp(As)g(mo)o(v)o(es)f(are)i +(generated)h(in)e(the)h(full)e(pseudo)i(or)f(legal)g(mo)o(v)o(e)e(generation) +j(routines)g(a)262 1181 y(score)d(is)e(assigned.)18 b(This)12 +b(score)h(allo)o(ws)e(the)h(mo)o(v)o(es)f(generated)i(to)f(b)q(e)g(ordered)h +(on)f(merit.)262 1231 y(While)f(the)i(score)g(do)q(es)g(represen)o(t)i(an)d +(estimate)g(of)f(the)i(mo)o(v)o(e's)e(v)n(alue,)g(it)h(also)g(attempts)262 +1281 y(to)h(estimate)h(the)g(lik)o(eliho)q(o)q(d)e(of)h(the)i(mo)o(v)o(e)d +(causing)i(a)g(cut)g(o\013.)324 1366 y(Eac)o(h)g(mo)o(v)o(e)e(is)i(scored)h +(b)o(y)f(the)g(follo)o(wing)e(pro)q(cedure:)312 1485 y(1.)20 +b(The)13 b(mo)o(v)o(e)d(is)i(lo)q(ok)o(ed)f(up)h(in)f(the)i(history)f(table)g +(and)f(the)i(v)n(alue)e(found)h(is)f(assigned)365 1535 y(as)j(the)h(mo)o(v)o +(e's)d(initial)g(score.)312 1618 y(2.)20 b(When)13 b(a)e(mo)o(v)o(e)g(is)h +(found)g(to)g(b)q(e)g(b)q(est)i(at)e(a)g(giv)o(en)f(no)q(de)i(in)e(the)i +(tree)h(it)d(is)h(stored)i(as)365 1667 y(a)g(killer)f(mo)o(v)o(e)f(and)i(giv) +o(en)g(an)f(appropriate)h(v)n(alue.)k(In)c(HIAR)o(CS,)f(3)h(killer)f(mo)o(v)o +(es)365 1717 y(are)i(stored)g(at)f(eac)o(h)h(ply)m(,)e(2)g(for)h(mo)o(v)o(es) +f(causing)h(cut)h(o\013)s('s)f(and)g(1)g(for)g(non)g(cut)h(o\013)365 +1767 y(mo)o(v)o(es.)365 1833 y(The)d(mo)o(v)o(e)e(ordering)h(algorithm)e(c)o +(hec)o(ks)k(the)f(mo)o(v)o(e)d(against)i(the)h(follo)o(wing)d(stored)365 +1883 y(killer)k(mo)o(v)o(es:)383 1966 y(\(a\))21 b(Refutation)13 +b(killer's)g(1)g(and)h(2)f(at)h(this)g(ply)m(.)381 2033 y(\(b\))21 +b(Normal)11 b(killer)j(3)f(at)h(this)g(ply)m(.)385 2099 y(\(c\))22 +b(Refutation)13 b(killer)g(1)g(at)h(ply)p Ff(\000)p Fp(2.)365 +2182 y(If)i(the)h(mo)o(v)o(e)e(is)h(a)g(killer)f(mo)o(v)o(e)f(at)j(this)f +(depth)h(of)e(the)i(tree,)h(the)f(score)g(is)f(incre-)365 2232 +y(men)o(ted)e(b)o(y)f(the)i(resp)q(ectiv)o(e)h(killer)d(v)n(alue.)365 +2298 y(This)j(heuristic)h(supp)q(orts)g(the)g(history)f(heuristic)h(b)o(y)e +(suggesting)i(recen)o(t)g(strong)365 2348 y(mo)o(v)o(es)g(at)h(the)h(curren)o +(t)h(depth.)32 b(It)18 b(is)g(often)g(the)h(case)g(that)f(the)h(last)f(mo)o +(v)o(e)f(to)365 2398 y(cause)c(a)f(refutation)f(at)h(a)g(giv)o(en)f(depth)i +(will)d(rep)q(eatedly)j(ac)o(hiev)o(e)f(the)h(same)e(result)365 +2448 y(in)j(other)g(p)q(ositions)g(at)g(the)g(same)f(depth.)946 +2574 y(125)p eop +%%Page: 126 128 +126 127 bop 312 307 a Fp(3.)20 b(If)15 b(the)h(mo)o(v)o(e)d(captures)k(the)f +(piece)g(just)f(mo)o(v)o(ed)e(b)o(y)i(the)h(opp)q(onen)o(t,)f(it)g(receiv)o +(es)i(a)365 357 y(b)q(on)o(us)c(score)h(of)d(400)h(p)q(oin)o(ts.)17 +b(This)c(indicates)f(the)h(imp)q(ortance)f(of)g(suc)o(h)h(mo)o(v)o(es)e(in) +365 407 y(causing)j(refutations.)312 486 y(4.)20 b(The)15 b(estimate)e(is)h +(then)g(mo)q(di\014ed)f(b)o(y:)448 556 y Fh(C)s(P)6 b(T)14 +b Ff(\000)c Fh(S)r(W)c(P)15 b Fp(+)10 b Fh(E)r(N)5 b(P)365 +656 y Fl(where)448 706 y Fp(CPT)14 b(:)63 b(is)14 b(the)g(v)n(alue)g(of)f +(the)h(captured)h(piece,)g(if)e(an)o(y)m(,)f(otherwise)j(0.)448 +805 y(SWP)f(:)57 b(is)14 b(the)g(estimated)g(v)n(alue)f(of)g(the)i(p)q(oten)o +(tial)e(exc)o(hanges)i(on)f(the)g(to)625 855 y(square.)19 b(De\014ned)c(b)o +(y:)448 955 y(SWP)f(=)37 b Fl(if)13 b Fp(\()p Fl(not)g Fp(A)o(ttac)o(k)o +(ed\([An)o(y],Opp\(col\),to\)\))684 1005 y(0)625 1054 y Fl(else)684 +1104 y(if)g Fp(\()p Fl(not)g Fp(A)o(ttac)o(k)o(ed\([An)o(y],col,to\)\))743 +1154 y Fh(M)5 b(T)812 1160 y Fe(col;f)s(r)q(om)684 1204 y Fl(else)743 +1254 y(if)13 b Fp(\(A)o(ttac)o(k)o(ed\([An)o(y)h Fh(<)g Fp +(On\(from\)],Opp\(col\),to\))743 1303 y Fl(or)g Fh(])p Fp(Di\013A)o(ttac)o +(ks\(Opp\(col\),to\))g Fh(>)g Fp(0\))802 1353 y Fl(if)f Fp(\(Con)o +(trol\(to\))g(=)i(col\))861 1403 y Fh(M)5 b(T)930 1409 y Fe(col;f)s(r)q(om) +1066 1403 y Fh(=)p Fp(2)802 1453 y Fl(else)861 1503 y Fh(M)g(T)930 +1509 y Fe(col;f)s(r)q(om)802 1553 y Fl(endif)743 1602 y(else)802 +1652 y(if)13 b Fp(\(Con)o(trol\(to\))g(=)i(col\))861 1702 y(0)802 +1752 y Fl(else)861 1802 y Fh(M)5 b(T)930 1808 y Fe(col;f)s(r)q(om)1066 +1802 y Fh(=)p Fp(2)802 1851 y Fl(endif)743 1901 y(endif)684 +1951 y(endif)625 2001 y(endif)448 2100 y Fh(M)g(T)517 2106 +y Fe(col;sq)603 2100 y Fp(:)10 b(See)15 b(ev)n(aluation)d(function)i +(de\014nition)f(1,)h(Material.)448 2200 y(ENP)g(:)64 b(Represen)o(ts)16 +b(an)e(estimate)f(of)g(the)i(threat)f(to)g(the)h(mo)o(ving)c(piece)k(on)e +(its)625 2250 y(original)f(square,)i(e.g.)k(its)c(urgency)h(to)e(mo)o(v)o(e.) +k(De\014ned)d(b)o(y:)448 2350 y(ENP)g(=)44 b Fl(if)13 b Fp(\(A)o(ttac)o(k)o +(ed\([An)o(y)h Fh(<)g Fp(On\(from\)],Opp\(col\),from)o(\)\))684 +2399 y Fh(M)5 b(T)753 2405 y Fe(col;f)s(r)q(om)889 2399 y Fh(=)p +Fp(16)625 2449 y Fl(endif)946 2574 y Fp(126)p eop +%%Page: 127 129 +127 128 bop 365 357 a Fp(Note:)19 b('from')11 b(and)j('to')e(are)j(the)f +(from)e(and)i(to)g(squares)h(of)e(the)i(generated)g(mo)o(v)o(e.)365 +448 y(SWP)9 b(and)h(ENP)f(are)h(only)f(calculated)g(if)f(the)i(History)g(and) +f(Killer)g(v)n(alues)g(summed,)365 498 y(are)16 b(less)f(than)g(32.)21 +b(This)14 b(a)o(v)o(oids)g(go)q(o)q(d)h(refutation)g(mo)o(v)o(es)e(b)q(eing)i +(badly)f(ordered)365 548 y(b)q(ecause)k(they)f(lo)q(ok)e(inferior)g(to)h +(this)g(score)i(estimator,)d(when)i(in)e(fact)h(previous)365 +598 y(searc)o(hing)f(has)f(sho)o(wn)g(them)f(to)g(b)q(e)i(go)q(o)q(d)e(in)h +(the)g(past.)262 740 y Fl(Quiescence)f(Mo)o(v)o(e)j(Ordering)262 +852 y Fp(In)h(the)g(selectiv)o(e)i(tactical)d(mo)o(v)o(e)g(generator,)i(mo)o +(v)o(es)e(are)i(scored)g(b)o(y)f(their)h(optimistic)262 902 +y(p)q(ossibilities.)33 b(This)19 b(is)g(to)g(enable)h(the)f(forw)o(ard)g +(pruning)g(mec)o(hanism)e(explained)i(in)262 951 y(section)14 +b(5.4,)f(note)h(3.)324 1037 y(All)g(capture)j(mo)o(v)o(es)d(are)i(scored)h(b) +o(y)e(the)h(v)n(alue)f(of)g(the)h(piece)g(captured)h(min)o(us)d(the)262 +1086 y(capturing)i(piece's)i(represen)o(tation)h(\(1-6\),)d(e.g.)27 +b(3)17 b(for)f(a)h(bishop.)27 b(This)16 b(results)i(in)f(an)262 +1136 y(ordering)j(where)i(captures)g(of)e(higher)h(v)n(alued)f(pieces)i(are)f +(examined)f(\014rst.)39 b(Where)262 1186 y(more)13 b(than)h(one)h(w)o(a)o(y)f +(to)g(capture)i(a)e(piece)h(exists,)g(the)g(mo)o(v)o(es)e(are)i(further)g +(ordered)h(b)o(y)262 1236 y(considering)e(captures)h(b)o(y)f(the)g(lo)o(w)o +(er)g(v)n(alued)f(pieces)i(\014rst.)324 1321 y(This)g(is)f(kno)o(wn)h(as)g +(Minor)f(to)h(Ma)r(jorC)g(ordering)g(and)g(has)g(b)q(een)h(sho)o(wn)f(to)f(b) +q(e)i(the)262 1371 y(most)c(e\013ectiv)o(e)k(ordering)d(of)h(capture)h(mo)o +(v)o(es)d([10)o(].)324 1456 y(P)o(a)o(wn)j(promotions)f(receiv)o(e)j(an)e +(estimated)g(score)i(of)e(QueenV)m(alue)h Ff(\000)g Fp(P)o(a)o(wnV)m(alue.) +262 1506 y(Where)i(the)h(promotion)d(is)h(also)h(a)f(capture,)j(the)e(score)i +(is)d(further)i(increased)g(b)o(y)f(the)262 1556 y(capture)d(score)g +(explained)e(ab)q(o)o(v)o(e.)324 1641 y(Although)f(all)g(the)h(ordering)g +(algorithms)d(score)k(mo)o(v)o(es)e(as)h(they)g(are)g(generated,)h(the)262 +1691 y(mo)o(v)o(es)g(are)i(not)g(fully)e(sorted)i(in)o(to)f(order.)24 +b(Only)16 b(the)g(b)q(est)h(mo)o(v)o(e)d(not)h(y)o(et)h(searc)o(hed)i(is)262 +1741 y(required)d(to)f(b)q(e)h(sorted)g(as)f(it)g(ma)o(y)e(itself)i(cause)h +(a)f(cut)h(o\013,)f(a)o(v)o(oiding)e(the)j(need)g(for)f(an)o(y)262 +1791 y(more)e(sorting.)262 1941 y Fu(6.4.3)55 b(T)-5 b(ree)18 +b(Searc)n(hing)262 2053 y Fp(The)g(actual)f(searc)o(h)i(tec)o(hniques)g +(emplo)o(y)o(ed)d(in)h(HIAR)o(CS)g(w)o(ere)i(explained)e(and)h(illus-)262 +2103 y(trated)g(in)f(c)o(hapter)i(5,)f(T)m(ree)h(Searc)o(hing.)30 +b(Ho)o(w)o(ev)o(er,)18 b(some)f(of)g(the)i(w)o(ork)e('b)q(ehind)h(the)262 +2152 y(scenes')e(of)e(the)i(searc)o(h)g(pro)q(cedures)h(w)o(as)e(not)g +(explained.)21 b(This)15 b(section)h(will)d(therefore)262 2202 +y(highligh)o(t)f(these)j(more)e(implemen)o(tatio)o(nal)d(tasks)15 +b(whic)o(h)f(the)g(searc)o(h)h(m)o(ust)e(p)q(erform.)324 2287 +y(Three)i(searc)o(h)g(routines)f(are)h(used)f(in)g(HIAR)o(CS:)312 +2399 y(1.)20 b Fl(Ro)q(ot)p Fp(:)j(This)17 b(recursiv)o(e)h(function)f(o)o(v) +o(ersees)h(and)f(con)o(trols)g(the)g(searc)o(h)h(pro)q(cess.)365 +2449 y(It)c(p)q(erforms)g(the)g(follo)o(wing)d(k)o(ey)j(tasks:)946 +2574 y(127)p eop +%%Page: 128 130 +128 129 bop 415 307 a Ff(\017)21 b Fp(Selects)15 b(the)f(searc)o(h)h +(required)g(for)f(the)g(next)h(depth.)415 374 y Ff(\017)21 +b Fp(Chec)o(ks)15 b(mo)o(v)o(es)d(for)i(kno)o(wn)f(results,)i(e.g.)i(c)o(hec) +o(kmate)d(in)g(2)f(mo)o(v)o(es.)415 440 y Ff(\017)21 b Fp(Sorts)14 +b(1)g(ply)f(mo)o(v)o(es)g(b)q(et)o(w)o(een)i(iterations.)415 +506 y Ff(\017)21 b Fp(Allo)q(cates)9 b(and)g(assigns)h(refutation)f(lines)g +(to)g(and)h(from)d(the)j(refutation)f(table.)415 573 y Ff(\017)21 +b Fp(Adjusts)14 b(time)f(con)o(trol)g(information)e(in)j(the)g(ligh)o(t)f(of) +g(searc)o(h)i(results.)415 639 y Ff(\017)21 b Fp(Main)o(tains)9 +b(searc)o(h)i(status)g(indicators)f(whic)o(h)g(aid)f(the)i(time)e(con)o(trol) +g(decision)457 689 y(pro)q(cess.)415 756 y Ff(\017)21 b Fp(Up)q(dates)15 +b(the)f(history)g(table)g(with)f(the)i(b)q(est)g(mo)o(v)o(e)d(found.)312 +839 y(2.)20 b Fl(AlphaBeta)p Fp(:)15 b(This)c(recursiv)o(e)i(searc)o(h)f +(function)f(explores)h(all)d(no)q(des)j(in)f(the)h(main)365 +888 y(searc)o(h)j(tree)g(b)q(elo)o(w)f(ply)f(1.)18 b(It)c(p)q(erforms)g(the)g +(follo)o(wing)d(k)o(ey)j(tasks:)415 971 y Ff(\017)21 b Fp(Calls)13 +b(for)g(ev)n(aluation)g(of)g(no)q(des.)415 1038 y Ff(\017)21 +b Fp(Mak)o(es)14 b(searc)o(h)h(extension)f(decisions.)415 1104 +y Ff(\017)21 b Fp(Prob)q(es)14 b(refutation)e(and)h(transp)q(osition)g +(tables)g(for)f(scores)j(and)d(mo)o(v)o(es.)17 b(Of-)457 1154 +y(ten)d(this)g(is)g(enough)g(to)g(cause)g(termination)f(of)g(the)h(no)q(de.) +415 1220 y Ff(\017)21 b Fp(Calls)13 b(for)g(generation)h(of)f(mo)o(v)o(es)g +(when)h(necessary)m(.)415 1287 y Ff(\017)21 b Fp(Calls)13 b(for)g(a)h(searc)o +(h)h(to)f(the)g(next)g(depth.)415 1353 y Ff(\017)21 b Fp(Main)o(tains)c(the)j +(b)q(est)f(v)n(ariation)e(of)h(mo)o(v)o(es)g(from)f(this)h(no)q(de)i(and)e +(returns)457 1403 y(suc)o(h)c(information)d(to)j(its)g(paren)o(t)g(no)q(de.) +415 1469 y Ff(\017)21 b Fp(Sa)o(v)o(es)14 b(information)d(ab)q(out)i(the)i +(no)q(de)f(in)g(the)g(transp)q(osition)g(table.)415 1536 y +Ff(\017)21 b Fp(Up)q(dates)15 b(killer)e(mo)o(v)o(es)f(and)i(scores)h(for)f +(the)g(curren)o(t)i(depth.)415 1602 y Ff(\017)21 b Fp(Up)q(dates)15 +b(the)f(history)g(table)g(with)f(the)i(b)q(est)g(mo)o(v)o(e)d(found.)312 +1685 y(3.)20 b Fl(Quies)p Fp(:)e(This)d(recursiv)o(e)h(searc)o(h)g(function)f +(handles)g(no)q(des)g(b)q(ey)o(ond)g(the)h(horizon)365 1735 +y(of)e(the)g(main)e(searc)o(h.)19 b(It)14 b(p)q(erforms)f(the)i(follo)o(wing) +c(k)o(ey)j(tasks:)415 1818 y Ff(\017)21 b Fp(Calls)13 b(for)g(ev)n(aluation)g +(of)g(no)q(des.)415 1885 y Ff(\017)21 b Fp(Mak)o(es)g(searc)o(h)g(extension,) +i(main)c(searc)o(h)i(con)o(tin)o(uation)f(and)g(quiescence)457 +1934 y(decisions.)415 2001 y Ff(\017)h Fp(Calls)13 b(for)g(re-en)o(try)i(of)e +(the)i(main)d(searc)o(h.)415 2067 y Ff(\017)21 b Fp(Calls)13 +b(for)g(generation)h(of)f(tactical)h(mo)o(v)o(es)f(when)h(necessary)m(.)415 +2134 y Ff(\017)21 b Fp(Calls)13 b(for)g(a)h(searc)o(h)h(to)f(the)g(next)g +(depth.)415 2200 y Ff(\017)21 b Fp(Main)o(tains)c(the)j(b)q(est)f(v)n +(ariation)e(of)h(mo)o(v)o(es)g(from)f(this)h(no)q(de)i(and)e(returns)457 +2250 y(suc)o(h)c(information)d(to)j(its)g(paren)o(t)g(no)q(de.)262 +2368 y(Figure)i(6.2)g(sho)o(ws)h(a)g(state)h(transition)e(diagram)e(for)j +(the)g(searc)o(h.)28 b(It)17 b(illustrates)g(ho)o(w)262 2418 +y(eac)o(h)d(searc)o(h)h(state)g(in)o(teracts.)k(An)14 b(explanation)f(of)g +(eac)o(h)h(state)h(is)f(giv)o(en)f(b)q(elo)o(w:)946 2574 y(128)p +eop +%%Page: 129 131 +129 130 bop 499 2422 a Fp(Figure)14 b(6.2:)j(State)d(T)m(ransition)f(Diagram) +e(for)j(the)g(Searc)o(h.)946 2574 y(129)p eop +%%Page: 130 132 +130 131 bop 262 307 a Fl(IDLE)262 419 y Fp(When)13 b(no)g(searc)o(hing)g(of)g +(an)o(y)f(kind)h(is)g(b)q(eing)g(p)q(erformed,)f(the)i(program)d(is)i(in)f +(the)i Fm(IDLE)262 469 y Fp(state.)k(A)o(t)c(program)f(start)h(up,)g(this)g +(is)f(also)h(the)g(initial)e(state.)324 554 y(If)h(the)i(program)d(is)h(exp)q +(ecting)i(a)f(mo)o(v)o(e,)d(it)j(will)e(start)i(to)g(searc)o(h)h(on)f(the)g +(opp)q(onen)o(ts)262 604 y(time)9 b(for)i(its)g(o)o(wn)g(b)q(est)h(resp)q +(onse)h(to)e(the)h(exp)q(ected)h(mo)o(v)o(e.)j(This)11 b(is)g(kno)o(wn)g(as)g +("thinking)262 654 y(on)16 b(the)h(opp)q(onen)o(ts)h(time".)25 +b(T)m(o)16 b(ac)o(hiev)o(e)h(this)g(the)g Fm(SEAR)o(CHING)h(ON)f(OPP)g +Fp(state)h(is)262 704 y(en)o(tered.)26 b(If)16 b(the)h(opp)q(onen)o(t)f +(actually)f(mak)o(es)h(a)f(mo)o(v)o(e)g(while)h(in)f(the)i +Fm(IDLE)g Fp(state,)g(the)262 754 y(en)o(tered)e(user)g(mo)o(v)o(e)d(is)i +(made)f(and)g(the)i(program)d(en)o(ters)k(the)e Fm(SEAR)o(CHING)g +Fp(state.)262 896 y Fl(SEAR)o(CHING)262 1008 y Fp(This)j(state)h(carries)g +(out)f(the)h(tree)h(searc)o(hing)e(on)g(the)h(computer's)f(time.)27 +b(It)18 b(uses)g(the)262 1058 y(aforemen)o(tioned)d(three)k(searc)o(h)f +(routines.)28 b(The)17 b(searc)o(h)i(ma)o(y)c(start)i(from)f(the)h(ro)q(ot)g +(of)262 1108 y(the)d(tree)h(or)f(con)o(tin)o(ue)g(a)g(previously)f(in)o +(terrupted)i(searc)o(h.)324 1193 y(If)j(the)i(searc)o(h)g(deriv)o(es)g(a)f +(kno)o(wn)f(v)n(alue)h(for)g(the)g(game)f(tree,)j(lik)o(e)d(c)o(hec)o(kmate)h +(in)262 1243 y(3)d(mo)o(v)o(es)g(for)g(example,)g(no)h(more)e(searc)o(hing)j +(is)e(required)i(and)f(the)g Fm(SEAR)o(CH)h(COM-)262 1293 y(PLETE)g +Fp(state)h(is)f(en)o(tered.)33 b(Ho)o(w)o(ev)o(er,)20 b(if)d(the)i(game)e +(tree)i(v)n(alue)f(is)g(not)g(kno)o(wn,)h(the)262 1342 y(program)d(con)o(tin) +o(ues)j('thinking')d(un)o(til)i(either,)h(a)f(user)i(in)o(terrupt)f(\()p +Ff(")p Fp(C\))f(o)q(ccurs)i(or)e(an)262 1392 y(alarm)e(timer)h(expires,)i +(where)h(up)q(on)e(the)h Fm(SEAR)o(CH)g(INTERR)o(UPTED)f Fp(state)h(is)f(en-) +262 1442 y(tered.)262 1584 y Fl(SEAR)o(CHING)e(ON)g(OPP)262 +1697 y Fp(Lik)o(e)g(the)i Fm(SEAR)o(CHING)g Fp(state,)g(this)g(state)g +(carries)g(out)f(the)h(tree)h(searc)o(hing,)f(except)262 1746 +y(in)c(this)i(case)g(on)g(the)g(opp)q(onen)o(ts)g(thinking)e(time.)22 +b(Again,)14 b(if)h(the)h(searc)o(h)g(tree)h(v)n(alue)e(is)262 +1796 y(kno)o(wn,)g(the)h(searc)o(h)h(terminates)e(and)h(the)g +Fm(SEAR)o(CHED)h(ON)g(OPP)e Fp(state)i(is)e(en)o(tered.)262 +1846 y(Assuming)g(the)i(game)e(tree)j(v)n(alue)e(is)h(not)f(kno)o(wn,)h(the)g +(searc)o(h)h(con)o(tin)o(ues)f(inde\014nitely)262 1896 y(un)o(til)f(the)i +(user)h(en)o(ters)g(his/her/it's)f(mo)o(v)o(e,)e(when)i(one)g(of)f(t)o(w)o(o) +g(p)q(ossible)h(actions)f(can)262 1946 y(o)q(ccur.)j(If)15 +b(the)g(mo)o(v)o(e)d(en)o(tered)17 b(is)d(the)h(exp)q(ected)i(mo)o(v)o(e,)12 +b(then)j(the)g(program's)e(e\013orts)j(at)262 1995 y(thinking)9 +b(on)i(opp)q(onen)o(ts)h(time)d(ha)o(v)o(e)i(not)g(b)q(een)h(w)o(asted.)17 +b(In)11 b(whic)o(h)g(case,)h(the)g Fm(SEAR)o(CH-)262 2045 y(ING)k +Fp(state)h(is)f(en)o(tered)j(to)d(con)o(tin)o(ue)h(the)g(searc)o(h)g(on)f +(the)h(program's)e(time.)25 b(Ho)o(w)o(ev)o(er,)262 2095 y(if)17 +b(the)j(en)o(tered)g(mo)o(v)o(e)d(is)i(unexp)q(ected,)j(this)d(searc)o(h)g +(is)g(terminated)f(b)o(y)h(en)o(tering)g(the)262 2145 y Fm(SEAR)o(CH)c +(INTERR)o(UPTED)f Fp(state.)262 2287 y Fl(SEAR)o(CH)i(INTERR)o(UPTED)262 +2399 y Fp(The)h(ob)r(jectiv)o(e)h(of)f(this)g(state)h(is)f(to)g(allo)o(w)f(a) +h(clean)h(bac)o(king)e(up)i(and)f(termination)e(of)262 2449 +y(the)h(searc)o(h)h(tree.)26 b(Once)17 b(the)g(searc)o(h)g(has)f(returned)i +(to)e(the)h(ro)q(ot)f(p)q(osition,)f(either)i(the)946 2574 +y(130)p eop +%%Page: 131 133 +131 132 bop 262 307 a Fm(SEAR)o(CH)16 b(COMPLETE)e Fp(or)h +Fm(SEAR)o(CHED)i(ON)f(OPP)f Fp(state)h(is)e(en)o(tered.)23 +b(The)16 b(actual)262 357 y(state)h(dep)q(ends)h(on)f(whether)h(the)f +(program)e(w)o(as)h(previously)h(thinking)e(on)i(its)f(o)o(wn)h(or)262 +407 y(the)d(opp)q(onen)o(ts)h(time.)262 550 y Fl(SEAR)o(CH)h(COMPLETE)262 +662 y Fp(In)g(this)g(state)g(the)h(user)g(is)f(informed)e(of)i(the)g(searc)o +(h)i(result)e(b)o(y)g(w)o(a)o(y)f(of)h(a)f(mo)o(v)o(e)g(or)h(an)262 +712 y(announcemen)o(t.)h(Some)12 b(searc)o(h)j(v)n(alues)e(are)h(then)g +(reset)g(and)g(\014nally)e(the)i Fm(IDLE)g Fp(state)g(is)262 +762 y(en)o(tered.)262 905 y Fl(SEAR)o(CHED)i(ON)g(OPP)262 1017 +y Fp(This)d(state)i(records)g(the)g(searc)o(h)g(result)g(and)e(en)o(ters)j +(the)e Fm(IDLE)h Fp(state.)324 1138 y(Please)i(note,)g(an)f(explanation)f(of) +h(the)h(handling)e(of)h(user)h(commands)d(suc)o(h)j(as)g(set)262 +1188 y(up)d(p)q(osition)g(for)h(example,)e(en)o(tered)j(while)e(searc)o(hing) +i(on)e(opp)q(onen)o(ts)i(time)d(ha)o(v)o(e)h(b)q(een)262 1238 +y(omitted)i(for)h(reasons)i(of)e(clarit)o(y)m(.)28 b(They)18 +b(are)g(only)e(minor)g(side)i(issues)h(whic)o(h)e(do)h(not)262 +1287 y(a\013ect)c(the)h(underlying)e(design.)262 1439 y Fu(6.4.4)55 +b(Ev)m(aluation)262 1551 y Fp(The)18 b(ev)n(aluation)f(criteria)i(used)h(in)e +(HIAR)o(CS)g(w)o(ere)h(fully)e(explained)i(and)f(illustrated)262 +1601 y(in)f(c)o(hapter)i(4.)31 b(Ho)o(w)o(ev)o(er,)19 b(during)f(the)h +(implemen)o(tatio)o(n)d(and)i(testing,)h(a)f(n)o(um)o(b)q(er)f(of)262 +1651 y(problem)10 b(areas)i(w)o(ere)g(observ)o(ed.)19 b(In)11 +b(this)h(section)g(I)g(will)e(explain)h(some)f(of)h(the)i(problems)262 +1700 y(encoun)o(tered)i(and)f(the)h(resulting)f(solutions.)324 +1786 y(The)h(\014rst)g(ma)r(jor)e(problem)g(noticed)i(w)o(as)g(asso)q(ciated) +g(with)g(the)g(application)e(of)h(the)262 1836 y(ev)n(aluation)h(function.)27 +b(The)18 b(ev)n(aluation)d(function)i(is)g(usually)f(applied)h(at)g(the)g +(leaf)g(or)262 1885 y(horizon)e(no)q(des)i(of)e(the)i(main)d(searc)o(h)870 +1870 y Fk(3)889 1885 y Fp(,)i(after)g(whic)o(h)g(a)g(quiescence)i(searc)o(h)f +(is)f(applied.)262 1935 y(The)d(p)q(ositional)f(v)n(alue)h(calculated)g(at)g +(the)h(horizon)f(no)q(des)h(is)f(carried)h(forw)o(ard)f(in)o(to)f(the)262 +1985 y(quiescence)k(searc)o(h)g(to)f(enable)g(the)g(\014nal)f(v)n(alues)g +(calculated)h(at)g(the)g(leaf)f(no)q(des)h(of)g(this)262 2035 +y(searc)o(h)e(to)f(ha)o(v)o(e)h(reasonably)f(up)h(to)f(date)h(p)q(ositional)e +(v)n(alues)h(to)g(go)g(with)g(the)h(calculated)262 2085 y(material)h(v)n +(alue.)26 b(When)17 b(pieces)h(are)f(captured)h(during)e(the)i(quiescence)g +(searc)o(h,)g(b)q(oth)262 2134 y(the)12 b(material)d(and)j(p)q(ositional)e(v) +n(alue)h(of)g(the)h(captured)h(piece)g(should)e(b)q(e)i(lost.)k(Ho)o(w)o(ev)o +(er,)262 2184 y(this)e(w)o(as)g(not)g(re\015ected)i(in)e(the)g(p)q(ositional) +f(v)n(alue)h(carried)g(forw)o(ard)g(in)g(the)g(quiescence)262 +2234 y(searc)o(h.)k(In)14 b(this)g(w)o(a)o(y)f(the)h(p)q(ositional)f(v)n +(alue)g(started)i(to)f(b)q(ecome)f('out)h(of)f(date'.)324 2319 +y(When)f(the)i(p)q(ositional)d(v)n(alues)h(of)g(pieces)i(are)f(relativ)o(ely) +e(lo)o(w,)h(this)g(w)o(as)h(not)f(a)g(ma)r(jor)262 2369 y(problem.)31 +b(Ho)o(w)o(ev)o(er,)21 b(unlik)o(e)d(most)g(c)o(hess)i(programs,)f(m)o(y)e +(ev)n(aluation)h(function)g(can)p 262 2404 573 2 v 308 2431 +a Fj(3)325 2442 y Fi(except)10 b(where)h Fb(\013\014)i Fi(v)n(alues)d +(indicate)f(that)h(the)h(p)q(osition)f(cannot)f(a\013ect)h(the)h(searc)o(h)f +(result.)946 2574 y Fp(131)p eop +%%Page: 132 134 +132 133 bop 262 307 a Fp(pro)q(duce)13 b(v)o(ery)g(high)f(p)q(ositional)f +(scores.)19 b(Therefore,)14 b(when)f(highly)f(p)q(ositionally)e(v)n(alued)262 +357 y(pieces)15 b(are)h(captured,)f(the)g(carried)h(forw)o(ard)e(p)q +(ositional)f(v)n(alue)h(w)o(as)h(drastically)f(out)g(of)262 +407 y(date,)j(causing)g(serious)g(problems)f(to)h(the)g(searc)o(h,)i(b)q(oth) +e(in)f(e\016ciency)i(and)e(accuracy)m(.)262 457 y(F)m(or)c(example,)g(if)h(a) +g(passed)h(pa)o(wn)f(p)q(ositionally)f(v)n(alued)g(at)i(200)e(p)q(oin)o(ts)h +(\(2)h(pa)o(wns\),)f(w)o(as)262 506 y(captured)19 b(during)f(the)g +(quiescence)j(searc)o(h,)f(the)e(p)q(ositional)f(total)h(should)g(ha)o(v)o(e) +f(b)q(een)262 556 y(decreased)f(b)o(y)d(around)h(200)f(p)q(oin)o(ts.)324 +641 y(The)18 b(solution)e(to)i(this)f(problem)f(la)o(y)h(in)g(incremen)o +(tally)f(up)q(dating)h(the)h(p)q(ositional)262 691 y(v)n(alue)10 +b(during)g(the)h(quiescence)i(searc)o(h.)18 b(T)m(o)10 b(ac)o(hiev)o(e)h +(this,)g(whenev)o(er)h(the)g(full)d(ev)n(aluation)262 741 y(function)h(is)h +(applied,)g(all)e(piece)j(p)q(ositional)e(scores)j(are)e(sa)o(v)o(ed)g(in)g +(a)g(general)g(Pc/Sq)g(table.)262 791 y(As)k(mo)o(v)o(es)f(are)i(made)e +(during)h(the)h(subsequen)o(t)h(searc)o(h)f(this)g(table)f(is)g(main)o +(tained)e(and)262 841 y(the)18 b(p)q(ositional)f(v)n(alue)h(of)g(an)o(y)f +(captured)j(piece)f(is)f(recorded)i(in)e(the)h('Game)d(History')262 +891 y(structure)k(and)e(used)g(to)g(incremen)o(tally)f(up)q(date)h(the)h(p)q +(ositional)e(score.)31 b(It)18 b(w)o(as)g(also)262 940 y(found)c(necessary)i +(to)f(include)g(promotion)d(mo)o(v)o(es)i(in)o(to)g(this)g(pro)q(cess)j(b)o +(y)d(remo)o(ving)f(the)262 990 y(promoted)d(pa)o(wns)i(p)q(ositional)e +(score.)19 b(These)13 b(enhancemen)o(ts)f(noticeably)f(impro)o(v)o(ed)f(the) +262 1040 y(standard)k(of)f(pla)o(y)g(b)o(y)h(the)g(program.)324 +1125 y(Another)i(area)f(whic)o(h)g(caused)h(some)e(problems)h(w)o(as)g(the)g +(concept)i(of)d(temp)q(o.)21 b(The)262 1175 y(pla)o(y)o(er)11 +b(to)h(mo)o(v)o(e)e(should)i(receiv)o(e)h(some)e(p)q(ositional)f(b)q(on)o(us) +j(for)e(ha)o(ving)g(the)h(mo)o(v)o(e)f(as)h(this)262 1225 y(is)h(adv)n(an)o +(tageous)546 1210 y Fk(4)564 1225 y Fp(.)324 1310 y(I)e(tried)g(out)g(v)n +(arious)g(temp)q(o)f(v)n(alues)h(based)h(on)f(a)f(direct)i(ratio)f(to)g(the)h +(b)q(est)g(p)q(ositional)262 1360 y(increase)k(caused)g(b)o(y)f(an)o(y)g +(single)g(mo)o(v)o(e)e(from)h(eac)o(h)h(pla)o(y)o(ers)h(p)q(oin)o(t)e(of)h +(view.)22 b(Ho)o(w)o(ev)o(er,)262 1410 y(this)11 b(caused)i(problems)d(b)q +(ecause)j(the)f(maxim)n(um)7 b(p)q(ositional)j(c)o(hange)i(o)o(v)o(er)g(ev)o +(en)g(a)f(single)262 1460 y(mo)o(v)o(e)j(can)j(b)q(e)g(dramatic)e(o)o(v)o(er) +i(a)f(whole)g(searc)o(h.)27 b(I)16 b(\014nally)g(used)h(a)f(constan)o(t)h(v)n +(alue)f(of)262 1509 y(20)g(p)q(oin)o(ts)i(for)f(ha)o(ving)f(the)i(mo)o(v)o +(e.)27 b(I)17 b(still)f(feel)i(the)g(temp)q(o)e(v)n(alue)h(should)g(b)q(e)h +(related)262 1559 y(to)f(p)q(ositional)f(v)n(alues)i(in)f(some)g(w)o(a)o(y)m +(,)g(ho)o(w)o(ev)o(er,)h(the)g(v)n(alue)f(c)o(hosen)i(seems)f(to)f(b)q(eha)o +(v)o(e)262 1609 y(reasonably)c(in)h(the)g(test)h(games)e(pla)o(y)o(ed.)324 +1694 y(In)j(elemen)o(tary)f(endings,)i(where)g(a)f(c)o(hec)o(kmate)f(driv)o +(e)h(is)g(required,)h(e.g.)25 b(king)15 b(and)262 1744 y(ro)q(ok)h(v)o(ersus) +h(king,)f(a)g(sp)q(ecial)g(routine)h(w)o(as)f(found)g(necessary)i(to)e(force) +h(c)o(hec)o(kmate)f(in)262 1794 y(an)c(e\016cien)o(t)h(manor.)j(The)d +(routine)g(used)h(is)f(v)o(ery)g(similar)d(to)j(the)g(mop)e(up)i(routine)g +(used)262 1844 y(in)g(Chess)i(4.5)e([4)o(].)324 1929 y(Cases)j(of)f +(insu\016cien)o(t)h(mating)d(material,)g(e.g.)23 b(king)14 +b(and)i(knigh)o(t)e(v)i(king,)e(are)i(also)262 1979 y(detected)d(b)o(y)e(the) +h(ev)n(aluation)e(function)h(and)g(the)h(dra)o(w)g(v)n(alue)e(returned.)19 +b(This)12 b(enhance-)262 2029 y(men)o(t)j(is)h(v)o(ery)g(e\013ectiv)o(e)i(in) +d(the)i(late)f(endgame)f(b)q(ecause)j(it)e(allo)o(ws)e(early)i(termination) +262 2078 y(of)d(man)o(y)f(v)n(ariations,)g(thereb)o(y)j(reducing)f +(unnecessary)i(searc)o(h)f(e\013ort.)324 2164 y(In)i(order)i(to)e(ease)i(the) +f(debugging)f(of)g(the)h(ev)n(aluation)e(function,)i(all)e(v)n(alues)i(w)o +(ere)262 2213 y(sa)o(v)o(ed)12 b(and)g(displa)o(y)o(ed)f(on)h(request.)19 +b(This)12 b(allo)o(w)o(ed)f(n)o(umerous)g(small)f(bugs)j(to)e(b)q(e)i(iden)o +(ti-)262 2263 y(\014ed,)f(whic)o(h)f(w)o(ould)g(ha)o(v)o(e)g(otherwise)i(b)q +(een)g(v)o(ery)f(di\016cult)f(to)g(sp)q(ot)h(as)g(they)g(only)f(sligh)o(tly) +262 2313 y(a\013ected)k(the)f(\014nal)g(ev)n(aluation)e(function)i(score.)p +262 2340 573 2 v 308 2366 a Fj(4)325 2378 y Fi(except)c(in)h(zugzw)o(ang)f(p) +q(ositions)946 2574 y Fp(132)p eop +%%Page: 133 135 +133 134 bop 324 307 a Fp(Ev)o(en)14 b(in)g(the)h(\014nal)e(p)q(erformance)h +(tested)i(v)o(ersion,)e(some)f(of)g(these)j(p)q(ositional)d(diag-)262 +357 y(nostics)f(ha)o(v)o(e)f(b)q(een)i(retained)g(as)f(they)g(allo)o(w)e(a)h +(v)n(aluable)g(insigh)o(t)g(in)o(to)g(wh)o(y)g(a)h(particular)262 +407 y(mo)o(v)o(e)g(w)o(as)i(c)o(hosen.)262 558 y Fu(6.4.5)55 +b(Time)16 b(Allo)r(cation)i(and)h(Con)n(trol)262 670 y Fp(As)11 +b(I)g(explained)g(in)f(c)o(hapter)i(3,)f(I)g(b)q(eliev)o(e)g(time)f(allo)q +(cation)f(and)i(con)o(trol)g(is)g(an)f(imp)q(ortan)o(t)262 +720 y(asp)q(ect)j(of)f(a)g(c)o(hess)i(program's)d(mak)o(e)g(up)i(and)f(one)h +(whic)o(h)f(do)q(es)h(not)g(seem)f(to)g(ha)o(v)o(e)g(b)q(een)262 +770 y(addressed)j(prop)q(erly)f(in)g(most)f(c)o(hess)i(programs.)324 +855 y(A)o(t)h(the)g Fm(Computer)h(Olympiad)p Fp(,)f(I)f(often)h(noticed)h(ho) +o(w)e(ev)o(en)i(the)f(strongest)h(man)o(u-)262 905 y(facturer's)d(programs)e +(to)q(ok)h(appro)o(ximately)e(the)j(same)e(time)g(o)o(v)o(er)h(all)f(the)i +(mo)o(v)o(es,)e(ev)o(en)262 955 y(ob)o(vious)k(ones.)28 b(The)18 +b(only)e(time)g(mo)o(v)o(es)g(w)o(ere)i(pla)o(y)o(ed)f(quic)o(kly)f(w)o(as)h +(when)h(either)g(the)262 1005 y(mac)o(hines)11 b(w)o(ere)j(thinking)e(on)g +(opp)q(onen)o(ts)i(time)d(and)i(an)f(exp)q(ected)j(reply)e(w)o(as)f(made,)g +(or)262 1055 y(when)i(c)o(hec)o(kmate)g(w)o(as)f(seen)j(or)e(when)g(only)f +(one)h(legal)f(mo)o(v)o(e)f(existed.)324 1140 y(The)f(\014rst)g(thing)e(to)h +(do)h(is)f(to)g(analyse)g(ho)o(w)g(v)o(ery)g(strong)h(h)o(uman)e(c)o(hess)i +(pla)o(y)o(ers)g(tac)o(kle)262 1190 y(the)i(problem)e(of)h(time)f(allo)q +(cation.)16 b(I)c(did)g(not)h(\014nd)f(an)o(y)g(previous)h(researc)o(h)i(w)o +(ork)d(whic)o(h)262 1239 y(pro)o(vided)h(the)h(detailed)f(mo)o(v)o(e/time)e +(analysis)i(I)g(required,)h(so)g(I)f(decided)i(to)e(collate)g(the)262 +1289 y(information)d(m)o(yself.)324 1375 y(I)g(decided)i(to)e(use)h(the)g +(1986)e(w)o(orld)h(c)o(hampionship)f(matc)o(h)g(b)q(et)o(w)o(een)j(Gary)e +(Kasparo)o(v)262 1424 y(and)16 b(Anatoly)g(Karp)q(o)o(v)g([62)o(])h(as)f(m)o +(y)f(case)j(study)m(.)26 b(This)17 b(matc)o(h)e(w)o(as)h(c)o(hosen)i(for)e +(three)262 1474 y(main)11 b(reasons:)312 1593 y(1.)20 b(Lik)o(ely)13 +b(high)h(qualit)o(y)e(of)h(time)g(allo)q(cation)f(decisions.)312 +1676 y(2.)20 b(Same)14 b(pla)o(y)o(ers)g(w)o(ere)i(in)o(v)o(olv)o(ed)d(in)h +(all)f(games)h(allo)o(wing)e(pla)o(y)o(er)i(st)o(yle)h(to)g(b)q(e)g(anal-)365 +1725 y(ysed.)312 1808 y(3.)20 b(Detailed)c(statistics)g(giving)f(time)f(used) +j(for)f(eac)o(h)g(mo)o(v)o(e)e(w)o(as)i(a)o(v)n(ailable)e(in)h(c)o(hess)365 +1858 y(magazine.)324 1977 y(I)c(analysed)g(all)f(24)g(games)g(of)g(the)i +(matc)o(h.)k(F)m(or)11 b(eac)o(h)g(game,)f(mo)o(v)o(es)g(b)o(y)h(b)q(oth)g +(sides)h(up)262 2027 y(to)i(the)i(time)e(con)o(trol)h(at)g(mo)o(v)o(e)e(40)i +(w)o(ere)h(collated.)21 b(This)15 b(in)o(v)o(olv)o(ed)e(analysing)h(appro)o +(x-)262 2076 y(imately)e(2000)i(mo)o(v)o(e)g(times.)20 b(As)15 +b(a)g(result)g(I)g(w)o(as)g(able)g(to)g(pro)q(duce)h(5)e(di\013eren)o(t)i +(graphs)262 2126 y(detailing)c(the)j(a)o(v)o(erage)f(time)e(sp)q(en)o(t)j(on) +f(eac)o(h)g(mo)o(v)o(e)e(for:)324 2245 y Ff(\017)20 b Fp(Kasparo)o(v)14 +b(pla)o(ying)e(white.)324 2328 y Ff(\017)20 b Fp(Kasparo)o(v)14 +b(pla)o(ying)e(blac)o(k.)324 2411 y Ff(\017)20 b Fp(Karp)q(o)o(v)14 +b(pla)o(ying)e(white.)946 2574 y(133)p eop +%%Page: 134 136 +134 135 bop 324 307 a Ff(\017)20 b Fp(Karp)q(o)o(v)14 b(pla)o(ying)e(blac)o +(k.)324 390 y Ff(\017)20 b Fp(Com)o(bined)12 b(time)h(allo)q(cation.)262 +509 y(The)h(graphs)g(pro)q(duced)h(can)f(b)q(e)h(found)e(in)h(app)q(endix)f +(C.)324 594 y(Analysing)g(these)j(graphs)e(it)g(can)g(b)q(e)h(seen)g(that)f +(b)q(oth)h(pla)o(y)o(ers)f(ha)o(v)o(e)g(distinctly)g(dif-)262 +644 y(feren)o(t)e(st)o(yles)h(on)e(time)g(con)o(trol.)17 b(Kasparo)o(v)12 +b(allo)q(cates)f(a)h(signi\014can)o(t)f(amoun)o(t)f(of)h(time)g(to)262 +694 y(the)i(middle)e(game,)f(mo)o(v)o(es)i(12-28)f(in)h(particular.)18 +b(Kasparo)o(v's)12 b(time)f(allo)q(cation)g(usually)262 743 +y(has)k(one)g(v)o(ery)g(high)f(p)q(eak)h(around)g(mo)o(v)o(es)f(16)g(to)h(20) +f(and)h(then)g(tails)g(o\013)f(dramatically)m(.)262 793 y(Karp)q(o)o(v)f(on)f +(the)i(other)g(hand)f(has)g(a)g(more)f(uniform)f(usage)i(of)f(time,)g +(although)g(his)h(time)262 843 y(allo)q(cation)h(also)i(usually)f(tails)h +(o\013)g(steadily)g(after)g(mo)o(v)o(e)f(26.)24 b(Tw)o(o)16 +b(reasons)h(are)g(lik)o(ely)262 893 y(for)c(this)h(tailing)e(o\013:)324 +1011 y Ff(\017)20 b Fp(Bad)e(time)d(allo)q(cation)h(during)g(the)i(middle)d +(game)h(leading)g(to)h(a)g(rush)g(near)h(the)365 1061 y(time)13 +b(con)o(trol.)324 1144 y Ff(\017)20 b Fp(Go)q(o)q(d)e(planning)e(during)i +(the)h(late)e(middle)g(game)f(allo)o(wing)g(planned)i(mo)o(v)o(e)e(se-)365 +1194 y(quences)g(to)e(b)q(e)g(pla)o(y)o(ed)f(quic)o(kly)m(.)262 +1312 y(As)f(this)g(tailing)f(o\013)g(o)q(ccurs)j(in)e(nearly)g(all)e(the)j +(games)e(and)h(the)h(v)o(ery)f(high)f(calibre)i(of)e(the)262 +1362 y(pla)o(y)o(ers)i(in)o(v)o(olv)o(ed,)g(I)g(tend)i(to)f(think)f(go)q(o)q +(d)h(planning)e(is)i(resp)q(onsible.)324 1447 y(Another)j(in)o(teresting)h +(observ)n(ation)e(o)q(ccurs)i(when)g(y)o(ou)e(sup)q(er-imp)q(ose)h(the)g +(graphs)262 1497 y(Kasparo)o(v)f(as)h(white)g(o)o(v)o(er)f(Karp)q(o)o(v)h(as) +f(blac)o(k)h(and)f(Karp)q(o)o(v)h(as)f(white)h(o)o(v)o(er)g(Kasparo)o(v)262 +1547 y(as)c(blac)o(k.)18 b(A)o(t)c(eac)o(h)g(p)q(eak)g(on)f(the)i(white)e +(pla)o(y)o(er's)h(graph)f(there)i(is)f(usually)f(a)g(trough)h(at)262 +1597 y(the)g(corresp)q(onding)g(mo)o(v)o(e)e(on)i(the)g(opp)q(osing)f(blac)o +(k)g(pla)o(y)o(er's)g(graph.)18 b(This)13 b(also)g(o)q(ccurs)262 +1647 y(when)k(the)h(blac)o(k)f(pla)o(y)o(er's)f(p)q(eaks)i(are)g(compared)e +(with)h(the)h(graph)f(for)f(the)i(opp)q(osing)262 1696 y(white)c(pla)o(y)o +(er's)f(mo)o(v)o(es)g(follo)o(wing)e(suc)o(h)j(p)q(eaks.)324 +1782 y(I)f(think)g(this)g(clearly)g(illustrates)h(that)f(eac)o(h)h(pla)o(y)o +(er)f(mak)o(es)f(signi\014can)o(t)g(use)j(of)d(their)262 1832 +y(opp)q(onen)o(ts)i(thinking)f(time.)324 1917 y(Examining)f(the)k(com)o +(bined)e(graph)g(for)h(b)q(oth)g(Kasparo)o(v)g(and)g(Karp)q(o)o(v,)g(a)f +(relation-)262 1967 y(ship)f(to)h(a)g(normal)e(distribution)h(can)h(b)q(e)g +(seen.)20 b(Ov)o(erall)13 b(p)q(eak)h(remains)f(at)h(mo)o(v)o(e)e(20.)324 +2052 y(>F)m(rom)h(these)18 b(graphs)e(the)g(follo)o(wing)d(p)q(oin)o(ts)j(ab) +q(out)g(time)e(allo)q(cation)g(and)i(con)o(trol)262 2102 y(can)e(b)q(e)g +(deduced:)324 2220 y Ff(\017)20 b Fp(Thinking)13 b(on)h(y)o(our)f(opp)q(onen) +o(ts)i(time)d(is)i(imp)q(ortan)o(t.)324 2303 y Ff(\017)20 b +Fp(During)14 b(the)g(op)q(ening,)f(prepared)i(mo)o(v)o(es)e(are)h(t)o +(ypically)f(pla)o(y)o(ed)g(quic)o(kly)m(.)324 2386 y Ff(\017)20 +b Fp(A)c(signi\014can)o(t)f(amoun)o(t)f(of)h(time)f(should)h(b)q(e)h(allo)q +(cated)f(to)h('unkno)o(wn')e(p)q(ositions)365 2436 y(o)q(ccurring)h(in)e(the) +i(op)q(ening)e(after)i(a)e(prepared)i(sequence)h(of)e(mo)o(v)o(es.)946 +2574 y(134)p eop +%%Page: 135 137 +135 136 bop 324 307 a Ff(\017)20 b Fp(Time)10 b(should)h(b)q(e)h(allo)q +(cated)f(dep)q(ending)h(on)f(the)h(complexit)o(y)d(and)i(understanding)365 +357 y(of)j(the)g(curren)o(t)h(p)q(osition.)324 435 y Ff(\017)20 +b Fp(Time)13 b(allo)q(cation)f(should)i(b)q(e)g(dynamically)d(altered)k(as)f +(a)f(searc)o(h)i(progresses.)324 513 y Ff(\017)20 b Fp('Ob)o(vious')13 +b(mo)o(v)o(es)g(should)g(b)q(e)i(made)e(quic)o(kly)m(.)262 +621 y(Some)i(of)i(these)h(p)q(oin)o(ts)f(are)g(ob)o(vious)f(to)h(an)o(y)g +(exp)q(erienced)i(tournamen)o(t)d(pla)o(y)o(er,)h(oth-)262 +670 y(ers)g(are)f(less)h(so.)24 b(Nev)o(ertheless)18 b(it)e(remains)f(imp)q +(ortan)o(t)f(to)i(ha)o(v)o(e)g(one's)g(suspicions)g(re-)262 +720 y(enforced)f(b)o(y)e(researc)o(h.)324 805 y(I)h(will)e(no)o(w)i(explain)f +(ho)o(w)g(these)i(p)q(oin)o(ts)f(are)g(addressed)i(in)e(HIAR)o(CS)f(5.0.)262 +947 y Fl(Thinking)g(on)i(Opp)q(onen)o(ts)e(Time)262 1059 y +Fp(HIAR)o(CS)j(thinks)g(ab)q(out)g(its)h(next)g(mo)o(v)o(e)d(durings)j(its)f +(opp)q(onen)o(t's)h(thinking)e(time.)25 b(It)262 1108 y(do)q(es)16 +b(this)g(b)o(y)f(thinking)g(ab)q(out)h(the)g(p)q(osition)f(as)h(if)f(the)i +(opp)q(onen)o(t)f(had)f(made)g(the)h(ex-)262 1158 y(p)q(ected)g(reply)m(.)21 +b(If)14 b(the)i(opp)q(onen)o(t)f(actually)f(mak)o(es)f(the)j(exp)q(ected)h +(reply)m(,)d(HIAR)o(CS)g(has)262 1208 y(gained)h(time)f(and)h(can)h(con)o +(tin)o(ue)p 651 1215 153 2 v 15 w('thinking')e(or)h(reply)h(imm)o(ediately)m +(.)j(If)c(ho)o(w)o(ev)o(er,)h(the)262 1258 y(opp)q(onen)o(t)c(mak)o(es)f(a)h +(di\013eren)o(t)h(reply)m(,)e(HIAR)o(CS)h(ab)q(orts)g(its)g(analysis)g(and)g +(starts)h('think-)262 1308 y(ing')e(from)h(the)i(new)f(p)q(osition.)k(In)c +(practice,)h(the)g(correct)h(mo)o(v)o(e)c(seems)i(to)g(b)q(e)h(predicted)262 +1357 y(around)f(50\045)g(of)h(the)g(time.)324 1443 y(The)h(time)e(sp)q(en)o +(t)i(thinking)e(on)h(the)h(opp)q(onen)o(ts)g(time)e(is)h(tak)o(en)h(in)o(to)e +(accoun)o(t)i(when)262 1493 y(the)f(exp)q(ected)i(reply)e(is)g(made.)262 +1634 y Fl(Initial)f(Time)i(Allo)q(cation)262 1746 y Fp(Initially)g(the)i +(resp)q(onse)i(time)d(\(respTime\))h(allo)q(cated)g(to)g(a)g(mo)o(v)o(e)e(is) +i(calculated)g(from)262 1795 y(the)d(a)o(v)o(erage)g(time)e(p)q(er)j(mo)o(v)o +(e)d(remaining)g(to)i(the)g(next)h(time)d(con)o(trol:)671 1903 +y(respTime)h(=)h(timeLeft)f(/)h(mo)o(v)o(esLeft)324 2011 y(A)g(maxim)n(um)9 +b(time)k(\(maxTime\))e(is)j(also)f(initially)e(calculated)j(as)g(follo)o(ws:) +785 2119 y(maxTim)o(e)d(=)k(timeLeft)324 2227 y(This)f(is)f(a)h(sp)q(ecial)g +(case)h(to)f(stop)g(the)g(program)f(from)f(losing)h(on)g(time.)324 +2313 y(Using)i(only)f(this)i(approac)o(h,)f(a)f(problem)g(ma)o(y)g(o)q(ccur)i +(where)g(the)g(program)e(ha)o(ving)262 2363 y(half)19 b(an)h(hour)h(left)f +(for)h(its)f(last)h(mo)o(v)o(e)d(will)i(w)o(an)o(t)g(to)g(use)i(its)e(full)f +(time)h(allo)q(cation.)262 2412 y(Ho)o(w)o(ev)o(er,)12 b(it)h(ma)o(y)d(b)q(e) +j(b)q(etter)h(not)f(to)f(sp)q(end)i(all)d(the)j(a)o(v)n(ailable)c(time)h(and) +i(sa)o(v)o(e)f(some)g(for)262 2462 y(use)i(during)e(the)i(next)g(time)e(con)o +(trol)h(p)q(erio)q(d.)18 b(T)m(o)12 b(a)o(v)o(oid)g(this)i(problem;)d(during) +i(the)h(last)262 2512 y(10)f(mo)o(v)o(es)f(b)q(efore)j(a)f(time)e(con)o +(trol,)h(respTime)h(is)g(mo)q(di\014ed)e(as)i(follo)o(ws:)946 +2574 y(135)p eop +%%Page: 136 138 +136 137 bop 344 357 a Fp(respTime)14 b(=)g(min\(respTime,)d(timeLeft2/mo)o(v) +o(esLeft2\))344 457 y Fl(where)380 506 y Fp(respTime)i(:)77 +b(is)14 b(the)h(initial)c(resp)q(onse)16 b(time)d(set.)380 +606 y(timeLeft2)f(:)71 b(is)14 b(the)h(time)d(left)i(b)q(efore)g(the)h(next)f +(but)g(one)g(time)f(con)o(trol.)380 706 y(mo)o(v)o(esLeft2)f(:)42 +b(is)14 b(the)h(n)o(um)o(b)q(er)e(of)g(mo)o(v)o(es)g(left)g(b)q(efore)i(the)f +(next)h(but)f(one)g(time)651 756 y(con)o(trol.)324 874 y(After)g(the)h +(program)e(lea)o(v)o(es)h(its)g(op)q(ening)g(b)q(o)q(ok)f(it)h(is)g(faced)g +(with)g(a)g(p)q(osition)f(whose)262 924 y(concepts)22 b(m)o(ust)d(b)q(e)i +(grasp)q(ed)h(to)e(enable)h(the)g(program)e(to)h(con)o(tin)o(ue)h(the)g +(thread)g(of)262 974 y(the)16 b(op)q(ening.)25 b(T)m(o)16 b(help)g(the)h +(program)e(at)h(this)g(di\016cult)g(stage,)h(the)g(resp)q(onse)h(time)d(is) +262 1023 y(increased)g(b)o(y)e(b)q(et)o(w)o(een)i(0)e(and)h(respTime)f(dep)q +(ending)i(on)e(the)h(n)o(um)o(b)q(er)f(of)g(mo)o(v)o(es)g(since)262 +1073 y(lea)o(ving)i(the)j(op)q(ening)f(b)q(o)q(ok,)g(e.g.)26 +b(the)18 b(\014rst)g(non)f(b)q(o)q(ok)f(mo)o(v)o(e)g(is)g(respTime,)h(and)g +(the)262 1123 y(forth)c(is)h(0.)262 1266 y Fl(Time)h(Allo)q(cation)e +(Adjustmen)o(t)262 1378 y Fp(The)h(actual)g(time)f(whic)o(h)i(can)f(b)q(e)h +(sp)q(en)o(t)h(on)e(a)g(mo)o(v)o(e)f(can)h(v)n(ary)g(b)q(et)o(w)o(een)i +(respTime/64)262 1428 y(and)10 b(maxTim)o(e.)k(Therefore,)e(for)e(a)g(time)f +(con)o(trol)g(of)h(40)g(mo)o(v)o(es)f(in)g(2)h(hours)h(the)g(minim)n(um)262 +1478 y(and)20 b(maxim)n(um)d(times)i(could)i(range)g(from)d(3)j(seconds)h(to) +e(2)h(hours.)39 b(Of)20 b(course,)j(if)262 1528 y(the)c(searc)o(h)h(tree)h +(is)d(terminal)g(or)h(thinking)f(on)g(opp)q(onen)o(ts)i(time)e(has)h(b)q(een) +h(used)g(an)262 1578 y(imm)o(ediate)11 b(resp)q(onse)16 b(ma)o(y)c(still)h(o) +q(ccur.)324 1663 y(The)18 b(time)e(sp)q(en)o(t)j(thinking)e(on)g(opp)q(onen)o +(ts)i(time)d(is)i(tak)o(en)g(in)o(to)f(accoun)o(t)h(b)o(y)g(this)262 +1713 y('time)f(windo)o(w'.)34 b(F)m(or)19 b(example,)g(if)g(the)h(program)e +(had)h(sp)q(en)o(t)i(60)e(seconds)i(thinking)262 1763 y(on)d(opp)q(onen)o(ts) +g(time)f(and)h(the)h(exp)q(ected)i(reply)d(w)o(as)g(made,)g(a)g(new)h +(respTime)e(of)h(62)262 1812 y(seconds)f(w)o(ould)e(only)g(require)i(2)f +(more)f(seconds)j(though)o(t)d(b)o(y)h(the)h(program,)d(all)h(other)262 +1862 y(things)e(b)q(eing)h(equal.)324 1947 y(The)20 b(actual)f(time)g(tak)o +(en)h(within)f(this)h('time)e(windo)o(w')g(will)h(dep)q(end)i(on)e(v)n +(arious)262 1997 y(factors)e(measuring)f(ho)o(w)g(complex)g(the)h(mo)o(v)o(e) +f(c)o(hoice)h(is.)27 b(Dep)q(ending)17 b(on)g(the)g(searc)o(h)262 +2047 y(status,)12 b(the)h(time)e(allo)q(cation)f(is)i(adjusted)h(under)g(5)e +(categories.)19 b(Note,)12 b(to)g(facilitate)f(the)262 2097 +y(v)n(arying)h(time)h(allo)q(cation)f(c)o(hanges,)i(the)h(concept)g(of)e +(extra)p 1130 2104 94 2 v 14 w(time)g(is)h(in)o(tro)q(duced.)262 +2240 y Fl(1.)25 b(Best)17 b(Mo)o(v)o(e)g(leads)f(to)h(a)g(Loss:)41 +b Fp(While)15 b(no)g(mo)o(v)o(es)f(are)h(found)g(to)g(a)o(v)o(oid)f(losing) +262 2290 y(the)e(game,)e(the)j(allo)q(cated)f(time)e(is)i(set)h(to)f(the)g +(maxTime.)i(This)e(allo)o(ws)f(the)h(program)f(to)262 2340 +y(con)o(tin)o(ue)k(searc)o(hing)h(un)o(til)e(either)j(mate)d(is)h(found)g(or) +h(almost)d(all)h(the)i(program's)e(time)262 2390 y(expires.)20 +b(After)14 b(all,)f(the)i(program)e(is)h(v)o(ery)g(lik)o(ely)f(to)h(lose)g +(if)g(it)g(pla)o(ys)f(a)h(mo)o(v)o(e)f(it)h(kno)o(ws)262 2439 +y(will)e(lead)i(to)f(a)h(loss,)f(therefore)i(it)f(migh)o(t)e(as)i(w)o(ell)f +(sp)q(end)i(most)d(of)i(its)f(time)g(attempting)946 2574 y(136)p +eop +%%Page: 137 139 +137 138 bop 262 307 a Fp(to)16 b(\014nd)g(an)g(impro)o(v)o(emen)o(t.)22 +b(Of)16 b(course,)i(if)d(the)i(loss)f(is)g(found)f(to)h(b)q(e)h(una)o(v)o +(oidable)e(the)262 357 y(mo)o(v)o(e)d(whic)o(h)i(lasts)g(out)f(the)i(longest) +f(will)e(b)q(e)j(pla)o(y)o(ed)e(immedia)o(tely)m(.)262 499 +y Fl(2.)35 b(New)21 b(Iteration)d(Begun:)41 b Fp(Before)19 +b(eac)o(h)f(new)h(iteration)e(b)q(egins)i(the)f(program)262 +549 y(calculates)10 b(ho)o(w)f(long)g(the)i(iteration)e(is)h(exp)q(ected)i +(to)e(tak)o(e)f(based)i(on)f(the)g(time)f(tak)o(en)h(o)o(v)o(er)262 +599 y(previous)g(iterations.)17 b(F)m(or)10 b(example,)f(in)h(the)h(middle)e +(game)g(an)h(iteration)g(t)o(ypically)f(tak)o(es)262 649 y(ab)q(out)15 +b(6)g(times)f(the)i(length)g(of)e(all)g(previous)i(iterations)1177 +634 y Fk(5)1196 649 y Fp(.)22 b(Additionally)m(,)13 b(an)i(iteration)262 +699 y(commi)o(tm)o(en)o(t)d(time)i(is)g(calculated.)21 b(If)14 +b(the)h(curren)o(t)h(resp)q(onse)h(time)c(will)h(expire)h(b)q(efore)262 +748 y(the)f(iteration)f(commi)o(tm)o(en)o(t)e(time,)h(the)i(searc)o(h)g(is)g +(ab)q(orted.)k(Ho)o(w)o(ev)o(er,)c(if)e(the)i(program)262 798 +y(is)h(committed)f(to)i(the)g(iteration,)g(it)g(allo)o(ws)e(the)j(extra)f +(time)f(reasonably)h(exp)q(ected)i(to)262 848 y(ac)o(hiev)o(e)e(some)f +(results)i(from)e(the)h(new)h(iteration)f(commitm)n(en)o(t.)23 +b(Note)16 b(that)g(the)h(time)262 898 y(previously)c(tak)o(en)h(thinking)f +(on)h(opp)q(onen)o(ts)g(time)f(is)h(also)f(tak)o(en)h(in)o(to)f(accoun)o(t.) +504 1011 y(extraTime)g(=)h(iterationTime)e Ff(\000)i Fp(respTime)g(+)g +(oppTime)262 1153 y Fl(3.)20 b(Searc)o(h)13 b(F)l(ailed)f(Lo)o(w:)41 +b Fp(When)12 b(the)h(searc)o(h)g(has)f(failed)g(lo)o(w,)f(the)h(true)h(v)n +(alue)f(of)f(the)262 1203 y(b)q(est)h(mo)o(v)o(e)f(found)g(is)h(not)f(kno)o +(wn,)h(it)f(is)h(only)f(kno)o(wn)g(that)h(it)f(is)h(w)o(orse)h(than)e(the)i +Fh(\013)e Fp(v)n(alue)262 1253 y(of)h(the)h(initial)e(searc)o(h)j(windo)o(w.) +i(In)d(this)g(case,)h(a)e(large)g(amoun)o(t)f(of)h(time)g(is)g(allo)q(cated)h +(to)262 1303 y(actually)g(\014nd)i(a)f(true)i(score.)21 b(Otherwise,)16 +b(if)d(the)j(b)q(est)f(mo)o(v)o(e)e(found)h(w)o(ere)i(pla)o(y)o(ed,)e(it)g +(is)262 1353 y(lik)o(ely)e(to)i(b)q(e)g(a)g(blunder.)739 1466 +y(extraTime)f(=)h(8)g Ff(\001)f Fp(respTime)262 1608 y Fl(4.)23 +b(Searc)o(h)16 b(F)l(ailed)f(High:)41 b Fp(Lik)o(e)14 b(a)g(fail)f(lo)o(w,)h +(when)h(the)g(searc)o(h)h(fails)d(high)h(the)i(true)262 1658 +y(score)21 b(is)e(not)h(kno)o(wn.)35 b(Ho)o(w)o(ev)o(er,)22 +b(things)d(are)h(not)g(so)g(sev)o(ere)i(as)d(with)h(the)g(fail)f(lo)o(w)262 +1708 y(condition)13 b(as)h(it)g(is)h(kno)o(wn)e(that)i(the)g(b)q(est)g(mo)o +(v)o(e)e(found)h(is)g(b)q(etter)i(than)e Fh(\014)r Fp(.)20 +b(Therefore,)262 1758 y(some)12 b(extra)i(time)e(is)h(allo)q(cated)g(to)h +(allo)o(w)d(the)j(true)h(score)f(to)g(b)q(e)g(determined,)f(ho)o(w)o(ev)o +(er,)262 1808 y(this)g(time)g(is)h(not)g(excessiv)o(e,)h(b)q(eing)f(set)g +(at:)739 1921 y(extraTime)f(=)h(2)g Ff(\001)f Fp(respTime)262 +2063 y Fl(5.)41 b(Searc)o(h)21 b(V)l(alue)g(in)h(Aspiration)d(Windo)o(w:)40 +b Fp(The)20 b(actual)g(b)q(est)g(mo)o(v)o(e)e(v)n(alue)262 +2113 y(is)e(kno)o(wn,)h(therefore,)h(time)e(can)h(b)q(e)g(allo)q(cated)f +(directly)h(from)e(the)j(v)n(alue)e(itself.)26 b(The)262 2163 +y(judgemen)o(t)17 b(is)h(based)i(on)e(the)h(di\013erence)h(b)q(et)o(w)o(een)g +(the)f(b)q(est)h(mo)o(v)o(e's)d(v)n(alue)h(and)g(the)262 2213 +y(score)e(at)f(the)h(end)g(of)e(the)i(last)f(iteration.)22 +b(If)15 b(this)g(di\013erence)i(is)e(less)h(than)g(or)f(equal)g(to)262 +2263 y Ff(\000)p Fp(16,)e(extra)h(time)f(is)g(allo)q(cated)h(as)g(follo)o +(ws:)599 2376 y(extraTime)f(=)h(\()p Ff(j)g Fp(di\013)f Ff(j)h +Fp(/)f(16)h Ff(\001)f Fp(respTime\))h(/)f(8)p 262 2411 573 +2 v 308 2437 a Fj(5)325 2449 y Fi(the)e(fact)f(that)h(o)q(dd)f(ply)h +(iterations)e(tak)o(e)i(longer)f(than)g(ev)o(en)g(ones)h(is)g(also)g(tak)o +(en)f(in)o(to)h(accoun)o(t)946 2574 y Fp(137)p eop +%%Page: 138 140 +138 139 bop 262 307 a Fp(F)m(or)11 b(example,)f(if)g(the)i(b)q(est)h(mo)o(v)o +(e)d(at)h(this)g(iteration)g(app)q(ears)i(to)e(lose)g(a)g(pa)o(wn)h(relativ)o +(e)f(to)262 357 y(the)16 b(previous)f(iteration)g(\(di\013)h(=)f +Ff(\000)p Fp(100\),)g(the)h(extra)g(time)e(allo)q(cated,)h(giv)o(en)g +(respTime)262 407 y(=)i(180)g(seconds)i(and)f(in)o(teger)g(arithmetic,)f(w)o +(ould)g(b)q(e)h(135)f(seconds,)j(making)15 b(a)i(total)262 +457 y(time)11 b(of)i(5)g(min)o(utes)f(15)h(seconds.)19 b(F)m(or)13 +b(the)h(loss)g(of)e(a)h(bishop,)g(the)h(extra)g(time)e(w)o(ould)g(b)q(e)262 +506 y(ab)q(out)h(8)h(min)o(utes)f(\(total)g(time)g(11)g(min)o(utes\).)324 +592 y(This)h(metho)q(d)g(allo)o(ws)f(extra)h(time)g(to)g(b)q(e)h(allo)q +(cated)f(as)g(and)g(when)h(necessary)m(.)21 b(The)262 641 y(loss)14 +b(of)f(a)h(piece)i(is)e(v)o(ery)g(lik)o(ely)f(to)i(mean)e(the)h(loss)h(of)e +(the)i(game,)e(so)h(it)g(is)g(imp)q(ortan)o(t)f(to)262 691 +y(allo)q(cate)j(a)g(signi\014can)o(t)g(amoun)o(t)f(of)h(time)g(in)g(order)h +(to)g(searc)o(h)h(for)e(a)h(w)o(a)o(y)f(of)g(a)o(v)o(oiding)262 +741 y(the)d(loss.)18 b(As)13 b(can)h(b)q(e)f(seen)h(the)g(actual)f(extra)g +(time)f(allo)q(cated)g(is)h(directly)h(prop)q(ortional)262 +791 y(to)e(the)i(threatened)h(loss.)j(This)13 b(approac)o(h)g(also)f(helps)i +(the)g(program)d(a)o(v)o(oid)h(the)i(horizon)262 841 y(e\013ect)20 +b(b)o(y)f(detecting)g(when)h(scores)g(drop)f(b)q(et)o(w)o(een)h(iterations,)g +(and)f(then)g(allo)q(cating)262 891 y(more)12 b(time)h(to)h(see)h(o)o(v)o(er) +f(the)g(searc)o(h)h(horizon.)324 976 y(When)e(the)g(di\013erence)i(is)e +(greater)h(than)e Ff(\000)p Fp(16,)h(no)f(extra)i(time)d(is)i(allo)q(cated.)k +(In)c(fact,)262 1026 y(the)j(time)e(is)h(reduced)i(for)e(n)o(umerous)g(ob)o +(vious)g(mo)o(v)o(es.)21 b(The)16 b(follo)o(wing)d(attributes)j(are)262 +1075 y(tak)o(en)e(in)o(to)f(accoun)o(t)h(for)g(time)e(reduction:)324 +1190 y Ff(\017)20 b Fp(Whether)15 b(the)f(b)q(est)g(mo)o(v)o(e)e(has)i(main)o +(tained)d(top)i(p)q(osition)g(throughout)g(all)g(itera-)365 +1240 y(tions.)324 1321 y Ff(\017)20 b Fp(Whether)15 b(a)f(fail)e(lo)o(w)h(or) +h(high)f(has)h(o)q(ccurred)i(during)e(this)f(searc)o(h.)324 +1402 y Ff(\017)20 b Fp(Whether)15 b(the)g(b)q(est)g(mo)o(v)o(e)d(is)i +(clearly)f(b)q(etter)j(than)e(all)e(its)i(siblings.)324 1484 +y Ff(\017)20 b Fp(Whether)15 b(the)g(mo)o(v)o(e)d(is)i(a)f(capture)i(or)f +(recapture.)324 1565 y Ff(\017)20 b Fp(Whether)c(the)e(mo)o(v)o(e)f(w)o(as)h +(part)g(of)g(the)h(main)d(line)h(predicted)j(from)c(the)j(previous)365 +1615 y(searc)o(h.)324 1696 y Ff(\017)20 b Fp(Whether)11 b(a)e(mo)o(v)o(e's)f +(v)n(alue)h(falls)g(within)g(a)g(score)i(range)f(predicted)h(b)o(y)e(the)h +(previous)365 1745 y(searc)o(h.)262 1860 y(Giv)o(en)19 b(this)i(information,) +d(the)j(time)f(allo)q(cation)e(function)i(can)h(mak)o(e)e(a)h(reasonable)262 +1910 y(decision)14 b(ab)q(out)f(what)h(can)g(safely)p 717 1925 +102 2 v 14 w(b)q(e)g(considered)i(ob)o(vious.)324 1995 y(Please)11 +b(note,)g(this)g(time)e(allo)q(cation)g(adjustmen)o(t)h(pro)q(cess)i(is)f +(con)o(tin)o(ually)e(p)q(erformed)262 2045 y(ev)o(ery)14 b(time)f(a)g(new)i +(b)q(est)g(mo)o(v)o(e)d(is)i(found)f(or)h(an)g(iteration)f(completes.)262 +2188 y Fl(Chec)o(king)h(Time)262 2300 y Fp(Whenev)o(er)g(the)g(allo)q(cated)f +(time)f(is)h(adjusted,)h(a)f(new)h(searc)o(h)h(expiry)e(time)f(exists.)19 +b(This)262 2350 y(expiry)10 b(time)f(is)h(calculated)h(from)d(the)j(resp)q +(onse)i(time,)c(extra)i(time,)e(time)g(sp)q(en)o(t)j(thinking)262 +2399 y(on)i(opp)q(onen)o(ts)i(time)d(and)i(the)h(max)d(time.)20 +b(Using)15 b(this)g(expiry)g(time,)e(an)i(alarm)e(call)h(is)262 +2449 y(set)i(up)g(to)f(signal)g(the)h(program)e(when)i(its)f(searc)o(h)i +(time)d(has)i(matured.)23 b(Additionally)m(,)946 2574 y(138)p +eop +%%Page: 139 141 +139 140 bop 262 307 a Fp(b)q(efore)19 b(setting)f(a)g(new)h(alarm)d(call)i +(time,)g(the)h(old)e('alarm)f(call')h(m)o(ust)g(b)q(e)i(cancelled.)262 +357 y(This)13 b(approac)o(h)h(mak)o(es)f(use)i(of)e(the)h(UNIX)h(system)e +(call)g Fm(alarm)p Fp(.)262 530 y Fr(6.5)69 b(E\016ciency)22 +b(Asp)r(ects)262 656 y Fp(E\016ciency)f(is)f(v)o(ery)h(imp)q(ortan)o(t)d(to)j +(an)o(y)f(c)o(hess)i(program.)36 b(In)20 b(fact,)i(b)q(ecause)g(of)e(the)262 +706 y(un)o(usually)14 b(dominan)o(t)g(factor)i(of)f(e\016ciency)m(,)h(c)o +(hess)h(programs)e(are)h(usually)f(quite)h(hard)262 756 y(to)h(follo)o(w.)28 +b(I)17 b(ha)o(v)o(e)h(tried)g(to)g(mak)o(e)e(HIAR)o(CS)h(as)h(clear)g(and)g +(easy)g(to)g(understand)h(as)262 805 y(p)q(ossible,)13 b(while)h(k)o(eeping)f +(to)h(the)h(o)o(v)o(erall)d(aims)h(of)g(e\016ciency)m(.)324 +891 y(The)e(follo)o(wing)e(sections)j(explain)e(program)g(e\016ciency)i(from) +d(three)j(di\013eren)o(t)g(angles:)262 1042 y Fu(6.5.1)55 b(Algorithms)262 +1154 y Fp(T)m(ree)17 b(searc)o(hing)h(e\016ciency)g(is)f(of)f(primary)g(imp)q +(ortance)g(to)h(the)h(o)o(v)o(erall)e(sp)q(eed)i(of)f(the)262 +1204 y(program.)25 b(F)m(or)17 b(example,)f(the)i(di\013erence)h(b)q(et)o(w)o +(een)f(applying)e Fh(\013\014)j Fp(to)e(a)g(w)o(ell)f(ordered)262 +1254 y(tree)g(and)g(a)f(badly)g(ordered)i(tree)g(is)f(man)o(y)e(orders)i(of)f +(magnitude.)22 b(In)16 b(HIAR)o(CS,)f(par-)262 1304 y(ticular)g(atten)o(tion) +g(has)h(b)q(een)h(paid)e(to)g(impro)o(ving)e(mo)o(v)o(e)h(ordering)h(to)h +(therefore)h(a)o(v)o(oid)262 1354 y(exploration)c(of)g(man)o(y)f(unnecessary) +k(no)q(des.)324 1439 y(Other)11 b(areas)g(lik)o(e)e(mo)o(v)o(e)f(generation,) +j(for)f(example,)f(ha)o(v)o(e)h(b)q(een)h(made)e(more)g(e\016cien)o(t)262 +1489 y(b)o(y)k(the)i(use)f(of)g(suitable)f(data)h(structures.)262 +1640 y Fu(6.5.2)55 b(Data)19 b(Structures)262 1752 y Fp(Data)c(structure)k +(comp)q(osition)c(mak)o(es)g(a)h(large)h(con)o(tribution)f(to)g(o)o(v)o +(erall)g(program)f(ef-)262 1802 y(\014ciency)j(b)o(y)f(allo)o(wing)e(fast)i +(storage)g(and)h(retriev)n(al)f(of)f(imp)q(ortan)o(t)g(information.)25 +b(The)262 1852 y(incremen)o(tal)13 b(attac)o(k)g(tables)i(and)e(transp)q +(osition)h(table)g(are)g(ob)o(vious)g(examples)f(of)g(this.)262 +1902 y(The)e(rather)i(complex)d(ev)n(aluation)g(function)h(w)o(ould)f(b)q(e)j +(just)e(to)q(o)g(exp)q(ensiv)o(e)i(to)e(compute)262 1952 y(w)o(ere)j(it)g +(not)g(for)f(the)i(attac)o(k)f(tables.)324 2037 y(Without)d(the)h(use)g(of)f +(a)g(large)g(easily)g(accessible)i(transp)q(osition)e(table,)h(m)o(uc)o(h)e +(w)o(asted)262 2087 y(e\013ort)18 b(w)o(ould)f(result)h(from)e(exploring)h +(duplicate)h(subtrees.)32 b(The)18 b(impro)o(v)o(emen)o(ts)d(are)262 +2137 y(particularly)f(eviden)o(t)j(in)e(the)h(endgame,)f(where)i(a)e(5-fold)g +(sp)q(eed)i(impro)o(v)o(emen)o(t)c(is)j(not)262 2186 y(uncommon.)946 +2574 y(139)p eop +%%Page: 140 142 +140 141 bop 262 307 a Fu(6.5.3)55 b(Co)r(de)18 b(Pro)r(duction)262 +419 y Fp(Consideration)d(m)o(ust)g(also)g(b)q(e)h(giv)o(en)f(to)h(the)g(co)q +(de)h(pro)q(duced)g(b)o(y)e(the)i(C)e(compiler.)23 b(It)262 +469 y(ma)o(y)17 b(ha)o(v)o(e)j(b)q(een)h(noted)g(ho)o(w)e(all)g(m)o(y)f(main) +g(data)h(structure)j(records)g(are)e(of)f(a)h(size)262 519 +y(divisible)e(b)o(y)i(2.)35 b(This)20 b(allo)o(ws)f(the)h(compiler)f(to)g +(use)i(a)e(less)i(time)d(consuming)h(shift)262 569 y(op)q(eration,)13 +b(instead)h(of)f(m)o(ultiplication,)d(to)k(access)i(individual)11 +b(records.)324 654 y(Unsigned)19 b(data)f(t)o(yp)q(es)h(are)g(used)h(where)g +(p)q(ossible)e(to)h(impro)o(v)o(e)e(the)i(e\016ciency)g(of)262 +704 y(the)13 b(addressing)h(co)q(de)g(pro)q(duced.)20 b(F)m(or)12 +b(example,)g(when)i(using)f(a)g(signed)g(16)g(bit)g(in)o(teger)262 +754 y(as)k(an)f(index)h(in)o(to)f(an)h(arra)o(y)m(,)f(the)i(compiler)d(m)o +(ust)h(pro)q(duce)i(an)f(extra)h(instruction)f(to)262 803 y(p)q(erform)d +(sign)i(extensions)h(\(EXT.L)e(on)h(a)f(MC68000\))g(in)h(a)f(32)g(bit)h +(addressing)g(mo)q(de.)262 853 y(With)d(unsigned)h(in)o(tegers,)g(none)g(of)g +(this)g(is)f(necessary)m(.)324 938 y(All)g(constructs)j(and)e(expressions)i +(whic)o(h)e(pro)q(duce)i(time)d(exp)q(ensiv)o(e)i(mac)o(hine)e(co)q(de)262 +988 y(are)h(a)o(v)o(oided)f(where)i(p)q(ossible.)j(F)m(or)c(example,)e(few)i +(division)e(op)q(erations)i(are)h(used.)324 1073 y(Most)g(functions)g(use)h +(register)g(v)n(ariables)e(for)g(the)i(most)d(commonly)f(used)j(data)g(ob-) +262 1123 y(jects.)36 b(Of)19 b(course,)j(ho)o(w)d(often)h(these)h(v)n +(ariables)d(are)i(register)h(residen)o(t)g(dep)q(ends)g(on)262 +1173 y(UNIX)14 b(and)f(the)i(C)f(Compiler.)324 1258 y(Unfolding)f(lo)q(ops)i +(and)f(pro)q(ducing)h(linear)g(co)q(de)g(is)g(another)g(tric)o(k)g(to)g +(extract)h(more)262 1308 y(sp)q(eed.)j(Ho)o(w)o(ev)o(er,)12 +b(I)g(ha)o(v)o(e)g(a)o(v)o(oided)g(suc)o(h)h(practice)g(on)f(the)h(whole)f +(to)g(impro)o(v)o(e)e(readabil-)262 1358 y(it)o(y)j(and)h(ease)g(dev)o +(elopmen)o(t)f(testing.)324 1443 y(I)k(ha)o(v)o(e)h(made)e(a)h(n)o(um)o(b)q +(er)g(of)g(critical)g(v)n(ariables)g(global)f(to)h(a)o(v)o(oid)f(using)i(up)f +(time,)262 1493 y(passing)h(large)g(amoun)o(ts)g(of)g(data)g(on)g(the)i(stac) +o(k.)32 b(Ho)o(w)o(ev)o(er,)20 b(I)f(ha)o(v)o(e)f(also)g(emplo)o(y)o(ed)262 +1543 y(some)e(data)h(hiding)f(tec)o(hniques)j(where)f(suitable)g(to)f(ease)h +(dev)o(elopmen)o(t)e(and)i(testing.)262 1593 y(The)c(HashDriv)o(er)g(mo)q +(dule)e(is)i(an)g(ob)o(vious)f(example)g(of)g(this.)324 1678 +y(Individually)m(,)18 b(all)g(these)j(impro)o(v)o(em)o(en)o(ts)d(are)h(v)o +(ery)h(small.)32 b(Ho)o(w)o(ev)o(er,)21 b(when)f(y)o(ou)262 +1728 y(consider)15 b(that)g(a)f(n)o(um)o(b)q(er)g(of)h(co)q(de)g(units)g(are) +g(executed)i(man)o(y)c(milli)o(ons)f(of)i(times,)g(the)262 +1778 y(o)o(v)o(erall)e(e\013ect)k(can)e(b)q(e)g(quite)g(impressiv)o(e.)946 +2574 y(140)p eop +%%Page: 141 143 +141 142 bop 262 654 a Fn(Chapter)34 b(7)262 897 y Fo(Program)40 +b(P)m(erformance)262 1148 y Fp(In)17 b(order)h(to)f(b)q(e)i(able)e(to)g(ev)n +(aluate)g(the)h(tec)o(hniques)h(emplo)o(y)o(ed)d(in)h(HIAR)o(CS)g(5.0,)g(the) +262 1198 y(program's)g(strengths)k(and)d(w)o(eaknesses)k(need)e(to)f(b)q(e)g +(assessed.)36 b(F)m(ortunately)m(,)19 b(c)o(hess)262 1248 y(pro)o(vides)14 +b(man)o(y)e(w)o(a)o(ys)h(of)g(testing)i(a)e('pla)o(y)o(ers')g(abilit)o(y)m(.) +324 1333 y(The)g(ELO)h(c)o(hess)g(rating)f(system)g([19)o(])f(has)h(b)q(een)h +(used)g(w)o(orld)f(wide)g(for)g(o)o(v)o(er)g(t)o(w)o(en)o(t)o(y)262 +1383 y(y)o(ears)h(to)h(estimate)e(a)h(pla)o(y)o(er's)g(abilit)o(y)f(in)h +(terms)g(of)f(rating)h(p)q(oin)o(ts.)20 b(Chess)15 b(ratings)f(are)262 +1433 y(ac)o(hiev)o(ed)h(b)o(y)f(pla)o(ying)f(a)i(n)o(um)o(b)q(er)f(of)g +(games)g(against)g(already)g(rated)i(pla)o(y)o(ers.)k(Using)15 +b(a)262 1483 y(rating/probabilit)o(y)c(table,)i(a)h(rating)f(can)h(b)q(e)h +(calculated)f(based)h(on)e(ones)i(p)q(erformance)262 1532 y(against)9 +b(the)i(rated)f(pla)o(y)o(ers.)17 b(I)10 b(will)e(use)j(a)f(similar)e(metho)q +(d)h(to)h(pro)o(vide)g(a)f(rough)h(estimate)262 1582 y(of)j(HIAR)o(CS's)g(c)o +(hess)j(rating.)324 1667 y(Chess)g(ratings)g(can)f(also)g(b)q(e)h(estimated)f +(from)f(a)h(set)h(of)f(test)i(p)q(ositions.)22 b(Although)262 +1717 y(this)d(metho)q(d)g(is)h(not)f(used)i(o\016cially)d(to)h(rate)h(pla)o +(y)o(ers,)h(it)e(can)h(b)q(e)h(used)f(to)g(giv)o(e)f(an)262 +1767 y(estimate)11 b(of)h(the)h(tested)h(pla)o(y)o(ers)e(rating.)17 +b(Also,)12 b(these)h(tests)h(allo)o(w)d(a)h(pla)o(y)o(er's)g(abilit)o(y)e(in) +262 1817 y(v)n(arious)k(areas)i(of)f(c)o(hess,)h(e.g.)23 b(tactical)15 +b(pla)o(y)m(,)e(to)j(b)q(e)g(measured.)22 b(Therefore,)16 b(suc)o(h)h(test) +262 1867 y(p)q(ositions)9 b(will)f(b)q(e)j(useful)f(to)g(me)f(in)g(iden)o +(tifying)f(the)j(relativ)o(e)e(strengths)j(and)e(w)o(eaknesses)262 +1916 y(of)j(HIAR)o(CS.)324 2002 y(The)j(follo)o(wing)d(tests)k(will)d(b)q(e)i +(p)q(erformed)g(to)f(assess)i(the)g(program's)d(o)o(v)o(erall)g(c)o(hess)262 +2052 y(rating,)e(st)o(yle,)i(strength)h(and)f(w)o(eakness)h(in)e(the)i(v)n +(arious)e(areas)h(of)g(the)g(game:)312 2170 y(1.)20 b Fl(Bratk)o(o-Kop)q(ec)g +(T)l(ests)p Fp(:)k(These)19 b(test)g(p)q(ositions)e(will)f(b)q(e)i(used)h(to) +e(estimate)g(a)365 2220 y(rating)10 b(and)f(assess)j(b)q(oth)e(the)g +(tactical)g(and)f(p)q(ositional)g(strengths)i(of)e(the)i(program.)312 +2303 y(2.)20 b Fl(Computer)15 b(Opp)q(osition)p Fp(:)h(A)e(matc)o(h)g(will)f +(b)q(e)i(pla)o(y)o(ed)f(b)q(et)o(w)o(een)i(HIAR)o(CS)e(and)365 +2353 y(a)g(rated)h(computer)e(opp)q(onen)o(t)h(to)g(illustrate)g(its)g(pla)o +(ying)e(st)o(yle)i(and)g(estimate)g(its)365 2402 y(rating.)946 +2574 y(141)p eop +%%Page: 142 144 +142 143 bop 312 307 a Fp(3.)20 b Fl(Human)f(Opp)q(osition)o +Fp(:)h(A)d(matc)o(h)e(will)g(b)q(e)i(pla)o(y)o(ed)f(b)q(et)o(w)o(een)i(HIAR)o +(CS)f(and)f(a)365 357 y(rated)h(h)o(uman)d(opp)q(onen)o(t)j(to)f(\014nd)g +(out)g(ho)o(w)f(it)h(cop)q(es)h(with)f(a)g(h)o(uman's)e(st)o(yle)i(of)365 +407 y(pla)o(y)d(and)h(to)g(further)g(estimate)g(its)g(rating.)312 +490 y(4.)20 b Fl(Kno)o(wledge)c(v)o(ersus)g(Searc)o(h)p Fp(:)k(A)15 +b(matc)o(h)g(will)e(b)q(e)j(pla)o(y)o(ed)f(b)q(et)o(w)o(een)i(HIAR)o(CS)365 +540 y(and)c(a)g(v)o(ersion)g(of)f(itself)g(with)h(dramatically)d(reduced)15 +b(leaf)d(no)q(de)h(kno)o(wledge)g(and)365 589 y(no)19 b(searc)o(h)g +(extensions.)33 b(This)18 b('kno)o(wledge-less')g(v)o(ersion)h(of)f(HIAR)o +(CS)g(will)f(b)q(e)365 639 y(allo)o(w)o(ed)h(to)g(searc)o(h)i(3)e(ply)h(deep) +q(er)h(than)f(the)g(more)f(in)o(telligen)o(t)f(v)o(ersion.)33 +b(This)365 689 y(should)18 b(enable)g(me)f(to)h(estimate)g(what)g(the)g(kno)o +(wledge)g(is)g(w)o(orth)g(in)f(terms)h(of)365 739 y(searc)o(h)d(depth.)324 +857 y(All)h(tests)j(are)f(p)q(erformed)f(with)g(HIAR)o(CS)g(5.0)f(running)h +(on)g(a)g(SUN)h(3/80,)f(whic)o(h)262 907 y(pro)o(vides)d(a)f(rate)i(of)e +(appro)o(ximately)e(300)i(to)h(1200)f(\(legal\))g(no)q(des)i(p)q(er)g +(second.)262 1080 y Fr(7.1)69 b(Bratk)n(o-Kop)r(ec)23 b(T)-6 +b(ests)262 1206 y Fp(A)10 b(series)i(of)d(24)h(test)h(p)q(ositions)f(w)o(as)h +(devised)g(b)o(y)f(I.)f(Bratk)o(o)i(and)f(D.)f(Kop)q(ec)j(to)e(in)o(v)o +(estigate)262 1256 y(and)j(assess)j(c)o(hess)f(p)q(erformance)f(under)h(t)o +(w)o(o)e(categories:)324 1374 y Ff(\017)20 b Fp(T)m(actical)13 +b(pla)o(y)324 1458 y Ff(\017)20 b Fp(P)o(ositional)13 b(pla)o(y)262 +1576 y(The)f(p)q(ositional)f(tests)i(concen)o(trate)h(in)e(particular)g(on)f +(lev)o(er)i(mo)o(v)o(es,)e(whic)o(h)h(Bratk)o(o)g(and)262 1626 +y(Kop)q(ec)j(b)q(eliev)o(ed,)e(pla)o(y)g(an)h(imp)q(ortan)o(t)e(role)i(in)f +(a)h(strong)g(pla)o(y)o(ers)g(abilit)o(y)m(.)324 1711 y(This)f(test)h(set)h +(w)o(as)e(c)o(hosen)h(in)f(particular)g(b)q(ecause)i(it)e(has)h(b)q(een)h +(applied)d(to)h(almost)262 1761 y(all)18 b(the)j(strongest)h(c)o(hess)f +(programs)e(in)h(the)h(w)o(orld)e([41)o(],)i(therefore)h(allo)o(wing)17 +b(useful)262 1811 y(comparisons)f(to)h(b)q(e)h(made.)28 b(In)17 +b(the)h(original)e(test,)i(pla)o(y)o(ers)g(w)o(ere)g(ask)o(ed)g(to)f(giv)o(e) +g(the)262 1860 y(b)q(est)g(four)f(mo)o(v)o(es)e(in)i(order)h(of)e(merit)g +(for)h(eac)o(h)h(p)q(osition.)24 b(A)16 b(correct)i(mo)o(v)o(e)c(w)o(as)i +(then)262 1910 y(scored)j(as)f(follo)o(ws:)25 b(1)17 b(p)q(oin)o(t)h(for)g(a) +f(correct)j(1st)e(c)o(hoice,)1226 1894 y Fk(1)p 1226 1901 17 +2 v 1226 1925 a(2)1265 1910 y Fp(p)q(oin)o(t)g(for)f(a)h(correct)i(2nd)262 +1960 y(c)o(hoice,)401 1944 y Fk(1)p 401 1951 V 401 1974 a(3)437 +1960 y Fp(p)q(oin)o(t)13 b(for)h(a)f(correct)j(3rd)e(c)o(hoice)g(and)1065 +1944 y Fk(1)p 1065 1951 V 1065 1974 a(4)1100 1960 y Fp(p)q(oin)o(t)g(for)f(a) +h(correct)h(4th)f(c)o(hoice.)324 2045 y(The)f(problem)f(with)h(computer)f +(test)j(sub)r(jects)f(is)f(that)g(the)h Fh(\013\014)i Fp(algorithm)10 +b(do)q(es)k(not)262 2095 y(pro)o(vide)f(an)f(accurate)j(b)q(est)f(n)f(c)o +(hoices,)h(only)f(the)g(b)q(est)i(mo)o(v)o(e)c(found)i(so)g(far.)18 +b(Therefore,)262 2145 y(Bratk)o(o)g(and)f(Kop)q(ec)i(suggested)h(the)e +(computers)h(c)o(hoice)f(after)g(120,)g(180,)g(30)f(and)h(60)262 +2195 y(seconds)f(should)e(b)q(e)h(used)h(as)e(the)i(1st,)e(2nd,)h(3rd)g(and)f +(4th)g(c)o(hoices)i(resp)q(ectiv)o(ely)m(.)24 b(The)262 2245 +y(computer)16 b(is)h(therefore)h(at)f(a)g(sligh)o(t)f(disadv)n(an)o(tage)g +(as)h(its)g(4)f(c)o(hoices)i(ma)o(y)d(all)g(b)q(e)j(the)262 +2294 y(same.)324 2380 y(The)13 b(actual)f(test)i(p)q(ositions)e(can)h(b)q(e)g +(found)g(in)f(app)q(endix)h(D.)e(The)j(results)f(pro)q(duced)262 +2429 y(b)o(y)g(HIAR)o(CS)h(5.0)f(are)h(sho)o(wn)g(in)f(\014gure)i(7.1.)946 +2574 y(142)p eop +%%Page: 143 145 +143 144 bop 344 596 1268 2 v 343 646 2 50 v 369 631 a Fm(No.)p +496 646 V 88 w(Best)15 b(move)p 733 646 V 88 w(1st)p 911 646 +V 119 w(2nd)p 1089 646 V 117 w(3r)n(d)p 1267 646 V 121 w(4th)p +1445 646 V 85 w(Points)p 1611 646 V 344 648 1268 2 v 343 697 +2 50 v 369 682 a Fp(1\(T\))p 496 697 V 70 w(...)i(Qd1+)p 733 +697 V 86 w(Qd1+)p 911 697 V 195 w(forced)e(mate)p 1445 697 +V 231 w(1)p 1611 697 V 344 699 1268 2 v 343 749 2 50 v 369 +734 a(2\(L\))p 496 749 V 74 w(d5)p 733 749 V 222 w(Re3)p 911 +749 V 108 w(Re3)p 1089 749 V 108 w(Re3)p 1267 749 V 108 w(Re3)p +1445 749 V 126 w(0)p 1611 749 V 344 750 1268 2 v 343 800 2 +50 v 369 785 a(3\(L\))p 496 800 V 74 w(...)i(f5)p 733 800 V +197 w(f5)p 911 800 V 144 w(f5)p 1089 800 V 123 w(Qd8)p 1267 +800 V 102 w(Qd8)p 1445 800 V 123 w(1)p 1611 800 V 344 802 1268 +2 v 343 852 2 50 v 369 837 a(4\(L\))p 496 852 V 74 w(e6)p 733 +852 V 243 w(e6)p 911 852 V 138 w(e6)p 1089 852 V 139 w(e6)p +1267 852 V 139 w(e6)p 1445 852 V 142 w(1)p 1611 852 V 344 853 +1268 2 v 343 903 2 51 v 369 888 a(5\(T\))p 496 903 V 70 w(Nd5)p +733 903 V 195 w(Bf4)p 911 903 V 115 w(Bf4)p 1089 903 V 108 +w(Nd5)p 1267 903 V 103 w(Nd5)p 1445 903 V 1520 872 a Fk(1)p +1520 879 17 2 v 1520 903 a(3)p 1611 903 2 51 v 344 905 1268 +2 v 343 955 2 50 v 369 940 a Fp(6\(L\))p 496 955 V 74 w(g6)p +733 955 V 238 w(g6)p 911 955 V 136 w(g6)p 1089 955 V 137 w(c4)p +1267 955 V 139 w(c4)p 1445 955 V 142 w(1)p 1611 955 V 344 957 +1268 2 v 343 1006 2 50 v 369 991 a(7\(T\))p 496 1006 V 70 w(Nf6)p +733 1006 V 200 w(Bb4)p 911 1006 V 104 w(Bb4)p 1089 1006 V 106 +w(Rg3)p 1267 1006 V 105 w(Rg3)p 1445 1006 V 124 w(0)p 1611 +1006 V 344 1008 1268 2 v 343 1058 2 50 v 369 1043 a(8\(L\))p +496 1058 V 74 w(f5)p 733 1058 V 250 w(f5)p 911 1058 V 144 w(f5)p +1089 1058 V 144 w(f5)p 1267 1058 V 144 w(f5)p 1445 1058 V 144 +w(1)p 1611 1058 V 344 1059 1268 2 v 343 1109 2 50 v 369 1094 +a(9\(L\))p 496 1109 V 74 w(f5)p 733 1109 V 232 w(Re1)p 911 +1109 V 108 w(Re1)p 1089 1109 V 108 w(Re1)p 1267 1109 V 108 +w(Re1)p 1445 1109 V 126 w(0)p 1611 1109 V 344 1111 1268 2 v +343 1161 2 50 v 369 1146 a(10\(T\))p 496 1161 V 49 w(...)g(Ne5)p +733 1161 V 142 w(Qc5)p 911 1161 V 107 w(Qc5)p 1089 1161 V 107 +w(Qc5)p 1267 1161 V 107 w(Qc5)p 1445 1161 V 126 w(0)p 1611 +1161 V 344 1162 1268 2 v 343 1212 2 50 v 369 1197 a(11\(L\))p +496 1212 V 53 w(f4)p 733 1212 V 235 w(Nf5)p 911 1212 V 113 +w(Nf5)p 1089 1212 V 113 w(Nf5)p 1267 1212 V 112 w(Nf5)p 1445 +1212 V 129 w(0)p 1611 1212 V 344 1214 1268 2 v 343 1264 2 50 +v 369 1249 a(12\(T\))p 496 1264 V 49 w(...)g(Bf5)p 733 1264 +V 154 w(Bf5)p 911 1264 V 115 w(Bf5)p 1089 1264 V 114 w(Bf5)p +1267 1264 V 115 w(Bf5)p 1445 1264 V 130 w(1)p 1611 1264 V 344 +1265 1268 2 v 343 1315 2 50 v 369 1300 a(13\(L\))p 496 1315 +V 53 w(b4)p 733 1315 V 222 w(Rc1)p 911 1315 V 108 w(Rc1)p 1089 +1315 V 108 w(Rc1)p 1267 1315 V 108 w(Rc1)p 1445 1315 V 126 +w(0)p 1611 1315 V 344 1317 1268 2 v 343 1367 2 50 v 369 1352 +a(14\(T\))p 496 1367 V 49 w(Qd2)p 733 1367 V 187 w(Qd2)p 911 +1367 V 102 w(Qd2)p 1089 1367 V 102 w(Qd2)p 1267 1367 V 102 +w(Qd2)p 1445 1367 V 123 w(1)p 1611 1367 V 344 1368 1268 2 v +343 1418 2 50 v 369 1403 a(15\(T\))p 496 1418 V 49 w(Qxg7+)p +733 1418 V 109 w(Qxg7+)p 911 1418 V 50 w(Qxg7+)p 1089 1418 +V 50 w(Qxg7+)p 1267 1418 V 50 w(Qxg7+)p 1445 1418 V 97 w(1)p +1611 1418 V 344 1420 1268 2 v 343 1470 2 50 v 369 1455 a(16\(T\))p +496 1470 V 49 w(Ne4)p 733 1470 V 196 w(Ne4)p 911 1470 V 108 +w(Ne4)p 1089 1470 V 108 w(Ne4)p 1267 1470 V 107 w(Ne4)p 1445 +1470 V 127 w(1)p 1611 1470 V 344 1471 1268 2 v 343 1521 2 50 +v 369 1506 a(17\(L\))p 496 1521 V 53 w(...)g(h5)p 733 1521 +V 182 w(h5)p 911 1521 V 134 w(h5)p 1089 1521 V 121 w(Nc5)p +1267 1521 V 121 w(h5)p 1445 1521 V 139 w(1)p 1611 1521 V 344 +1523 1268 2 v 343 1573 2 50 v 369 1558 a(18\(T\))p 496 1573 +V 49 w(...)g(Nb3)p 733 1573 V 156 w(f5)p 911 1573 V 144 w(f5)p +1089 1573 V 144 w(f5)p 1267 1573 V 144 w(f5)p 1445 1573 V 144 +w(0)p 1611 1573 V 344 1574 1268 2 v 343 1624 2 50 v 369 1609 +a(19\(T\))p 496 1624 V 49 w(...)g(Rxe4)p 733 1624 V 110 w(Rxe4)p +911 1624 V 86 w(Rxe4)p 1089 1624 V 112 w(c5)p 1267 1624 V 139 +w(c5)p 1445 1624 V 142 w(1)p 1611 1624 V 344 1626 1268 2 v +343 1676 2 50 v 369 1661 a(20\(L\))p 496 1676 V 53 w(g4)p 733 +1676 V 221 w(Qh5)p 911 1676 V 102 w(Qh5)p 1089 1676 V 102 w(Kb1)p +1267 1676 V 102 w(Kb1)p 1445 1676 V 123 w(0)p 1611 1676 V 344 +1677 1268 2 v 343 1727 2 50 v 369 1712 a(21\(T\))p 496 1727 +V 49 w(Nh6)p 733 1727 V 189 w(Nh6)p 911 1727 V 103 w(Nh6)p +1089 1727 V 102 w(Nh6)p 1267 1727 V 103 w(Nh6)p 1445 1727 V +124 w(1)p 1611 1727 V 344 1729 1268 2 v 343 1778 2 50 v 369 +1764 a(22\(T\))p 496 1778 V 49 w(...)g(Bxe4)p 733 1778 V 121 +w(Rd8)p 911 1778 V 103 w(Rd8)p 1089 1778 V 105 w(Nc5)p 1267 +1778 V 107 w(Nc5)p 1445 1778 V 127 w(0)p 1611 1778 V 344 1780 +1268 2 v 343 1830 2 50 v 369 1815 a(23\(L\))p 496 1830 V 53 +w(...)g(f6)p 733 1830 V 183 w(Bf5)p 911 1830 V 115 w(Bf5)p +1089 1830 V 114 w(Bf5)p 1267 1830 V 115 w(Bf5)p 1445 1830 V +130 w(0)p 1611 1830 V 344 1832 1268 2 v 343 1881 2 50 v 369 +1866 a(24\(L\))p 496 1881 V 53 w(f4)p 733 1881 V 250 w(f4)p +911 1881 V 144 w(f4)p 1089 1881 V 144 w(f4)p 1267 1881 V 144 +w(f4)p 1445 1881 V 144 w(1)p 1611 1881 V 344 1883 1268 2 v +343 1933 2 51 v 369 1918 a Fm(T)m(otal)d(T)m(actic)n(al)g(Sc)n(or)n(e)h +(\(T\))p 1445 1933 V 696 w Fp(7)1531 1902 y Fk(1)p 1531 1909 +17 2 v 1531 1932 a(3)p 1611 1933 2 51 v 344 1935 1268 2 v 343 +1985 2 50 v 369 1970 a Fm(T)m(otal)f(L)n(ever)g(Sc)n(or)n(e)h(\(L\))p +1445 1985 V 757 w Fp(6)p 1611 1985 V 344 1986 1268 2 v 343 +2036 2 51 v 369 2021 a Fm(T)m(otal)f(Sc)n(or)n(e)h(\(S\))p +1445 2036 V 850 w Fp(13)1542 2005 y Fk(1)p 1541 2012 17 2 v +1541 2036 a(3)p 1611 2036 2 51 v 344 2038 1268 2 v 354 2154 +a Fp(Figure)f(7.1:)j(HIAR)o(CS)c(5.0)g(results)i(on)f(the)g(Bratk)o(o-Kop)q +(ec)h(T)m(est)f(P)o(ositions.)946 2574 y(143)p eop +%%Page: 144 146 +144 145 bop 324 307 a Fp(T)m(o)14 b(determine)h(the)h(relativ)o(e)f(bias)g +(of)f(the)i(tested)h(pla)o(y)o(ers,)e(Bratk)o(o)g(and)g(Kop)q(ec)h(de-)262 +361 y(vised)f(the)h(follo)o(wing)c(equation:)21 b(bias)15 b(=)945 +341 y Fk(12)p Fd(\001)p Fk(\()p Fe(T)t Fd(\000)p Fe(L)p Fk(\))p +945 352 142 2 v 1005 376 a Fe(S)1092 361 y Fp(,)g(where)h(T)f(is)h(the)f +(tactical)g(score,)i(L)262 411 y(is)e(the)h(lev)o(er)h(score,)f(and)g(S)g(is) +f(the)i(total)e(score.)24 b(This)16 b(equation)f(will)g(pro)q(duce)i(a)e(p)q +(osi-)262 461 y(tiv)o(e)e(bias)h(v)n(alue)f(for)h(tactically)f(orien)o(ted)h +(results)h(and)f(a)g(negativ)o(e)g(bias)f(v)n(alue)h(for)f(lev)o(er)262 +511 y(orien)o(ted)h(results.)324 596 y(Using)i(the)h(results)g(pro)q(duced)g +(b)o(y)f(HIAR)o(CS,)g(this)g(equation)g(pro)q(duces)i(a)e(v)n(alue)f(of)262 +646 y(+1.2.)h(This)c(indicates)g(that)g(the)g(program)e(has)i(a)g(sligh)o(t)e +(tactical)i(bias.)17 b(Ho)o(w)o(ev)o(er,)12 b(when)262 696 +y(Bratk)o(o)18 b(and)g(Kop)q(ec)h(pro)q(duced)g(a)f(histogram)f(of)g(the)i +(bias)f(v)n(alues)g(pro)q(duced)h(b)o(y)f(the)262 745 y(c)o(hess)c(programs)e +(in)g(their)i(exp)q(erimen)o(t,)e(programs)g(w)o(ere)i(found)f(to)f(ha)o(v)o +(e)h(results)h(in)f(the)262 795 y(+2.4)d(to)i(+8)f(range)570 +780 y Fk(1)589 795 y Fp(.)17 b(The)12 b(most)f(frequen)o(t)h(v)n(alues)f(w)o +(ere)i(found)e(in)g(the)h(+3)g(to)f(+5)h(range.)262 845 y(Therefore,)18 +b(when)f(HIAR)o(CS's)g(bias)g(v)n(alue)f(is)h(compared)f(to)h(these)h +(results,)g(it)f(can)g(b)q(e)262 895 y(seen)e(that)f(HIAR)o(CS)f(has)h(a)g(w) +o(ell)f(balanced)h(tactical)g(and)f(p)q(ositional)g(abilit)o(y)m(.)324 +980 y(It)g(is)g(in)o(teresting)h(to)g(note)f(that)h(of)f(the)g(h)o(umans)g +(tested,)h(b)o(y)f(far)g(the)h(most)e(common)262 1030 y(v)n(alues)18 +b(la)o(y)g(in)h(the)g Ff(\000)p Fp(5)g(to)g(+3)g(range.)33 +b(Th)o(us,)20 b(indicating)e(that)h(most)f(h)o(uman)f(c)o(hess)262 +1080 y(pla)o(y)o(ers)c(ha)o(v)o(e)h(a)g(balanced)g(abilit)o(y)e(with)h(a)h +(sligh)o(t)f(emphasis)g(on)h(p)q(ositional)e(pla)o(y)m(.)324 +1165 y(Bratk)o(o)i(and)f(Kop)q(ec)i(also)e(ga)o(v)o(e)h(a)f(table)h(giving)e +(rating)i(ranges)g(and)g(corresp)q(onding)262 1215 y(mean)f(v)n(alues.)20 +b(The)15 b(v)n(alues)g(for)f(h)o(uman)f(pla)o(y)o(ers)i(in)f(the)h(ranges)h +(2000-2199)c(and)j(2200-)262 1265 y(2399)d(are)j(giv)o(en)e(b)q(elo)o(w:)p +516 1355 923 2 v 515 1405 2 50 v 541 1390 a Fm(R)n(ating)i(r)n(ange)p +797 1405 V 50 w(Me)n(an)h(T)p 990 1405 V 49 w(Me)n(an)g(L)p +1179 1405 V 50 w(12\(T)p Ff(\000)p Fm(L\)/S)p 1438 1405 V 516 +1407 923 2 v 515 1457 2 50 v 541 1442 a Fp(2000-2199)p 797 +1457 V 134 w(6.67)p 990 1457 V 116 w(4.84)p 1179 1457 V 150 +w(1.73)p 1438 1457 V 516 1458 923 2 v 515 1508 2 50 v 541 1493 +a(2200-2399)p 797 1508 V 134 w(7.81)p 990 1508 V 116 w(8.07)p +1179 1508 V 160 w(0.2)p 1438 1508 V 516 1510 923 2 v 324 1620 +a(Comparing)9 b(these)j(results)h(with)d(those)i(of)f(HIAR)o(CS,)f(it)h(can)g +(b)q(e)h(seen)h(that)e(HIAR)o(CS)262 1670 y(has)16 b(a)f(sligh)o(tly)g(b)q +(etter)i(tactical)f(score)h(\(T\))f(and)g(a)g(noticeably)f(b)q(etter)j(lev)o +(er)e(score)h(\(L\))262 1719 y(than)11 b(pla)o(y)o(ers)g(in)f(the)i +(2000-2199)d(rating)h(range.)17 b(P)o(erhaps)c(more)d(surprisingly)m(,)g +(HIAR)o(CS)262 1769 y(displa)o(y)o(ed)g(a)h(b)q(etter)i(balance)e(b)q(et)o(w) +o(een)h(tactical)f(and)g(p)q(ositional)f(abilit)o(y)f(than)i(the)h(mean)262 +1819 y(results)j(in)e(that)h(rating)f(range.)324 1904 y(F)m(or)g(the)h +(higher)g(rating)f(range,)h(HIAR)o(CS)f(has)h(a)f(lo)o(w)o(er)h(score,)g(b)q +(oth)g(tactically)f(and)262 1954 y(p)q(ositionally)m(.)i(It)f(is)g(in)o +(teresting,)g(ho)o(w)o(ev)o(er,)f(that)h(at)g(this)g(higher)g(range)g(the)g +(lev)o(er)g(score)262 2004 y(is)20 b(greater)h(than)g(the)g(corresp)q(onding) +g(tactical)g(score,)h(re-enforcing)f(m)o(y)e(b)q(elief)i(that)262 +2054 y(p)q(ositional)14 b(abilit)o(y)g(pla)o(ys)i(a)g(m)o(uc)o(h)e(greater)j +(role)f(in)g(high)f(lev)o(el)h(c)o(hess)h(than)f(it)g(do)q(es)h(at)262 +2104 y(the)d(lo)o(w)o(er)g(lev)o(els)f(of)h(abilit)o(y)m(.)324 +2189 y(Examining)9 b(the)k(Bratk)o(o-Kop)q(ec)g(graph)f(of)f(rating)h(vs)g +(score)i(and)d(the)i(results)g(ab)q(o)o(v)o(e,)262 2239 y(an)j(estimated)h +(rating)f(can)i(b)q(e)f(assigned)h(to)f(HIAR)o(CS.)f(As)h(the)h(test)g +(sample)e(is)h(small)262 2288 y(\(24)12 b(p)q(ositions\),)h(I)g(will)f(only)h +(sa)o(y)g(HIAR)o(CS's)g(rating)f(is)i(lik)o(ely)e(to)h(lie)f(in)h(the)h +(range)g(2030)p 262 2325 573 2 v 308 2352 a Fj(1)325 2364 y +Fi(ignoring)c(w)o(eak)i(programs)d(whic)o(h)j(had)f(scores)g(so)h(lo)o(w)g +(that)f(con\014dence)e(in)j(a)g(realistic)e(bias)h(v)n(alue)262 +2403 y(is)g(imp)q(ossible)946 2574 y Fp(144)p eop +%%Page: 145 147 +145 146 bop 262 307 a Fp(to)16 b(2170.)25 b(My)16 b(past)h(exp)q(erience)i +(of)d(c)o(hess)i(programs)d(b)q(eing)h(o)o(v)o(er-rated,)i(leads)e(me)g(to) +262 357 y(exp)q(ect)f(that)f(this)g(rating)f(is)h(more)f(lik)o(ely)f(to)i +(lie)f(at)h(the)h(lo)o(w)o(er)e(end)i(of)e(this)h(range.)324 +442 y(A)o(t)e(the)g(recen)o(t)h(\(1989\))e(W)m(orld)g(Computer)g(Chess)i +(Championship)c(all)i(the)h(strongest)262 492 y(programs)18 +b(w)o(ere)i(also)f(tested)j(on)d(these)i(Bratk)o(o-Kop)q(ec)g(test)f(p)q +(ositions)g([41)o(].)35 b(I)19 b(will)262 542 y(examine)c(the)j(reasons)h(wh) +o(y)e(HIAR)o(CS)f(could)i(not)f(solv)o(e)g(some)f(of)h(the)h(test)g(p)q +(ositions)262 592 y(and)h(using)g(the)h(ab)q(o)o(v)o(e)g(pap)q(er,)h(will)d +(compare)h(its)g(successes)k(and)d(failures)f(with)g(the)262 +641 y(results)c(pro)q(duced)g(b)o(y)e(the)i(strongest)g(c)o(hess)g(mac)o +(hines)e(in)h(the)g(w)o(orld.)324 727 y(Lo)q(oking)i(at)h(the)g(actual)g(mo)o +(v)o(es)f(selected)j(in)e(the)g(tests,)i(a)e(n)o(um)o(b)q(er)g(of)f(p)q(oin)o +(ts)h(are)262 777 y(w)o(orth)c(highligh)o(ting.)j(In)d(test)i(1,)e(HIAR)o(CS) +g(found)g(the)h(forced)h(mate)d(in)h(3)h(v)o(ery)g(quic)o(kly)262 +826 y(\(2)j(seconds\).)32 b(In)18 b(test)i(5,)e(the)g(correct)i(mo)o(v)o(e)d +(w)o(as)h(iden)o(ti\014ed)g(quic)o(kly)m(,)f(although)g(the)262 +876 y(program)12 b(w)o(as)h(not)h(fully)e(a)o(w)o(are)h(of)g(all)g(the)h(imp) +q(ortan)o(t)e(v)n(ariations.)k(After)f(1)e(min)o(ute)f(50)262 +926 y(seconds)17 b(its)g(c)o(hoice)g(c)o(hanged)f(to)h(Bf4)f(un)o(til)f(at)h +(the)h(next)g(iteration,)f(it)g(rev)o(erted)j(bac)o(k)262 976 +y(to)c(Nd5)g(once)h(ha)o(ving)e(examined)g(the)i(mo)o(v)o(e)e(to)h(enough)g +(depth)h(to)f(fully)f('understand')262 1026 y(it.)26 b(Ho)o(w)o(ev)o(er,)17 +b(this)g(to)q(ok)g(a)f(total)g(of)h(ab)q(out)f(4)h(min)o(utes)f(and)g(could)h +(therefore)h(not)f(b)q(e)262 1075 y(included)d(as)g(a)f(correct)j(answ)o(er.) +324 1161 y(Of)k(the)i(tests)g(not)f(solv)o(ed,)g(the)h(follo)o(wing)c +(reasons)k(can)f(b)q(e)g(iden)o(ti\014ed.)39 b(T)m(est)21 b(2)262 +1210 y(required)f(the)g(sacri\014ce)g(of)f(a)g(pa)o(wn)g(for)g(p)q(ositional) +f(comp)q(ensation)h(whic)o(h)g(HIAR)o(CS)262 1260 y(could)d(not)g(fully)g +(appreciate.)26 b(Ho)o(w)o(ev)o(er,)18 b(no)e(other)h(program)e(w)o(as)h +(able)h(to)f(solv)o(e)h(this)262 1310 y(problem)12 b(either.)324 +1395 y(In)18 b(test)h(7,)f(HIAR)o(CS)g(w)o(as)g(able)g(to)g(see)h(the)g +(correct)g(tactical)f(mo)o(v)o(e,)f(ho)o(w)o(ev)o(er,)i(it)262 +1445 y(disdained)e(the)g(mo)o(v)o(e)f(in)h(fa)o(v)o(our)f(of)h(the)h(strong)f +(in)o(termediary)f(mo)o(v)o(e)g(Bb4.)28 b(The)18 b(top)262 +1495 y(Mephisto)g(mac)o(hine)f(also)g(refused)i(to)f(pla)o(y)f(Nf6)h(and)f +(instead)i(c)o(hose)g(Qc1.)30 b(I)18 b(cannot)262 1545 y(b)q(eliev)o(e)c +(this)g(w)o(as)f(b)q(ecause)j(it)e(could)f(not)h(see)h(the)g(tactical)e(p)q +(ossibilities.)324 1630 y(In)f(tests)i(9,)e(11)f(and)i(13,)e(HIAR)o(CS)h(pla) +o(y)o(ed)g(strong)h(p)q(ositional)d(mo)o(v)o(es,)h(although)h(not)262 +1680 y(the)f(b)q(est)g(mo)o(v)o(e.)k(This)c(highligh)o(ts)e(one)i(of)e(the)j +(ma)r(jor)c(de\014ciencies)13 b(of)d(the)h(Bratk)o(o-Kop)q(ec)262 +1730 y(tests:)20 b(no)14 b(merit)f(is)h(giv)o(en)g(for)g(c)o(hosen)h(mo)o(v)o +(es)e(whic)o(h,)h(although)g(not)g(correct,)i(are)e(v)o(ery)262 +1779 y(strong)g(alternativ)o(es.)k(After)d(all,)d(p)q(ositional)h(mo)o(v)o +(es)f(are)j(sometimes)d(a)i(matter)f(of)g(st)o(yle)262 1829 +y(and)g('p)q(ersonal')h(preference.)324 1915 y(T)m(ests)h(10)f(and)g(22)g(w)o +(ere)h(just)g(to)q(o)f(deep,)h(tactically)f(sp)q(eaking,)g(for)g(HIAR)o(CS)g +(to)g(see)262 1964 y(in)h(the)h(allotted)e(t)o(w)o(o)h(min)o(utes.)22 +b(T)m(ests)16 b(20)f(and)h(23)f(are)h(v)o(ery)f(di\016cult)g(p)q(ositional)f +(tests)262 2014 y(whic)o(h)f(HIAR)o(CS,)g(lik)o(e)g(almost)f(all)h(other)i +(strong)f(programs)e(w)o(as)i(unable)g(to)g(solv)o(e.)324 2099 +y(I)21 b(w)o(as)f(particularly)g(impressed)h(b)o(y)g(HIAR)o(CS's)f(correct)i +(c)o(hoice)g(in)e(tests)i(3)f(and)262 2149 y(17.)27 b(None)18 +b(of)f(the)h(strongest)g(programs)e(w)o(ere)j(able)e(to)g(solv)o(e)g(test)h +(17,)f(indicating)g(its)262 2199 y(di\016cult)o(y)m(.)i(The)c(sp)q(eed)i(at)e +(whic)o(h)f(HIAR)o(CS)h(iden)o(ti\014ed)g(the)g(correct)i(mo)o(v)o(e)c(...)20 +b(h5)15 b(\(less)262 2249 y(than)e(a)h(min)o(ute\),)e(w)o(as)i(encouraging.) +324 2334 y(HIAR)o(CS)g(did)g(ac)o(hiev)o(e)h(a)f(lev)o(er)h(score)h +Fm(e)n(qual)f Fp(to)f(Deep)i(Though)o(t,)d(1)i(p)q(oin)o(t)f +Fm(ahe)n(ad)h Fp(of)262 2384 y(Hitec)o(h)c(and)h(only)e(1)h(p)q(oin)o(t)g +Fm(less)g Fp(than)h(the)g(highly)e(p)q(ositional)g(Mephisto)h(mac)o(hine)g(!) +17 b(This)262 2434 y(result)d(w)o(as)g(v)o(ery)g(pleasing.)946 +2574 y(145)p eop +%%Page: 146 148 +146 147 bop 262 307 a Fr(7.2)69 b(Computer)22 b(Opp)r(osition)262 +434 y Fp(A)10 b(matc)o(h)f(will)g(b)q(e)i(pla)o(y)o(ed)f(b)q(et)o(w)o(een)i +(HIAR)o(CS)e(5.0)f(and)i(the)g(commercial)c(c)o(hess)12 b(mac)o(hine,)262 +483 y(Mephisto)e(Exclusiv)o(e.)17 b(This)9 b(will)g(allo)o(w)f(a)h(further)i +(rating)e(to)h(b)q(e)g(estimated)g(for)f(HIAR)o(CS)262 533 +y(and)16 b(will)e(pro)o(vide)j(n)o(umerous)e(examples)h(of)f(its)i(actual)f +(pla)o(ying)e(st)o(yle,)j(strengths)h(and)262 583 y(w)o(eaknesses.)324 +668 y(The)i(Mephisto)f(mac)o(hine)f(used)j(w)o(as)e(rated)h(at)f(ELO)h(1733)f +([24)o(].)34 b(This)19 b(mac)o(hine)262 718 y(is)h(sev)o(eral)h(y)o(ears)g +(old)f(and)h(should)f(not)h(b)q(e)g(confused)h(with)e(the)h(latest)g +(commercial)262 768 y(Mephistos)14 b(whic)o(h)g(ha)o(v)o(e)g(signi\014can)o +(tly)e(higher)i(ratings)g(\(ELO)h(2100+\).)324 853 y(I)e(in)o(tend)h(to)f +(pla)o(y)g(a)g(6)g(game)f(matc)o(h)h(b)q(et)o(w)o(een)h(the)h(mac)o(hines)d +(using)h(a)h(time)e(con)o(trol)262 903 y(of)f(60)g(mo)o(v)o(es)f(in)i(30)f +(min)o(utes)f(follo)o(w)o(ed)h(b)o(y)g(20)g(mo)o(v)o(es)g(in)g(ev)o(ery)h +(subsequen)o(t)i(10)d(min)o(utes.)324 988 y(Belo)o(w)k(is)f(an)h(annotated)g +(game)e(from)g(the)j(matc)o(h.)k(It)15 b(is)f(one)h(of)g(the)g(b)q(etter)i +(games)262 1038 y(and)c(illustrates)h(man)o(y)e(attributes)j(of)e(HIAR)o +(CS's)h(pla)o(y)m(.)i(HIAR)o(CS's)e(scores)h(are)g(sho)o(wn)262 +1088 y(p)q(erio)q(dically)d(in)i(brac)o(k)o(ets.)510 1169 y(Game)e(1)510 +1219 y(White)159 b(:)18 b Fl(Mephisto)c(Exclusiv)o(e)510 1269 +y Fp(Blac)o(k)170 b(:)18 b Fl(HIAR)o(CS)e(5.0)510 1319 y Fp(Op)q(ening)118 +b(:)18 b(Kings)c(Gam)o(bit)d(Accepted)781 1418 y(1.)62 b(e4)102 +b(e5)781 1468 y(2.)62 b(f4)107 b(ef)781 1518 y(3.)62 b(Nf3)76 +b(d6)781 1568 y(4.)62 b(Bc4)73 b(Be6)15 b(\(+59\))p 641 1678 +673 5 v 641 2343 5 665 v 646 1761 a Fg(rm0lkans)646 1844 y(opo0Zpop)646 +1927 y(0Z0obZ0Z)646 2010 y(Z0Z0Z0Z0)646 2094 y(0ZBZPo0Z)646 +2177 y(Z0Z0ZNZ0)646 2260 y(POPO0ZPO)646 2343 y(SNAQJ0ZR)p 1310 +2343 V 641 2347 673 5 v 762 2449 a Fp(P)o(osition)e(after)h(4.)k(...)f(Be6) +946 2574 y(146)p eop +%%Page: 147 149 +147 148 bop 262 307 a Fp(HIAR)o(CS)15 b(w)o(as)i(out)f(of)f(its)i(op)q(ening) +f(b)q(o)q(ok)g(after)g(4.)25 b(Bc4.)g(BCO2)17 b(recommends)e(4.)25 +b(...)262 357 y(h6,)16 b(ho)o(w)o(ev)o(er,)i(HIAR)o(CS's)e(c)o(hoice)h(of)f +(4.)26 b(...)g(Be6)17 b(ma)o(y)e(b)q(e)i(b)q(etter.)29 b(Mephisto)17 +b(is)f(also)262 407 y(no)o(w)d(out)h(of)f(its)h(op)q(ening)g(b)q(o)q(ok.)781 +575 y(5.)62 b(Bxe6)51 b(fe)781 625 y(6.)62 b(d4)97 b(Qf6)14 +b(\(+51\))262 743 y(With)d(blac)o(k's)h(pa)o(wn)g(structure)j(in)d(a)g +(heathly)h(state,)g(HIAR)o(CS)f(aims)f(to)h(hang)g(on)g(to)h(its)262 +793 y(adv)n(anced)h(f-pa)o(wn.)k(An)c(alternativ)o(e)g(mo)o(v)o(e)f(w)o(as)h +(6.)k(...)g(g5,)13 b(although)h(this)g(w)o(ould)f(limit)262 +843 y(HIAR)o(CS's)g(castling)g(options.)781 1011 y(7.)62 b(o-o)85 +b(Nc6)781 1061 y(8.)62 b(Nc3)71 b(Nge7)781 1111 y(9.)62 b(Nb5)k(o-o-o)781 +1161 y(10.)41 b(a4)99 b(a6)781 1210 y(11.)41 b(Nc3)71 b(e5!)19 +b(\(+148\))p 641 1337 673 5 v 641 2001 5 665 v 646 1420 a Fg(0Zks0a0s)646 +1503 y(Zpo0m0op)646 1586 y(pZno0l0Z)646 1669 y(Z0Z0o0Z0)646 +1752 y(PZ0OPo0Z)646 1835 y(Z0M0ZNZ0)646 1918 y(0OPZ0ZPO)646 +2001 y(S0AQZRJ0)p 1310 2001 V 641 2005 673 5 v 760 2124 a Fp(P)o(osition)13 +b(after)i(11.)i(...)g(e5!)262 2242 y(The)c(stage)g(is)g(set.)18 +b(With)13 b(the)g(kings)g(castled)g(on)g(opp)q(osite)g(\015anks,)g(blac)o +(k's)f(activit)o(y)g(will)262 2292 y(concen)o(trate)20 b(on)e(the)h(king)f +(side)g(while)g(white)h(will)e(concen)o(trate)j(on)e(the)h(queen)h(side.)262 +2342 y(After)15 b(mo)o(v)o(e)e(9,)h(HIAR)o(CS)g(c)o(hose)h(the)g(plan)f(of)g +(king)g(side)h(attac)o(k)f(with)h(pa)o(wns.)20 b(Ha)o(ving)262 +2392 y(gained)11 b(a)h(temp)q(o)g(b)o(y)g(whites)g(premature)g(Nb5,)g(HIAR)o +(CS)g(sets)i(out)e(to)g(close)h(the)f(cen)o(tre.)262 2442 y(It)f(is)h(imp)q +(ortan)o(t)e(to)h(ha)o(v)o(e)h(a)f(closed)i(cen)o(tral)f(p)q(osition)f +Fm(b)n(efor)n(e)g Fp(starting)g(an)o(y)h(\015ank)f(attac)o(k.)946 +2574 y(147)p eop +%%Page: 148 150 +148 149 bop 781 357 a Fp(12.)41 b(d5)97 b(Nb4)262 460 y(12.)22 +b(...)g(Nb8)16 b(follo)o(w)o(ed)e(b)o(y)h(13.)23 b(...)f(Nd7)15 +b(lo)q(oks)g(a)g(b)q(etter)j(option.)k(Ho)o(w)o(ev)o(er,)16 +b(HIAR)o(CS)262 509 y(considered)e(whites)f(b)q(est)g(plan)f(w)o(as)h(a)f +(queen)i(side)e(pa)o(wn)h(attac)o(k,)f(hence)i(it)e(preferred)j(to)262 +559 y(obstruct)g(this)f(b)o(y)f(pla)o(ying)f(Nb4)i(stopping)g(the)g(early)g +(adv)n(ance)g(of)f(the)i(b)f(pa)o(wn)f(to)h(b4.)781 712 y(13.)41 +b(Bd2)68 b(Qg6?!)18 b(\(+82\))262 814 y(HIAR)o(CS)13 b(w)o(as)h(in)o(tending) +f(to)h(follo)o(w)e(this)i(up)g(with)g(h5,)f(ho)o(w)o(ev)o(er)h(an)g +(immediate)d(g5!)18 b(is)262 864 y(m)o(uc)o(h)12 b(stronger.)781 +1016 y(14.)41 b(Nh4)66 b(Qh6)781 1066 y(15.)41 b(Qg4+)35 b(Kb8)781 +1116 y(16.)41 b(Rac1)50 b(g5)781 1166 y(17.)41 b(Nf3)76 b(Rg8)781 +1216 y(18.)41 b(Nd1)66 b(a5)781 1265 y(19.)41 b(Bxb4)46 b(ab)781 +1315 y(20.)41 b(a5)99 b(Qg6)14 b(\(+179\))p 641 1476 673 5 +v 641 2140 5 665 v 646 1559 a Fg(0j0s0arZ)646 1642 y(Zpo0m0Zp)646 +1725 y(0Z0o0ZqZ)646 1808 y(O0ZPo0o0)646 1891 y(0o0ZPoQZ)646 +1974 y(Z0Z0ZNZ0)646 2057 y(0OPZ0ZPO)646 2140 y(Z0SNZRJ0)p 1310 +2140 V 641 2144 673 5 v 749 2247 a Fp(P)o(osition)f(after)h(20.)k(...)f(Qg6) +262 2350 y(HIAR)o(CS)f(is)i(no)o(w)f(preparing)g(a)g(full)f(scale)i(pa)o(wn)f +(assault)g(on)g(the)h(enem)o(y)f(king.)27 b(The)262 2399 y(precarious)12 +b(p)q(osition)f(of)g(the)h(white)g(queen)h(means)d(blac)o(ks)i(adv)n(ance)g +(is)f(lik)o(ely)g(to)g(pro)q(ceed)262 2449 y(v)o(ery)j(quic)o(kly)m(.)946 +2574 y(148)p eop +%%Page: 149 151 +149 150 bop 781 357 a Fp(21.)41 b(Nd2)262 475 y(Giving)12 b(the)i(white)g +(queen)h(free)g(space)g(for)e(her)i(imp)q(ending)d(retreat.)781 +644 y(21.)41 b(...)105 b(Bg7?!)262 762 y(Unnecessary)m(,)15 +b(an)e(immediate)e(21)j(...)j(h5)c(is)h(v)o(ery)g(strong.)781 +930 y(22.)41 b(c4?)82 b(h5)781 980 y(23.)41 b(Qf3?)55 b(g4)781 +1030 y(24.)41 b(Qe2?!)262 1149 y(White)15 b(seems)g(una)o(w)o(are)h(of)f(the) +h(imp)q(ending)e(danger.)23 b(Blac)o(ks)15 b(adv)n(an)o(tage)g(has)h(quic)o +(kly)262 1198 y(b)q(ecome)d(o)o(v)o(erwhelming.)781 1367 y(24.)41 +b(...)105 b(f3!)18 b(\(+287\))p 641 1493 673 5 v 641 2158 5 +665 v 646 1576 a Fg(0j0s0ZrZ)646 1659 y(Zpo0m0a0)646 1742 y(0Z0o0ZqZ)646 +1825 y(O0ZPo0Zp)646 1908 y(0oPZPZpZ)646 1991 y(Z0Z0ZpZ0)646 +2075 y(0O0MQZPO)646 2158 y(Z0SNZRJ0)p 1310 2158 V 641 2162 +673 5 v 763 2280 a Fp(P)o(osition)13 b(after)h(24.)k(...)f(f3!)262 +2399 y(The)d(f-pa)o(wn)f(is)h(imm)n(une)e(to)h(attac)o(k,)h(if)f(25.)k(gf)d +(gf+)f(wins.)946 2574 y(149)p eop +%%Page: 150 152 +150 151 bop 781 357 a Fp(25.)41 b(Qf2)75 b(Bh6)781 407 y(26.)41 +b(Ne3)71 b(fg)781 457 y(27.)41 b(Kxg2)k(Rdf8)781 506 y(28.)c(Qe2)70 +b(Rf3!)17 b(\(+423\))781 556 y(29.)41 b(Nd1)66 b(Bxd2)781 606 +y(30.)41 b(Qxd2)i(Qxe4)781 656 y(31.)e(Qc2)70 b(Qf4)781 706 +y(32.)41 b(Nf2)76 b(g3)14 b(\(+793\))781 756 y(33.)41 b(Nd3)66 +b(gh+)p 641 878 673 5 v 641 1542 5 665 v 646 961 a Fg(0j0Z0ZrZ)646 +1044 y(Zpo0m0Z0)646 1127 y(0Z0o0Z0Z)646 1210 y(O0ZPo0Zp)646 +1293 y(0oPZ0l0Z)646 1376 y(Z0ZNZrZ0)646 1459 y(0OQZ0ZKo)646 +1542 y(Z0S0ZRZ0)p 1310 1542 V 641 1546 673 5 v 748 1660 a Fp(P)o(osition)13 +b(after)h(33.)j(...)g(gh+)262 1773 y(With)10 b(this)g(mo)o(v)o(e,)g(HIAR)o +(CS)g(announced)h(mate)f(in)g(5)g(mo)o(v)o(es)g(after)h(a)f(2)h(ply)f(searc)o +(h)h(taking)262 1823 y(just)j(1)f(second!)781 1987 y(34.)41 +b(Kh1)65 b(Rxf1+)781 2037 y(35.)41 b(Rxf1)54 b(Qxf1+)781 2086 +y(36.)41 b(Kxh2)i(Qg1+)781 2136 y(37.)e(Kh3)65 b(Qg3+)14 b(mate)899 +2186 y(0)36 b Ff(\000)65 b Fp(1)510 2236 y(Times:)242 b(21:23)45 +b(11:25)324 2350 y(Game)20 b(2)h(w)o(as)g(an)h(in)o(teresting)g(game.)39 +b(HIAR)o(CS)21 b(had)h(some)e(trouble)i(breaking)262 2399 y(through)15 +b(Mephisto's)h(defence.)26 b(HIAR)o(CS)15 b(ac)o(hiev)o(ed)h(success)i(b)o(y) +e('sacri\014cing')f(the)h(ex-)262 2449 y(c)o(hange)c(of)f(ro)q(ok)h(for)f +(knigh)o(t)g(and)h(pa)o(wn)f(on)h(mo)o(v)o(e)e(36.)17 b(Another)c(pa)o(wn)e +(follo)o(w)o(ed)g(shortly)946 2574 y(150)p eop +%%Page: 151 153 +151 152 bop 262 307 a Fp(afterw)o(ards)15 b(and)f(HIAR)o(CS)g(w)o(as)g(left)h +(with)f(2)g(connected)i(passed)g(pa)o(wns)e(on)h(the)g(queen)262 +357 y(side.)324 442 y(The)j(p)q(osition)e(b)q(elo)o(w)h(w)o(as)g(reac)o(hed)i +(after)f(56)e(mo)o(v)o(es)g(of)h(game)f(2.)28 b(HIAR)o(CS)17 +b(no)o(w)262 492 y(pla)o(y)o(ed)d(Qxe6+!)22 b(simplifying)12 +b(in)o(to)i(an)h(ev)o(en)g(more)f(easily)h(w)o(on)g(endgame.)20 +b(HIAR)o(CS's)262 542 y(score)15 b(increased)g(from)d(867)h(to)h(1116)f(p)q +(oin)o(ts)g(after)i(this)f(mo)o(v)o(e.)p 641 635 673 5 v 641 +1300 5 665 v 646 718 a Fg(0Z0Z0Z0Z)646 801 y(Z0Z0Z0op)646 884 +y(0Z0Zrj0Z)646 968 y(O0Z0Z0Z0)646 1051 y(0O0Z0Z0Z)646 1134 +y(Z0Z0O0ZP)646 1217 y(QZ0Z0ZPJ)646 1300 y(Z0Z0Z0Z0)p 1310 1300 +V 641 1304 673 5 v 665 1407 a Fp(P)o(osition)f(after)h(56)f(mo)o(v)o(es)g(of) +g(game)f(2.)324 1510 y(Game)k(3)h(w)o(as)h(a)f(strange)i(game)d(in)h(whic)o +(h)h(b)q(oth)g(programs)e(made)h(tactical)g(blun-)262 1560 +y(ders.)30 b(Ho)o(w)o(ev)o(er,)18 b(HIAR)o(CS)g(consolidated)f(and)h(reco)o +(v)o(ered)h(from)d(its)i(error,)h(where)g(as)262 1610 y(the)14 +b(Mephisto)g(mac)o(hine)f(did)g(not.)324 1695 y(Game)d(4)j(pro)q(duced)g(a)f +(nice)h(solid)f(p)q(erformance)g(from)e(HIAR)o(CS,)i(announcing)g(mate)262 +1745 y(in)h(3)h(after)g(just)g(37)f(mo)o(v)o(es.)324 1830 y(Game)d(5)i +(illustrated)g(reasonably)g(go)q(o)q(d)f(endgame)g(pla)o(y)m(,)g +(particularly)g(the)i(handling)262 1880 y(of)g(the)h(king)f(and)h(pa)o(wn)g +(ending.)324 1965 y(Game)9 b(6)h(pro)o(v)o(ed)g(di\016cult)g(for)g(HIAR)o +(CS.)g(It)g(tried)h(a)f(n)o(um)o(b)q(er)g(of)f('to)q(o)h(clev)o(er')h +(tactical)262 2015 y(mo)o(v)o(es)k(whic)o(h)i(had)g(longer)f(term)h(adv)o +(erse)h(e\013ects.)29 b(The)17 b(blac)o(k)g(pa)o(wn)f(on)h(b2)g(allo)o(w)o +(ed)262 2065 y(blac)o(k)h(to)h(p)q(ose)g(a)g(n)o(um)o(b)q(er)f(of)h +(problems.)32 b(HIAR)o(CS)19 b(managed)e(to)i(see)h(through)f(the)262 +2115 y(complexit)o(y)d(and)i(had)g(prepared)i(a)e(nice)h(tactical)f(w)o(a)o +(y)f(of)h(sa)o(ving)g(its)g(bishop)g(on)g(d7,)262 2165 y(something)c(whic)o +(h)h(caugh)o(t)h(Mephisto)g(b)o(y)f(surprise.)25 b(By)16 b(the)g(endgame)e +(HIAR)o(CS)i(w)o(as)262 2214 y(a)j(pa)o(wn)g(up,)h(ho)o(w)o(ev)o(er,)h(b)q +(ecause)g(of)e(opp)q(osite)h(coloured)g(bishops)f(w)o(as)h(only)f(able)g(to) +262 2264 y(dra)o(w.)i(This)15 b(is)g(an)g(example)e(where)k(sp)q(eci\014c)f +(endgame)e(kno)o(wledge)h(could)g(ha)o(v)o(e)g(made)262 2314 +y(a)e(di\013erence.)324 2399 y(All)h(the)h(game)f(records)i(for)f(this)f +(matc)o(h)g(can)h(b)q(e)h(found)e(in)g(app)q(endix)h(E.)g(The)g(\014nal)262 +2449 y(result)f(table)g(for)f(this)h(matc)o(h)f(can)h(b)q(e)h(seen)g(b)q(elo) +o(w:)946 2574 y(151)p eop +%%Page: 152 154 +152 153 bop 490 267 977 2 v 489 317 2 50 v 514 302 a Fm(Players)p +890 317 V 268 w(1)p 961 317 V 50 w(2)p 1032 317 V 50 w(3)p +1103 317 V 50 w(4)p 1174 317 V 50 w(5)p 1245 317 V 53 w(6)p +1322 317 V 52 w(T)m(otal)p 1465 317 V 490 319 977 2 v 489 369 +2 51 v 514 354 a Fp(HIAR)o(CS)14 b(5.0)p 890 369 V 174 w(1)p +961 369 V 50 w(1)p 1032 369 V 50 w(1)p 1103 369 V 50 w(1)p +1174 369 V 50 w(1)p 1245 369 V 1276 338 a Fk(1)p 1276 345 17 +2 v 1276 368 a(2)p 1322 369 2 51 v 1370 354 a Fp(5)1396 338 +y Fk(1)p 1396 345 17 2 v 1396 368 a(2)p 1465 369 2 51 v 490 +370 977 2 v 489 420 2 51 v 514 406 a Fp(Mephisto)h(Exclusiv)o(e)p +890 420 V 50 w(0)p 961 420 V 50 w(0)p 1032 420 V 50 w(0)p 1103 +420 V 50 w(0)p 1174 420 V 50 w(0)p 1245 420 V 1276 389 a Fk(1)p +1276 396 17 2 v 1276 420 a(2)p 1322 420 2 51 v 1386 389 a(1)p +1386 396 17 2 v 1386 420 a(2)p 1465 420 2 51 v 490 422 977 +2 v 324 521 a Fp(Before)j(I)f(calculate)h(HIAR)o(CS's)f(p)q(erformance)g +(rating,)g(it)g(is)g(imp)q(ortan)o(t)f(to)h(stress)262 571 +y(that)11 b(ratings)g(calculated)g(at)g(one)h(time)e(con)o(trol)h(are)g(not)h +(easily)e(transferred)j(in)o(to)e(ratings)262 621 y(at)17 b(other)i(time)e +(con)o(trols.)31 b(Therefore,)20 b(some)d(risk)h(is)g(asso)q(ciated)h(with)e +(p)q(erforming)g(a)262 671 y(matc)o(h)c(at)i(a)g(faster)g(time)f(con)o(trol)g +(in)h(order)h(to)e(extrap)q(olate)i(a)e(rating)h(for)f(HIAR)o(CS)h(at)262 +720 y(tournamen)o(t)d(times.)324 806 y(HIAR)o(CS)18 b(w)o(on)g(the)h(matc)o +(h)e(b)o(y)i(the)g(score)g(5)1072 789 y Fk(1)p 1072 796 17 +2 v 1072 820 a(2)1112 806 y Fp(-)1149 789 y Fk(1)p 1149 796 +V 1149 820 a(2)1171 806 y Fp(.)32 b(Using)18 b(the)h(win)f(probabilit)o(y)262 +855 y(tables)13 b(suggested)h(b)o(y)e(Arpad)i(Elo)e(and)h(found)f(in)g([32)o +(],)g(an)h(estimated)f(rating)h(di\013erence)262 905 y(b)q(et)o(w)o(een)j +(HIAR)o(CS)e(and)h(Mephisto)g(Exclusiv)o(e)g(can)g(b)q(e)g(lo)q(ok)o(ed)g +(up.)21 b(The)15 b(matc)o(h)e(score)262 955 y(represen)o(ts)f(a)e(win)g +(ratio)g(of)g(92\045.)16 b(This)10 b(con)o(v)o(erts)h(in)o(to)f(a)g(rating)f +(di\013erence)k(of)c(401)h(p)q(oin)o(ts)262 1005 y(b)q(et)o(w)o(een)i(the)h +(pla)o(y)o(ers.)k(Therefore,)c(giv)o(en)e(Mephisto)h(Exclusiv)o(e's)f(rating) +g(of)g(ELO)h(1733,)262 1055 y(HIAR)o(CS's)h(p)q(erformance)h(rating)f(in)h +(the)g(test)h(matc)o(h)e(is)g(ELO)i(2134)e(\(1733+401\).)324 +1140 y(T)m(aking)d(in)o(to)i(accoun)o(t)g(the)h(small)d(sample)h(of)g(the)i +(test)g(matc)o(h)e(and)h(the)h(time)e(con)o(trol)262 1190 y(at)16 +b(whic)o(h)h(it)f(w)o(as)g(conducted,)j(this)d(rating)h(only)e(represen)o(ts) +20 b(a)c(v)o(ery)h(rough)g(estimate.)262 1240 y(Ho)o(w)o(ev)o(er,)e(the)g +(impressiv)o(e)f(score)i(b)o(y)f(whic)o(h)f(HIAR)o(CS)h(w)o(on)f(the)i(matc)o +(h,)d(clearly)i(illus-)262 1289 y(trates)f(its)g(sup)q(eriorit)o(y)h(o)o(v)o +(er)e(the)i(Mephisto)f(mac)o(hine.)262 1460 y Fr(7.3)69 b(Human)23 +b(Opp)r(osition)262 1587 y Fp(T)m(o)9 b(determine)i(ho)o(w)f(HIAR)o(CS)g(p)q +(erforms)g(against)g(h)o(uman)f(opp)q(osition,)g(I)i(pla)o(y)o(ed)f(a)g +(short)262 1636 y(t)o(w)o(o)16 b(game)f(matc)o(h)g(against)h(HIAR)o(CS.)g +(When)h(I)f(last)g(pla)o(y)o(ed)g(activ)o(e)h(c)o(hess)h(\(1981/82\))262 +1686 y(m)o(y)10 b(rating)h(w)o(as)h(1920)f(on)h(the)g(ELO)g(scale.)18 +b(Since)13 b(I)f(ha)o(v)o(e)f(not)h(pla)o(y)o(ed)g(comp)q(etitiv)o(ely)e(for) +262 1736 y(a)15 b(long)f(time,)g(I)h(am)f(lik)o(ely)g(to)h(b)q(e)h(a)f(bit)g +('rust)o(y'.)22 b(Ho)o(w)o(ev)o(er,)16 b(m)o(y)d(in)o(terest)k(in)e(computer) +262 1786 y(c)o(hess)i(has)f(allo)o(w)o(ed)f(me)g(to)g(pla)o(y)g('friendly')g +(games)g(regularly)m(,)g(so)h(I)g(w)o(ould)f(exp)q(ect)i(m)o(y)262 +1836 y(rating)h(to)h(b)q(e)h(in)f(the)h(1900-2000)d(ELO)j(range.)34 +b(The)20 b(particular)f(adv)n(an)o(tage)g(I)g(ha)o(v)o(e)262 +1885 y(against)12 b(computer)h(opp)q(onen)o(ts)h(is)f(a)h(go)q(o)q(d)e +(understanding)i(of)f(their)h(relativ)o(e)f(strengths)262 1935 +y(and)g(w)o(eaknesses.)324 2020 y(The)f(matc)o(h)f(games)h(w)o(ere)h(pla)o(y) +o(ed)e(at)h(a)g(full)f(tournamen)o(t)h(time)f(con)o(trol)h(of)f(40)h(mo)o(v)o +(es)262 2070 y(in)i(2)h(hours,)g(follo)o(w)o(ed)f(b)o(y)h(20)f(mo)o(v)o(es)g +(in)h(eac)o(h)g(subsequen)o(t)i(hour.)22 b(Both)15 b(game)f(records)262 +2120 y(can)g(b)q(e)g(found)g(in)f(app)q(endix)h(E.)g(The)g(\014nal)f(matc)o +(h)g(score)i(can)f(b)q(e)h(seen)g(b)q(elo)o(w:)p 683 2200 589 +2 v 682 2250 2 50 v 708 2235 a Fm(Players)p 986 2250 V 170 +w(1)p 1057 2250 V 50 w(2)p 1128 2250 V 50 w(T)m(otal)p 1271 +2250 V 683 2251 589 2 v 682 2301 2 50 v 708 2286 a Fp(HIAR)o(CS)f(5.0)p +986 2301 V 76 w(1)p 1057 2301 V 50 w(0)p 1128 2301 V 86 w(1)p +1271 2301 V 683 2303 589 2 v 682 2353 2 50 v 708 2338 a(Mark)g(Uniac)o(k)o(e) +p 986 2353 V 50 w(0)p 1057 2353 V 50 w(1)p 1128 2353 V 86 w(1)p +1271 2353 V 683 2354 589 2 v 324 2449 a(The)f(follo)o(wing)d(game)h(is)i(the) +g(\014rst)h(from)d(the)i(matc)o(h.)k(HIAR)o(CS's)12 b(scores)i(are)g(sho)o +(wn)946 2574 y(152)p eop +%%Page: 153 155 +153 154 bop 262 307 a Fp(p)q(erio)q(dically)12 b(in)i(brac)o(k)o(ets.)510 +471 y(Game)e(1)510 521 y(White)159 b(:)18 b Fl(Mark)e(Uniac)o(k)o(e)510 +570 y Fp(Blac)o(k)170 b(:)18 b Fl(HIAR)o(CS)e(5.0)510 620 y +Fp(Op)q(ening)118 b(:)18 b(Queens)e(Gam)o(bit)11 b(Declined)781 +720 y(1.)62 b(d4)97 b(d5)781 770 y(2.)62 b(c4)102 b(e6)781 +819 y(3.)62 b(Nc3)71 b(Nf6)781 869 y(4.)62 b(Bg5)70 b(Be7)781 +919 y(5.)62 b(e3)102 b(o-o)781 969 y(6.)62 b(Nf3)76 b(Nb)q(d7)781 +1019 y(7.)62 b(Bd3)p 641 1141 673 5 v 641 1805 5 665 v 646 +1224 a Fg(rZbl0skZ)646 1307 y(oponapop)646 1390 y(0Z0Zpm0Z)646 +1473 y(Z0ZpZ0A0)646 1556 y(0ZPO0Z0Z)646 1639 y(Z0MBONZ0)646 +1722 y(PO0Z0OPO)646 1805 y(S0ZQJ0ZR)p 1310 1805 V 641 1809 +673 5 v 780 1923 a Fp(P)o(osition)13 b(after)h(7.)k(Bd3.)324 +2037 y(This)d(mo)o(v)o(e)e(to)q(ok)h(HIAR)o(CS)h(out)g(of)f(its)h(op)q(ening) +f(b)q(o)q(ok.)21 b(7.)g(Rc1)14 b(w)o(ould)h(ha)o(v)o(e)f(k)o(ept)262 +2086 y(HIAR)o(CS)f(in)g(b)q(o)q(ok.)781 2250 y(7.)62 b(...)105 +b(dc)15 b(\()p Ff(\000)p Fp(69\))781 2300 y(8.)62 b(Bxc4)51 +b(b6)14 b(\(!\))781 2350 y(9.)62 b(o-o)85 b(Bb7)781 2399 y(10.)41 +b(Rc1)71 b(c5)781 2449 y(11.)41 b(Re1)71 b(Rc8)14 b(\()p Ff(\000)p +Fp(9\))946 2574 y(153)p eop +%%Page: 154 156 +154 155 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Zrl0skZ)646 +482 y(obZnapop)646 565 y(0o0Zpm0Z)646 648 y(Z0o0Z0A0)646 731 +y(0ZBO0Z0Z)646 814 y(Z0M0ONZ0)646 897 y(PO0Z0OPO)646 980 y(Z0SQS0J0)p +1310 980 V 641 984 673 5 v 745 1090 a Fp(P)o(osition)13 b(after)h(11.)k(...)f +(Rc8.)262 1197 y(HIAR)o(CS's)e(last)h(5)f(mo)o(v)o(es)g(ha)o(v)o(e)g(b)q(een) +i(excellen)o(t)g(p)q(ositional)d(mo)o(v)o(es.)23 b(I)16 b(w)o(as)g(deligh)o +(ted)262 1246 y(that)h(it)g(decided)i(to)e(\014anc)o(hetto)i(blac)o(k's)e +(normally)d(bad)k(queens)h(bishop)e(on)g(the)i(long)262 1296 +y(diagonal.)c(HIAR)o(CS)d(seems)h(to)f(b)q(e)i(follo)o(wing)9 +b(the)14 b(correct)g(concepts)g(for)e(the)h(blac)o(k)f(side)262 +1346 y(of)h(a)g(queens)j(gam)o(bit.)781 1396 y(12.)41 b(Bd3)68 +b(cd)781 1446 y(13.)41 b(Nxd4)j(Ne5)781 1496 y(14.)d(Bb1)68 +b(Nfg4)781 1545 y(15.)41 b(Bxe7)51 b(Qxe7)781 1595 y(16.)41 +b(h3)97 b(Nf6)14 b(\(+64\))p 641 1674 V 641 2339 5 665 v 646 +1757 a Fg(0ZrZ0skZ)646 1840 y(obZ0lpop)646 1924 y(0o0Zpm0Z)646 +2007 y(Z0Z0m0Z0)646 2090 y(0Z0M0Z0Z)646 2173 y(Z0M0O0ZP)646 +2256 y(PO0Z0OPZ)646 2339 y(ZBSQS0J0)p 1310 2339 V 641 2343 +673 5 v 748 2449 a Fp(P)o(osition)f(after)h(16.)j(...)g(Nf6.)946 +2574 y(154)p eop +%%Page: 155 157 +155 156 bop 262 345 a Fp(HIAR)o(CS)12 b(has)i(ac)o(hiev)o(ed)f(at)g(least)h +(equalit)o(y)e(from)g(the)h(op)q(ening.)18 b(Ho)o(w)o(ev)o(er,)13 +b(I)g(w)o(as)h(more)262 395 y(afraid)g(of)h(16.)22 b(...)g(Qh4!)h(to)16 +b(whic)o(h)f(I)h(w)o(ould)e(ha)o(v)o(e)i(pla)o(y)o(ed)f(17.)22 +b(Qe2;)16 b(not)g(17)f(hg)g(Nxg4)262 445 y(whic)o(h)e(lo)q(oks)h(v)o(ery)g +(promising)e(e.g.)17 b(18.)h(Nf3)13 b(Qxf2+)h(19.)j(Kh1)d(Qg3!)781 +542 y(17.)41 b(Qe2)70 b(Rfd8)781 592 y(18.)41 b(Red1)48 b(Rc5!?)781 +642 y(19.)41 b(e4)102 b(a6)781 692 y(20.)41 b(f4)107 b(Ng6)781 +741 y(21.)41 b(Qf2)75 b(Qc7)781 791 y(22.)41 b(Nde2)48 b(Rc4!)18 +b(\(+48\))p 641 918 673 5 v 641 1582 5 665 v 646 1001 a Fg(0Z0s0ZkZ)646 +1084 y(Zbl0Zpop)646 1167 y(po0ZpmnZ)646 1250 y(Z0Z0Z0Z0)646 +1333 y(0ZrZPO0Z)646 1416 y(Z0M0Z0ZP)646 1499 y(PO0ZNLPZ)646 +1582 y(ZBSRZ0J0)p 1310 1582 V 641 1586 673 5 v 745 1705 a Fp(P)o(osition)13 +b(after)h(22.)k(...)f(Rc4!)324 1823 y(I)e(w)o(an)o(ted)g(to)h(form)d(a)i +(strong)h(pa)o(wn)f(cen)o(ter,)i(ho)o(w)o(ev)o(er,)e(in)g(hindsigh)o(t)g(I)g +(feel)g(I)h(o)o(v)o(er-)262 1873 y(stretc)o(hed)g(m)o(yself.)g(The)e(pa)o +(wns)g(on)g(e4)g(and)g(f4)f(are)h(under)h(extreme)f(pressure.)781 +2050 y(23.)41 b(Rxd8+)12 b(Qxd8)781 2099 y(24.)41 b(Rd1)66 +b(Qc7)781 2149 y(25.)41 b(Rd4?)946 2574 y(155)p eop +%%Page: 156 158 +156 157 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Z0Z0ZkZ)646 +482 y(Zbl0Zpop)646 565 y(po0ZpmnZ)646 648 y(Z0Z0Z0Z0)646 731 +y(0ZrSPO0Z)646 814 y(Z0M0Z0ZP)646 897 y(PO0ZNLPZ)646 980 y(ZBZ0Z0J0)p +1310 980 V 641 984 673 5 v 765 1163 a Fp(P)o(osition)13 b(after)h(25.)k(Rd4?) +324 1257 y(I)c(though)o(t)h(Rd4)f(w)o(ould)g(reliev)o(e)h(the)g(pressure)i +(on)d(the)i(white)e(cen)o(ter)j(pa)o(wns.)j(After)262 1307 +y(25.)k(...)g(Rxd4)15 b(26.)24 b(Qxd4,)17 b(I)f(though)o(t)g(m)o(y)e(f-pa)o +(wn)h(w)o(as)h(secure)j(b)q(ecause)e(of)f(the)h(mate)262 1357 +y(threat)g(on)g(d8,)g(e.g.)26 b(26.)g(...)g(Nxf4)16 b(27.)27 +b(Nxf4)16 b(Qxf4??)26 b(28.)g(Qd8+)18 b(Ne8)f(29.)26 b(Qxe8+)262 +1407 y(mate.)16 b(Ho)o(w)o(ev)o(er,)e(I)g(missed)f(27.)18 b(...)f(e5)d(whic)o +(h)g(wins)f(the)i(pa)o(wn.)781 1491 y(25.)41 b(...)105 b(Rxd4)781 +1541 y(26.)41 b(Qxd4)i(Nxf4!)781 1591 y(27.)e(Nxf4)54 b(e5)781 +1641 y(28.)41 b(Qd2)65 b(ef)781 1691 y(29.)41 b(a3)99 b(Kf8)14 +b(\(+133\))p 641 1781 V 641 2445 5 665 v 646 1864 a Fg(0Z0Z0j0Z)646 +1947 y(Zbl0Zpop)646 2030 y(po0Z0m0Z)646 2113 y(Z0Z0Z0Z0)646 +2196 y(0Z0ZPo0Z)646 2279 y(O0M0Z0ZP)646 2362 y(0O0L0ZPZ)646 +2445 y(ZBZ0Z0J0)p 1310 2445 V 641 2449 673 5 v 946 2574 a Fp(156)p +eop +%%Page: 157 159 +157 158 bop 747 307 a Fp(P)o(osition)13 b(after)h(29.)k(...)f(Kf8.)324 +422 y(HIAR)o(CS)10 b(is)h(preparing)g(to)f(bring)h(its)g(king)f(in)o(to)g +(pla)o(y)m(.)15 b(I)c(pla)o(y)o(ed)f(29.)17 b(a3)10 b(to)h(allo)o(w)e(Ba2)262 +472 y(at)15 b(an)g(opp)q(ortune)h(momen)o(t.)j(In)d(fact,)f(I)g(w)o(as)g +(hoping)g(to)g(pla)o(y)f(Nd5;)i(sw)o(ap)f(o\013)g(knigh)o(ts)262 +522 y(and)g(obtain)g(a)g(supp)q(orted)i(passed)f(d)g(pa)o(wn.)23 +b(Ho)o(w)o(ev)o(er,)16 b(I)f(missed)g(31.)22 b(Qc5+)17 b(and)e(the)262 +572 y(mate)d(threat)j(on)f(g2)f(sa)o(ving)g(blac)o(ks)h(b)g(and)f(f)h(pa)o +(wns.)k(After)c(whic)o(h)g(the)h(game)d(is)i(lost.)781 736 +y(30.)41 b(Nd5?)46 b(Nxd5)781 786 y(31.)41 b(ed)100 b(Qc5+)781 +836 y(32.)41 b(Kh2?)k(Qxd5)14 b(\(+201\))781 886 y(33.)41 b(Qxd5)i(Bxd5)14 +b(\(+248\))262 1001 y(Blac)o(ks)g(h-pa)o(wn)g(is)g(safe)g(as)h(Bxh7)f(is)g +(met)f(b)o(y)h(g6!)19 b(The)14 b(mo)o(v)o(e)f(33.)18 b(Qxd5)d(w)o(as)f(bad,)f +(but)262 1050 y(I)f(did)g(not)h(feel)g(lik)o(e)f(a)g(long)g(hard)h(queen)g +(and)g(bishop)f(ending)h(whic)o(h)g(w)o(as)f(lost)h(an)o(yw)o(a)o(y)m(.)781 +1144 y(34.)41 b(Bd3)68 b(b5)781 1194 y(35.)41 b(Kg1)67 b(h5)781 +1244 y(36.)41 b(Be2)73 b(g6)781 1294 y(37.)41 b(a4)99 b(ba)781 +1343 y(38.)41 b(Bxa6)48 b(Bc6)781 1393 y(39.)41 b(Kf2)75 b(Ke7)781 +1443 y(40.)41 b(Be2)73 b(Kf6)781 1493 y(41.)41 b(Bc4)73 b(h4)781 +1543 y(42.)41 b(Be2)73 b(Ke5)15 b(\(+292\))p 641 1666 673 5 +v 641 2330 5 665 v 646 1749 a Fg(0Z0Z0Z0Z)646 1832 y(Z0Z0ZpZ0)646 +1915 y(0ZbZ0ZpZ)646 1998 y(Z0Z0j0Z0)646 2081 y(pZ0Z0o0o)646 +2164 y(Z0Z0Z0ZP)646 2247 y(0O0ZBJPZ)646 2330 y(Z0Z0Z0Z0)p 1310 +2330 V 641 2334 673 5 v 744 2449 a Fp(P)o(osition)e(after)h(42.)k(...)f(Ke5.) +946 2574 y(157)p eop +%%Page: 158 160 +158 159 bop 324 307 a Fp(I)14 b(cannot)h(defend)h(the)f(b-pa)o(wn,)f(g-pa)o +(wn)g(and)h(hold)f(bac)o(k)h(the)g(ev)o(en)o(tual)g(f5,)f(g5)g(and)262 +357 y(g4,)19 b(therefore,)i(I)e(decided)i(to)d(simplify)f(and)i(attempt)f(to) +h(pic)o(k)g(o\013)g(blac)o(ks)g(king)f(side)262 407 y(pa)o(wns)c(while)g +(HIAR)o(CS)g(attempts)g(to)g(promote)f(its)i(a-pa)o(wn.)k(Ho)o(w)o(ev)o(er,) +14 b(HIAR)o(CS)g(did)262 457 y(not)f(allo)o(w)g(me)f(an)i(inkling)e(of)i +(coun)o(ter)g(pla)o(y)m(.)781 625 y(43.)41 b(Bf3)78 b(Bxf3)14 +b(\(+315\))781 675 y(44.)41 b(Kxf3)53 b(Kf5)781 725 y(45.)41 +b(Kf2)75 b(Ke4)781 774 y(46.)41 b(Ke2)70 b(f5)14 b(\(+401\))781 +824 y(47.)41 b(Kf2)75 b(Kd3)14 b(\(+670\))781 874 y(48.)41 +b(Kf3)75 b(g5)14 b(\(+973\))876 924 y(resigns)899 974 y(0)47 +b Ff(\000)42 b Fp(1)510 1023 y(Times:)242 b(1:46:33)12 b(1:59:47)262 +1142 y(HIAR)o(CS)19 b(pla)o(y)o(ed)f(this)i(game)e(v)o(ery)h(solidly)m(,)g +(punishing)g(m)o(y)e(mistak)o(es)i(e\016cien)o(tly)m(.)34 b(I)262 +1192 y(think)14 b(it)h(w)o(ould)f(b)q(e)i(hard)f(to)g(tell)g(whether)h(a)f +(computer)g(of)f(h)o(uman)f(w)o(as)i(blac)o(k)g(in)g(this)262 +1241 y(game.)324 1327 y(In)h(game)f(2,)h(I)g(w)o(as)g(also)g(under)h(some)e +(pressure,)k(ho)o(w)o(ev)o(er,)e(I)f(slo)o(wly)f(mano)q(euvred)262 +1377 y(m)o(y)e(2)h(knigh)o(ts)g(in)o(to)g(activ)o(e)h(p)q(ositions)g(on)f +(the)i(queen)f(side.)21 b(I)15 b(w)o(as)g(then)g(able)g(to)f(break)262 +1426 y(the)i(p)q(osition)g(op)q(en)h(to)f(m)o(y)f(adv)n(an)o(tage.)24 +b(I)17 b(ev)o(en)o(tually)f(reac)o(hed)h(the)g(ending,)g(a)f(queen)262 +1476 y(for)g(ro)q(ok)g(and)g(bishop)g(up.)26 b(I)17 b(pla)o(y)o(ed)f(w)o(ell) +f(and)i(w)o(as)f(able)g(to)g(simplify)e(in)o(to)i(an)g(easily)262 +1526 y(w)o(on)d(king)g(and)h(pa)o(wn)f(ending.)324 1611 y(Although)k(HIAR)o +(CS)g(c)o(hose)h(a)f(king)g(side)h(attac)o(k)f(plan)g(during)g(this)h(game,)e +(it)h(did)262 1661 y(not)h(execute)j(it)d(e\016cien)o(tly)m(.)32 +b(By)19 b(the)h(time)d(HIAR)o(CS)h(had)h(ac)o(hiev)o(ed)g(an)g(op)q(en)g +(h-\014le)262 1711 y(for)e(its)h(ro)q(oks,)h(m)o(y)d(o)o(wn)i(plan)f(w)o(as)h +(already)f(w)o(ell)h(dev)o(elop)q(ed.)31 b(This)17 b(illustrates)i(that)262 +1761 y(the)i(planning)e(mec)o(hanism)f(used)k(in)e(HIAR)o(CS)g(still)g +(requires)h(a)g(lot)f(of)g(tuning)g(and)262 1810 y(enhancemen)o(t.)324 +1896 y(I)e(will)e(not)i(use)h(this)f(matc)o(h)f(to)h(calculate)g(a)g(c)o +(hess)i(rating)d(as)h(the)h(sample)e(is)h(to)q(o)262 1946 y(small.)24 +b(Ho)o(w)o(ev)o(er,)17 b(it)g(w)o(as)f(clear)h(from)e(pla)o(ying)h(HIAR)o +(CS,)g(that)g(it)h(has)g(a)f(distinctiv)o(e,)262 1995 y(uncomputer)9 +b(lik)o(e,)h(pla)o(ying)e(st)o(yle)i(and)g(w)o(ould)f(mak)o(e)f(a)i(w)o(orth) +o(y)g(opp)q(onen)o(t)g(for)g(an)o(y)f(pla)o(y)o(er)262 2045 +y(rated)14 b(at)g(around)g(2000)e(ELO.)262 2218 y Fr(7.4)69 +b(Kno)n(wledge)22 b(v)n(ersus)h(Searc)n(h)262 2344 y Fp(HIAR)o(CS)15 +b(5.0)g(con)o(tains)i(a)e(signi\014can)o(t)h(amoun)o(t)e(of)i(c)o(hess)i(kno) +o(wledge)d(compared)h(with)262 2394 y(the)c(t)o(ypical)e(Shannon)h(t)o(yp)q +(e)h(A)g(program.)j(Muc)o(h)d(of)f(the)h(c)o(hess)h(kno)o(wledge)e(is)g +(applied)g(at)262 2444 y(the)g(horizon)f(no)q(des)h(of)f(the)h(main)d(searc)o +(h.)18 b(Although)10 b(this)g(approac)o(h)h(allo)o(ws)e(application)946 +2574 y(158)p eop +%%Page: 159 161 +159 160 bop 262 307 a Fp(of)16 b(up)h(to)g(date)g(p)q(ositional)f(kno)o +(wledge,)h(it)f(is)h(quite)g(time)f(consuming,)f(and)i(therefore)262 +357 y(results)e(in)e(sligh)o(tly)f(shallo)o(w)o(er)i(searc)o(hes)i(b)q(eing)d +(p)q(erformed.)324 442 y(It)j(w)o(ould)g(therefore)i(b)q(e)f(in)o(teresting)g +(to)f(classify)g(what)h(the)g(kno)o(wledge)f(is)h('w)o(orth')262 +492 y(in)f(terms)g(of)g(searc)o(h)h(depth.)27 b(This)17 b('w)o(orth')e(could) +h(then)i(b)q(e)f(compared)f(to)g(its)h(cost)g(to)262 542 y(determine)c +(whether)j(the)e(kno)o(wledge)g(is)f(cost)i(e\013ectiv)o(e.)324 +627 y(I)g(ha)o(v)o(e)g(compared)g(kno)o(wledge)g(and)h(searc)o(h)g(b)o(y)g(p) +q(erforming)e(a)h(4)g(game)f(matc)o(h)g(b)q(e-)262 677 y(t)o(w)o(een)j(HIAR)o +(CS)g(5.0)f(and)g(a)h(v)o(ersion)g(of)f(itself)h(con)o(taining)f(only)g +(piece)i(square)f(tables)262 727 y(for)11 b(its)h(horizon)g(no)q(de)h(ev)n +(aluations)e(and)h(no)g(searc)o(h)h(extension)g(heuristics.)18 +b(This)12 b(sp)q(ecial)262 777 y(v)o(ersion)i(of)f(HIAR)o(CS)g(will)g(b)q(e)h +(referred)i(to)e(as)g Fm(NOKNO)o(W)p Fp(.)324 862 y(In)h(the)h(matc)o(h,)e +(NOKNO)o(W)i(w)o(as)f(allo)o(w)o(ed)f(to)h(p)q(erform)f(a)h(full)f(width)h(6) +g(ply)f(searc)o(h)262 912 y(and)f(HIAR)o(CS)h(5.0)f(w)o(as)h(restricted)i(to) +d(a)h(\014xed)g(depth)h(3)f(ply)f(searc)o(h.)19 b(NOKNO)o(W)c(to)q(ok)262 +961 y(b)q(et)o(w)o(een)20 b(30)f(seconds)i(and)e(20)g(min)o(utes)f(o)o(v)o +(er)i(eac)o(h)g(mo)o(v)o(e,)e(whereas)j(HIAR)o(CS)e(to)q(ok)262 +1011 y(around)e(1)g(to)g(10)f(seconds)j(p)q(er)f(mo)o(v)o(e.)27 +b(Thinking)16 b(on)h(opp)q(onen)o(ts)h(time)e(w)o(as)h(disabled)262 +1061 y(during)12 b(the)i(matc)o(h.)i(In)d(the)g(\014rst)h(t)o(w)o(o)e(games)g +(b)q(oth)h(program)e(w)o(ere)j(allo)o(w)o(ed)e(to)g(consult)262 +1111 y(their)k(op)q(ening)f(b)q(o)q(ok;)i(in)e(last)h(t)o(w)o(o)f(games,)g +(NOKNO)o(W)h(w)o(as)g(not)g(allo)o(w)o(ed)f(to)g(consult)262 +1161 y(its)e(op)q(ening)g(b)q(o)q(ok.)18 b(All)12 b(game)g(records)j(for)e +(this)g(matc)o(h)f(can)i(b)q(e)g(found)f(in)g(app)q(endix)g(E.)262 +1210 y(The)h(\014nal)f(matc)o(h)g(score)i(can)f(b)q(e)h(seen)g(b)q(elo)o(w:)p +565 1286 826 2 v 564 1336 2 50 v 590 1321 a Fm(Players)p 957 +1336 V 261 w(1)p 1033 1336 V 53 w(2)p 1104 1336 V 50 w(3)p +1175 1336 V 50 w(4)p 1246 1336 V 50 w(T)m(otal)p 1389 1336 +V 565 1338 826 2 v 564 1388 2 51 v 590 1373 a Fp(HIAR)o(CS)e(5.0,)g(3)g(ply)p +957 1388 V 988 1357 a Fk(1)p 988 1364 17 2 v 988 1387 a(2)p +1033 1388 2 51 v 1059 1373 a Fp(0)p 1104 1388 V 50 w(0)p 1175 +1388 V 50 w(1)p 1246 1388 V 73 w(1)1321 1357 y Fk(1)p 1321 +1364 17 2 v 1321 1387 a(2)p 1389 1388 2 51 v 565 1389 826 2 +v 564 1439 2 51 v 590 1425 a Fp(NOKNO)o(W,)h(6)f(ply)p 957 +1439 V 988 1408 a Fk(1)p 988 1415 17 2 v 988 1439 a(2)p 1033 +1439 2 51 v 1059 1425 a Fp(1)p 1104 1439 V 50 w(1)p 1175 1439 +V 50 w(0)p 1246 1439 V 73 w(2)1321 1408 y Fk(1)p 1321 1415 +17 2 v 1321 1439 a(2)p 1389 1439 2 51 v 565 1441 826 2 v 324 +1544 a Fp(When)20 b(considering)h(these)g(results,)i(a)c(n)o(um)o(b)q(er)h +(of)g(factors)g(m)o(ust)f(b)q(e)i(tak)o(en)f(in)o(to)262 1594 +y(accoun)o(t:)324 1707 y Ff(\017)g Fp(NOKNO)o(W)d(is)e(not)h(a)f(tuned)h +(brute)h(force)f(searc)o(her,)i(hence)f(its)e(sp)q(eed)j(could)d(b)q(e)365 +1757 y(signi\014can)o(tly)e(impro)o(v)o(ed.)324 1837 y Ff(\017)20 +b Fp(NOKNO)o(W)13 b(did)g(mak)o(e)e(use)i(of)f(HIAR)o(CS's)g(extensiv)o(e)i +(mo)o(v)o(e)d(ordering)h(algorithm)365 1887 y(and)j(incremen)o(tal)e(ev)n +(aluation)g(table.)20 b(This,)13 b(to)i(some)e(exten)o(t,)i(comp)q(ensated)g +(for)365 1937 y(its)f(lac)o(k)g(of)f(tuning.)324 2017 y Ff(\017)20 +b Fp(HIAR)o(CS)f(w)o(as)g(unable)g(to)f(use)i(its)f(sup)q(erior)h(time)d(con) +o(trol)i(algorithm)d(for)j(the)365 2067 y(matc)o(h)c(since)i(it)f(w)o(as)g +(limited)e(to)i(a)g(\014xed)g(depth)h(searc)o(h.)26 b(Hence,)18 +b(HIAR)o(CS)e(5.0)365 2116 y(w)o(as)g(unable)f(to)h(exp)q(end)g(extra)g(time) +e(and)i(depth)g(searc)o(hing)g(mo)o(v)o(es)e(it)h(felt)h(w)o(ere)365 +2166 y(critical.)262 2279 y(The)10 b(matc)o(h)f(score)j(seems)f(to)f +(indicate)g(that)h(HIAR)o(CS's)e(p)q(ositional)g(and)i(tactical)f(kno)o(wl-) +262 2329 y(edge)h(is)g(almost)e(w)o(orth)j(3)e(extra)i(plies)f(of)f(searc)o +(h.)19 b(Eac)o(h)11 b(additional)e(ply)i(w)o(ould)f(normally)262 +2379 y(require)k(a)g(6)f(fold)g(increase)i(in)f(time)840 2364 +y Fk(2)857 2379 y Fp(,)g(therefore,)h(this)e(result)i(is)f(v)o(ery)g +(signi\014can)o(t.)p 262 2411 573 2 v 308 2437 a Fj(2)325 2449 +y Fi(o)q(dd)d(ply's)f(usually)g(require)g(more)g(searc)o(h)g(e\013ort)g(than) +g(ev)o(en)h(ply's)946 2574 y Fp(159)p eop +%%Page: 160 162 +160 161 bop 324 307 a Fp(The)15 b(c)o(hess)i(kno)o(wledge)e(con)o(tained)h +(in)e(HIAR)o(CS)h(5.0)g(seems)g(to)g(cost)h(around)f(a)g(2-3)262 +357 y(fold)10 b(increase)j(in)e(time.)16 b(This)11 b(additional)f(time)g(w)o +(ould)h(not)g(b)q(e)h(enough)g(for)f(ev)o(en)h(1)f(extra)262 +407 y(ply)16 b(of)g(full)g(width)h(searc)o(h.)29 b(Therefore,)18 +b(HIAR)o(CS's)f(kno)o(wledge)g(app)q(ears)h(to)f(b)q(e)g(v)o(ery)262 +457 y(cost)d(e\013ectiv)o(e)h(when)g(compared)e(with)h(simply)d(in)o(v)o +(esting)j(more)f(searc)o(h)i(e\013ort.)262 628 y Fr(7.5)69 +b(In)n(ternal)23 b(Statistics)262 755 y Fp(V)m(arious)12 b(statistics)i(ab)q +(out)e(ho)o(w)h(the)h(program)d(sp)q(ends)j(its)f(time)f(ha)o(v)o(e)h(b)q +(een)h(calculated.)324 840 y(HIAR)o(CS)h(5.0)f(searc)o(hes)j(b)q(et)o(w)o +(een)f(300)f(and)g(1200)f(no)q(des)i(p)q(er)g(second.)23 b(The)16 +b(higher)262 890 y(sp)q(eeds)j(are)f(ac)o(hiev)o(ed)f(in)g(the)h(endgame.)28 +b(Unlik)o(e)17 b(most)f(other)i(programs,)f(only)g(legal)262 +940 y(no)q(des)d(are)h(coun)o(ted)f(in)g(this)g(no)q(de)g(coun)o(t.)324 +1025 y(When)19 b(pla)o(ying)e(at)h(tournamen)o(t)g(rates,)i(HIAR)o(CS)f(t)o +(ypically)e(searc)o(hes)j(to)f(5)f(or)h(6)262 1075 y(plies)12 +b(in)h(the)g(op)q(ening,)g(5)f(plies)h(in)g(the)g(middle)e(game)h(and)g(an)o +(ything)g(b)q(et)o(w)o(een)j(6)d(and)h(13)262 1125 y(plies)g(in)h(the)g +(endgame.)p 641 1218 673 5 v 641 1882 5 665 v 646 1301 a Fg(rZbl0skZ)646 +1384 y(opopZpop)646 1467 y(0ZnZ0m0Z)646 1550 y(Z0a0o0Z0)646 +1633 y(0ZBZPZ0Z)646 1716 y(Z0M0ZNZ0)646 1799 y(POPO0OPO)646 +1882 y(S0AQZRJ0)p 1310 1882 V 641 1886 673 5 v 673 2001 a Fp(ABF)h +(calculation:)i(White)c(to)h(mo)o(v)o(e.)324 2115 y(The)h(Av)o(erage)h(Branc) +o(hing)f(F)m(actor)f Fl(\(ABF\))h Fp(is)f(an)h(extremely)g(imp)q(ortan)o(t)e +(measure)262 2165 y(as)c(it)h(de\014nes)h(ho)o(w)e(e\016cien)o(t)h(the)h +(tree)g(searc)o(h)g(is)e(and)h(hence)h(what)f(depths)g(are)h(ac)o(hiev)n +(able.)262 2214 y(It)17 b(can)g(b)q(e)h(estimated)f(b)o(y)g(coun)o(ting)g +(the)h(total)f(no)q(des,)h Fm(tn)p Fp(,)g(explored)g(in)f(a)g(full)f(width) +262 2264 y(searc)o(h)f(at)e(depths)i Ff(\024)p Fm(n)p Fp(,)f(and)g(using)g +(ABF)g(=)g Fh(tn)1030 2249 y Fk(1)p Fe(=n)1086 2264 y Fp(.)324 +2350 y(In)d(the)g(test)h(p)q(osition)e(ab)q(o)o(v)o(e,)h(HIAR)o(CS)f(5.0)g +(explored)h(168992)e(no)q(des)j(within)e(a)h(6)f(ply)262 2399 +y(full)g(width)h(searc)o(h.)18 b(This)12 b(equates)g(to)g(an)f(ABF)h(of)f +(7.43.)16 b(F)m(or)11 b(a)h(selectiv)o(e)g(searc)o(h)h(to)e(visit)262 +2449 y(few)o(er)f(no)q(des,)i(it)e(w)o(ould)f(ha)o(v)o(e)i(to)f(expand)g +(less)h(than)g(7.43)e(no)q(des)i(from)e(eac)o(h)i(p)q(osition.)16 +b(Of)946 2574 y(160)p eop +%%Page: 161 163 +161 162 bop 262 307 a Fp(course,)12 b(suc)o(h)f(a)f(selectiv)o(e)i(searc)o(h) +g(could)e(still)g(miss)g(man)o(y)e(critical)j(v)n(ariations)e(within)h(the) +262 357 y(6)k(plies;)i(a)f(problem)f(HIAR)o(CS's)g(full)g(width)h(searc)o(h)i +(cannot)e(su\013er)i(from.)j(This)15 b(is)g(the)262 407 y(ma)r(jor)e(adv)n +(an)o(tage)g(of)h(a)h(bac)o(kw)o(ard)f(pruning)h(algorithm)d(suc)o(h)j(as)g +Fh(\013\014)i Fp(when)e(compared)262 457 y(with)e(forw)o(ard)h(pruning.)324 +542 y(This)20 b(ABF)g(includes)h(the)f(totals)g(for)g(eac)o(h)g(iteration.)36 +b(The)20 b(ABF)h(for)f(the)g(\014nal)262 592 y(iteration,)c(whic)o(h)h +Fm(only)g Fp(explored)g(125102)f(no)q(des,)h(is)g(7.07.)26 +b(The)17 b(minim)o(al)c Fh(\013\014)19 b Fp(searc)o(h)262 641 +y(tree)14 b(for)e(the)i(p)q(osition)e(w)o(ould)g(b)q(e)i(of)e(the)i(order)f +(2)7 b Ff(\001)g Fp(38)1123 626 y Fk(6)p Fe(=)p Fk(2)1182 641 +y Ff(\000)h Fp(1)j(=)h(109743.)k(The)e(fact)f(that)262 691 +y(HIAR)o(CS's)f(\014nal)h(iteration)g(searc)o(h)i(w)o(as)e(within)f(14\045)h +(of)g(this)g(minim)o(al)d(tree)k(illustrates)262 741 y(the)h(e\013ectiv)o +(eness)j(of)c(using)h(the)h(com)o(bination)d(of)h(iterativ)o(e)h(deep)q +(ening,)h(searc)o(h)g(tables)262 791 y(and)d(in)o(terior)h(no)q(de)g(mo)o(v)o +(e)e(ordering.)324 876 y(Occasionally)m(,)e(searc)o(hes)j(ha)o(v)o(e)e(b)q +(een)i(found)e(to)g(explore)h(as)f(few)g(or)h(few)o(er)g(no)q(des)g(than)262 +926 y(the)i(minim)o(al)d Fh(\013\014)16 b Fp(tree)f(w)o(ould)e(suggest.)19 +b(This)14 b(is)g(ac)o(hiev)o(ed)g(b)q(ecause)i(the)f(transp)q(osition)262 +976 y(table)k(allo)o(ws)e(n)o(umerous,)j(sometimes)d(large,)j(subtrees)h(to)e +(b)q(e)g(pruned)h(whic)o(h)f(w)o(ould)262 1026 y(otherwise)14 +b(require)h(searc)o(hing.)324 1111 y(It)f(has)h(also)f(b)q(een)i(found)e +(that)g(it)g(is)h(not)f(uncommon)e(for)i(HIAR)o(CS)g(5.0)g(to)g(explore)262 +1161 y(v)n(ariations)h(to)h(a)g(depth)h(of)f(15)g(to)g(20)g(ply)m(.)25 +b(V)m(ery)17 b(o)q(ccasionally)m(,)e(the)i(searc)o(h)g(ma)o(y)e(ev)o(en)262 +1210 y(reac)o(h)h(the)f(maxim)o(um)c(depth)16 b(of)e(32)h(ply)m(.)21 +b(These)c(extremely)e(deep)h(searc)o(hes)h(are)f(infre-)262 +1260 y(quen)o(t)g(and)g(therefore)i(do)e(not)g(usually)f(cause)i(a)f(large)g +(searc)o(h)h('explosion'.)24 b(Ho)o(w)o(ev)o(er,)262 1310 y(they)19 +b(o)q(ccasionally)e(allo)o(w)g(HIAR)o(CS)h(to)h(disco)o(v)o(er)g(deep)g(com)o +(binations)e(whic)o(h)h(w)o(ould)262 1360 y(otherwise)c(b)q(e)h(imp)q +(ossible)d(with)i(a)f(more)g(depth)i(restricted)h(searc)o(h.)324 +1445 y(Belo)o(w)e(is)f(giv)o(en)h(a)f(breakdo)o(wn)h(of)g(ho)o(w)f(HIAR)o(CS) +h(sp)q(ends)h(its)f(time:)p 556 1528 843 2 v 555 1578 2 50 +v 581 1563 a Fm(A)n(ctivity)p 1076 1578 V 380 w(\045)g(of)h(total)g(time)p +1398 1578 V 556 1579 843 2 v 555 1629 2 50 v 581 1614 a Fp(P)o(ositional)d +(Analysis)p 1076 1629 V 250 w(44.4)g(\045)p 1398 1629 V 556 +1631 843 2 v 555 1680 2 50 v 581 1666 a(Making/Unmaking)e(Mo)o(v)o(es)p +1076 1680 V 126 w(19.4)i(\045)p 1398 1680 V 556 1682 843 2 +v 555 1732 2 50 v 581 1717 a(Up)q(dating)i(A)o(ttac)o(k)g(T)m(ables)p +1076 1732 V 158 w(14.9)e(\045)p 1398 1732 V 556 1734 843 2 +v 555 1783 2 50 v 581 1768 a(Mo)o(v)o(e)i(Generation)p 1076 +1783 V 294 w(9.3)f(\045)p 1398 1783 V 556 1785 843 2 v 555 +1835 2 50 v 581 1820 a(T)m(ree)i(Searc)o(h)f(Con)o(trol)p 1076 +1835 V 242 w(6.5)f(\045)p 1398 1835 V 556 1837 843 2 v 555 +1886 2 50 v 581 1871 a(Ev)o(erything)h(else)p 1076 1886 V 328 +w(5.5)f(\045)p 1398 1886 V 556 1888 843 2 v 262 1990 a(As)k(can)g(b)q(e)h +(seen)g(from)e(these)i(\014gures,)g(HIAR)o(CS)f(sp)q(ends)i(an)d +(extraordinary)h(amoun)o(t)262 2039 y(of)c(time)g(ev)n(aluating)g(p)q +(ositions.)20 b(Compared)13 b(to)h(more)g(con)o(v)o(en)o(tional)f(programs,)g +(whic)o(h)262 2089 y(sp)q(end)h(most)e(of)g(their)i(time)d(generating)j(and)e +(searc)o(hing)i(mo)o(v)o(es,)d(the)j(di\013erence)h(in)e(pro-)262 +2139 y(gram)f(philosoph)o(y)h(is)g(ob)o(vious.)946 2574 y(161)p +eop +%%Page: 162 164 +162 163 bop 262 307 a Fr(7.6)69 b(Summary)23 b(of)g(P)n(erformance)262 +434 y Fp(HIAR)o(CS)17 b(5.0)f(p)q(erforms)h(at)g(or)h(near)g(the)g(exp)q(ert) +h(lev)o(el)e(of)g(2000)f(ELO.)h(It)h(displa)o(ys)f(a)262 483 +y(go)q(o)q(d)10 b(balance)h(b)q(et)o(w)o(een)h(p)q(ositional)e(and)g +(tactical)h(pla)o(y)f(whic)o(h)h(mak)o(es)e(it)i(an)g(in)o(teresting,)262 +533 y(more)f(h)o(uman)h(lik)o(e,)g(opp)q(onen)o(t.)17 b(Ho)o(w)o(ev)o(er,)12 +b(HIAR)o(CS)g(5.0)f(has)h(a)f(n)o(um)o(b)q(er)g(of)h(w)o(eaknesses)262 +583 y(b)q(oth)i(p)q(ositionally)e(and)i(tactically)m(.)j(Some)c(of)g(these)j +(w)o(eaknesses)g(can)e(b)q(e)h(corrected)h(b)o(y)262 633 y(extensiv)o(e)c +(tuning)e(of)h(the)g(ev)n(aluation)f(function)h(and)f(searc)o(h)j +(extensions,)f(others)g(require)262 683 y(complex)g(higher)i(lev)o(el)g(kno)o +(wledge)f(to)h(b)q(e)g(included)h(in)e(the)h(program.)324 768 +y(HIAR)o(CS)h(pla)o(ys)g(a)g(comp)q(eten)o(t)h(tactical)f(game)g(and)g +(excels)i(in)e(iden)o(tifying)f(critical)262 818 y(v)n(ariations)e(in)o(v)o +(olving)f(c)o(hec)o(ks)j(and)g(captures.)19 b(This)13 b(is)g(not)h +(surprising)f(considering)h(the)262 867 y(t)o(yp)q(e)g(of)f(searc)o(h)i +(extensions)g(included.)324 953 y(Unlik)o(e)10 b(most)g(other)h(c)o(hess)i +(programs,)d(HIAR)o(CS's)g(impro)o(v)o(emen)o(t)e(as)j(time)f(increases)262 +1003 y(is)j(more)g(pronounced)h(than)g(w)o(ould)e(normally)f(b)q(e)j(exp)q +(ected.)20 b(I)14 b(b)q(eliev)o(e)g(this)f(is)h(b)q(ecause)262 +1052 y(its)f(searc)o(h)i(extensions)g(ha)o(v)o(e)e(more)g(scop)q(e)i(to)f +(expand)g(lines)f(and)h(its)f(p)q(ositional)g(kno)o(wl-)262 +1102 y(edge)e(has)g(more)g(e\013ect)h(as)f(the)h(searc)o(h)g(depth)g +(increases.)19 b(F)m(or)10 b(example,)g(a)h(1)g(ply)f(increase)262 +1152 y(in)g(full)g(width)h(depth)h(ma)o(y)d(allo)o(w)h(HIAR)o(CS)h(to)g +(extend)h(a)f(critical)g(v)n(ariation)e(2)i(or)g(3)g(plies.)324 +1237 y(The)i(use)g(of)f(general)h(plans)f(to)h(guide)f(the)i(searc)o(h)f(b)o +(y)g(increasing)f(the)i(desirabilit)o(y)d(of)262 1287 y(certain)j(asp)q(ects) +h(of)d(a)h(p)q(osition)g(has)h(on)f(the)h(whole)f(impro)o(v)o(ed)f(p)q +(erformance)h(and)g(giv)o(en)262 1337 y(some)i(direction)i(to)f(the)i(pla)o +(y)m(.)24 b(Ho)o(w)o(ev)o(er,)17 b(there)h(is)f(m)o(uc)o(h)e(ro)q(om)g(for)h +(impro)o(v)o(emen)o(t)e(in)262 1387 y(this)f(area.)324 1472 +y(I)i(ha)o(v)o(e)g(found)h(that)f(the)h(time)e(con)o(trol)h(algorithm)e(has)j +(pla)o(y)o(ed)f(an)g(imp)q(ortan)o(t)f(role)262 1522 y(in)f(helping)h(HIAR)o +(CS)g(iden)o(tify)f(di\016cult)g(mo)o(v)o(es)g(and)h(allo)o(w)o(ed)f(extra)i +(time)e(to)h(b)q(e)h(sp)q(en)o(t)262 1572 y(where)20 b(it)e(is)h(most)f +(needed.)35 b(On)20 b(sev)o(eral)f(o)q(ccasions)h(this)f(has)g(allo)o(w)o(ed) +f(HIAR)o(CS)h(to)262 1621 y(impro)o(v)o(e)12 b(its)h(mo)o(v)o(e)g(selection.) +324 1707 y(The)f(com)o(bination)c(of)j(the)h(transp)q(osition)f(table)g(and)g +(searc)o(h)i(extensions)f(has)f(caused)262 1756 y(serious)h(problems.)k +(Occasionally)m(,)11 b(the)h(transp)q(osition)f(table)h(causes)h(early)e +(termination)262 1806 y(of)g(in)o(teresting)i(v)n(ariations.)j(The)d(reason)g +(for)f(this)g(lies)h(in)e(the)i(fact)g(that)f(at)g(eac)o(h)h(lev)o(el)f(in) +262 1856 y(the)i(tree,)g(eac)o(h)h(no)q(de)f(has)g(no)f(w)o(a)o(y)g(of)g(kno) +o(wing)g(whether)i(v)n(ariations)d(will)h(b)q(e)h(extended)262 +1906 y(at)i(no)q(des)h(in)f(their)g(subtree.)27 b(Hence,)18 +b(when)f(the)g(transp)q(osition)f(table)h(is)f(prob)q(ed,)h(the)262 +1956 y(required)j(searc)o(h)g(depth)h(ma)o(y)c(b)q(e)j(incorrect)h(b)q +(ecause)g(it)e(do)q(es)h(not)g(tak)o(e)f(accoun)o(t)h(of)262 +2005 y(p)q(ossible)15 b(extensions)h(n)f(ply)f(do)o(wn)h(the)h(subtree.)23 +b(Therefore,)16 b(the)g(transp)q(osition)f(table)262 2055 y(ma)o(y)f(retriev) +o(e)j(an)f(en)o(try)h(whic)o(h)f(satis\014es)h(the)g(depth)g(requiremen)o(t)f +(at)g(this)h(no)q(de,)f(but)262 2105 y(w)o(ould)10 b(not)h(satisfy)g(the)h +('true')f(depth)h(requiremen)o(t)f(if)g(searc)o(h)h(extensions)g(w)o(ere)g +(to)g(o)q(ccur)262 2155 y(in)h(the)h(subtree.)324 2240 y(In)d(tactical)h(p)q +(ositions,)f(this)h(often)f(causes)i(HIAR)o(CS)f(to)f(require)i(1)e(or)h(2)f +(more)f(searc)o(h)262 2290 y(iterations)20 b(than)h(w)o(ould)e(normally)f(b)q +(e)k(exp)q(ected.)40 b(This)20 b(is)h(most)e(noticeable)i(when)262 +2340 y(HIAR)o(CS's)13 b(searc)o(h)i(fails)e(high,)g(indicating)g(it)h(has)g +(found)f(a)h(clearly)g(b)q(etter)h(mo)o(v)o(e,)d(only)262 2390 +y(for)h(the)i(re-searc)o(h)g(to)f(terminate)f(early)h(b)q(ecause)h(of)f(a)f +(premature)h(en)o(try)h(matc)o(h.)946 2574 y(162)p eop +%%Page: 163 165 +163 164 bop 324 307 a Fp(The)14 b(solution)f(to)h(this)g(problem)f(lies)h(in) +f(dramatically)e(expanding)j(eac)o(h)g(transp)q(osi-)262 357 +y(tion)f(table)g(en)o(try)h(to)g(store)h(information)10 b(ab)q(out)k +(extensions)h(in)e(the)h(subtree)i(b)q(elo)o(w)d(the)262 407 +y(no)q(de)d(resp)q(onsible)i(for)e(storing)g(the)h(en)o(try)m(.)17 +b(On)10 b(retriev)n(al,)h(this)f(information)d(can)k(then)g(b)q(e)262 +457 y(used)j(to)g(determine)f(more)g(accurately)h(whether)h(an)e(en)o(try)i +(should)e(cause)i(termination.)324 542 y(The)d(cost)g(e\013ectiv)o(eness)i +(of)d(eac)o(h)h(ev)n(aluation)e(de\014nition)i(is)f(y)o(et)h(to)f(b)q(e)h +(determined.)18 b(I)262 592 y(susp)q(ect,)13 b(most)c(criteria)i(will)f(need) +i(mo)q(di\014cation)c(of)i(some)g(sort,)i(while)e(others)i(ma)o(y)d(ev)o(en) +262 641 y(b)q(e)16 b(unrequired.)25 b(Certainly)15 b(new)i(criteria)f(are)g +(required)h(for)e(signi\014can)o(t)h(p)q(erformance)262 691 +y(impro)o(v)o(em)o(en)o(t.)946 2574 y(163)p eop +%%Page: 164 166 +164 165 bop 262 654 a Fn(Chapter)34 b(8)262 897 y Fo(Conclusion)262 +1148 y Fp(This)19 b(c)o(hapter)i(concludes)f(the)h(rep)q(ort)f(b)o(y)g +(reviewing)f(what)h(has)g(b)q(een)g(in)o(v)o(estigated,)262 +1198 y(discussing)14 b(the)h(ma)r(jor)d(ac)o(hiev)o(emen)o(ts)i(and)f +(exploring)h(the)g(future)h(implications)c(of)i(m)o(y)262 1248 +y(\014ndings.)36 b(Before)21 b(I)f(review)g(the)h(pro)r(ject)g(and)f(examine) +f(its)h(ac)o(hiev)o(emen)o(ts,)h(let)f(me)262 1298 y(re-iterate)15 +b(the)f(pro)r(ject)h(aims:)312 1374 y(1.)20 b(Ov)o(erview)15 +b(the)f(tec)o(hniques)h(used)g(in)f(curren)o(t)h(c)o(hess)g(programs.)312 +1454 y(2.)20 b(Dev)o(elop)13 b(an)g(ev)n(aluation)f(function)h(whic)o(h)g +(exhibits)g(the)h(p)q(ositional)e(abilit)o(y)f(of)i(an)365 +1504 y(exp)q(ert)j(lev)o(el)d(c)o(hess)j(pla)o(y)o(er)d(\(2000)g(ELO\).)312 +1584 y(3.)20 b(Explore)14 b(fresh)h(w)o(a)o(ys)f(of)f(impro)o(ving)e(the)j +(tactical)g(abilit)o(y)e(of)h(a)h(c)o(hess)h(program.)312 1664 +y(4.)20 b(Implemen)o(t)12 b(the)i(\014ndings)g(in)g(a)f(c)o(hess)j(program)c +(\(HIAR)o(CS)h(5.0\).)312 1744 y(5.)20 b(Apply)15 b(the)h(Bratk)o(o-Kop)q(ec) +g(exp)q(erimen)o(t)f(to)g(test)h(the)g(relativ)o(e)f(tactical)g(and)g(p)q(o-) +365 1794 y(sitional)e(abilit)o(y)f(of)h(the)i(program.)312 +1874 y(6.)20 b(Ev)n(aluate)14 b(the)g(program)e(against)i(b)q(oth)g(h)o(uman) +e(and)i(computer)f(opp)q(osition.)262 2010 y Fr(8.1)69 b(Review)262 +2100 y Fp(Before)14 b(the)g(pro)r(ject)h(b)q(egan,)f(the)g(aims)e(of)h(the)h +(pro)r(ject)h(w)o(ere)g(set)f(out)g(and)f(an)h(o)o(v)o(erview)262 +2150 y(of)d(the)i(required)g(tasks)f(necessary)j(to)d(meet)f(the)i(o)o(v)o +(erall)e(aims)f(w)o(as)i(devised.)19 b(An)12 b(o)o(v)o(erall)262 +2200 y(time)18 b(scale)i(plan)f(w)o(as)g(pro)q(duced)i(whic)o(h)e(set)i(time) +d(scales)i(for)f(eac)o(h)i(ma)r(jor)c(activit)o(y)m(.)262 2250 +y(Regularly)m(,)12 b(during)i(the)h(pro)r(ject,)h(progress)f(w)o(as)g +(measured)f(and)g(review)o(ed)i(against)e(set)262 2300 y(ob)r(jectiv)o(es)h +(and)g(time)f(scales.)23 b(This)15 b(allo)o(w)o(ed)e(me)h(to)h(iden)o(tify)g +(and)f(set)i(sub-goals,)f(and)262 2350 y(k)o(ept)g(me)f(a)o(w)o(are)h(of)g +(the)g(implications)e(an)o(y)h(problems)h(w)o(ould)f(ha)o(v)o(e)h(on)g(the)g +(rest)i(of)d(m)o(y)262 2399 y(pro)r(ject.)38 b(This)21 b(in)f(turn)g(enabled) +h(me)f(to)g(rep)q(ort)h(progress)h(at)e(m)o(y)f(regular)i(pro)r(ject)262 +2449 y(meetings)13 b(and)g(allo)o(w)o(ed)g(the)i(pro)r(ject)f(to)g(dev)o +(elop)g(smo)q(othly)m(.)946 2574 y(164)p eop +%%Page: 165 167 +165 166 bop 324 307 a Fp(In)13 b(c)o(hapters)h(1)f(and)g(2)f(I)h(in)o(tro)q +(duced)h(the)g(sub)r(ject)g(of)f(computer)f(c)o(hess.)19 b(This)13 +b(ga)o(v)o(e)g(a)262 357 y(go)q(o)q(d)g(foundation)g(for)g(the)i(more)e +(complex)f(issues)j(explored)g(in)e(future)h(c)o(hapters.)324 +442 y(Chapter)j(3)g(explored)g(v)n(arious)f(tec)o(hniques)i(in)e(detail.)27 +b(I)16 b(in)o(tro)q(duced)i(the)f Fh(\013\014)i Fp(tree)262 +492 y(pruning)d(algorithm)e(and)i(a)h(n)o(um)o(b)q(er)f(of)g(its)g(ma)r(jor)f +(deriv)n(ativ)o(es.)26 b(V)m(arious)16 b(tec)o(hniques)262 +542 y(w)o(ere)i(discussed)g(for)f(impro)o(ving)d(tree)19 b(searc)o(h)f +(e\016ciency)m(,)g(e.g.)27 b(mo)o(v)o(e)15 b(ordering,)j(itera-)262 +592 y(tiv)o(e)c(deep)q(ening)j(etc.)22 b(Tw)o(o)15 b(forw)o(ard)g(pruning)g +(tec)o(hniques)h(w)o(ere)g(also)f(examined.)20 b(The)262 641 +y(sub)r(ject)13 b(of)e(p)q(ositional)g(ev)n(aluation)f(w)o(as)i(explored)g +(and)g(v)n(arious)f(metho)q(ds)h(of)f(ev)n(aluation)262 691 +y(w)o(ere)j(examined)f(including)g(piece)i(square)f(tables,)g(static)g(ev)n +(aluation)f(and)h(incremen)o(tal)262 741 y(ev)n(aluation.)h(The)e(imp)q +(ortance)d(of)i(planning)e(and)i(the)g(game)e(phase)j(w)o(as)e(also)g +(discussed.)262 791 y(The)18 b(sub)r(ject)i(of)e(learning)f(in)h(c)o(hess)i +(w)o(as)e(in)o(v)o(estigated)g(and)h(some)e(conclusions)i(w)o(ere)262 +841 y(dra)o(wn.)e(The)e(neglected)g(area)f(of)f(time)g(con)o(trol)h(w)o(as)f +(also)h(explored.)324 926 y(In)f(c)o(hapter)i(4,)d(man)o(y)g(asp)q(ects)j(of) +e(m)o(y)f(in)o(v)o(estigation)g(w)o(ere)i(put)g(to)f(use)h(in)f(designing)262 +976 y(an)i(ev)n(aluation)e(function.)22 b(I)15 b(drew)h(extensiv)o(ely)g +(from)e(m)o(y)f(o)o(wn)i(exp)q(erience)j(of)c(pla)o(ying)262 +1026 y(c)o(hess)h(to)f(capture)h(some)f(of)f(the)i(heuristics)g(I)f(felt)g(w) +o(ere)h(imp)q(ortan)o(t)d(in)i(mo)o(v)o(e)e(selection.)262 +1075 y(This)19 b(w)o(as)g(v)o(ery)h(di\016cult)e(b)q(ecause)j(m)o(uc)o(h)d +(of)h(a)g(c)o(hess)i(pla)o(y)o(er's)e(abilit)o(y)e(seems)j(to)f(b)q(e)262 +1125 y(sub)q(conscious.)g(The)13 b(writings)f(of)h(man)o(y)e(great)i(pla)o(y) +o(ers)g(and)g(in)f(particular,)g(Aron)i(Nim-)262 1175 y(zo)o(witsc)o(h,)g +(help)q(ed)h(enormously)e(at)h(this)h(di\016cult)e(stage.)20 +b(I)14 b(also)g(felt)g(it)g(w)o(as)g(imp)q(ortan)o(t)262 1225 +y(to)f(dev)o(elop)h(a)g(set)h(of)e(pseudo)h(co)q(de)h(functions)f(for)g(use)g +(in)g(de\014ning)g(the)g(ev)n(aluation)f(cri-)262 1275 y(teria.)23 +b(These)17 b(functions)f(w)o(ere)g(broad)g(enough)g(to)f(allo)o(w)f(me)h(to)g +(express)j(a)d(signi\014can)o(t)262 1324 y(amoun)o(t)d(of)h(c)o(hess)i(kno)o +(wledge,)e(while)h(b)q(eing)g(precise)h(enough)f(to)g(b)q(e)g(implemen)o +(ted.)324 1410 y(In)g(c)o(hapter)g(5,)g(I)f(attempted)h(to)g(de\014ne)g(a)g +(metho)q(d)f(of)g(tree)i(searc)o(hing)g(whic)o(h)e(w)o(ould)262 +1460 y(enable)g(most)g(searc)o(h)h(e\013ort)h(to)e(b)q(e)h(exp)q(ended)i(in)d +(pursuit)h(of)f(go)q(o)q(d)g(or)h(in)o(teresting)g(v)n(ari-)262 +1509 y(ations.)k(My)d(hop)q(e)g(w)o(as)f(to)g(sim)o(ulate)f(the)h(greatly)h +(v)n(ariable)e(depth)i(of)f(a)g(strong)g(h)o(uman)262 1559 +y(pla)o(y)o(er's)e(searc)o(h)j(tree,)f(while)f(comp)q(ensating)f(for)h(w)o +(eak)g(selectivit)o(y)h(b)o(y)f(the)g(exploration)262 1609 +y(of)c(man)o(y)g(more)g(v)n(ariations.)15 b(The)c(searc)o(h)h(extensions)f +(pro)q(duced,)h(concen)o(trate)g(on)e(forced)262 1659 y(or)15 +b(highly)g(tactical)g(elemen)o(ts)g(of)h(pla)o(y)e(whic)o(h)i(ha)o(v)o(e)f +(some)g(lik)o(eliho)q(o)q(d)f(of)h(a\013ecting)h(the)262 1709 +y(searc)o(h)d(result.)18 b(Suc)o(h)13 b(extra)g(searc)o(h)h(in)o(telligence)e +(w)o(as)g(required)i(to)e(comp)q(ensate)h(for)f(the)262 1758 +y(inevitably)e(shallo)o(w)o(er)i(searc)o(hes)i(resulting)e(from)f(more)g +(time)f(b)q(eing)i(sp)q(en)o(t)i(applying)c(m)o(y)262 1808 +y(ev)n(aluation)i(function.)324 1893 y(Chapter)j(6)g(explains)f(some)g(of)g +(the)h(implemen)o(tation)c(issues)16 b(whic)o(h)f(arose.)21 +b(In)15 b(par-)262 1943 y(ticular)g(it)h(describ)q(es)i(the)e(imp)q(ortan)o +(t)f(data)g(structures)k(and)c(algorithms)f(necessary)k(in)262 +1993 y(the)d(program.)21 b(The)16 b(imp)q(ortance)f(of)f(program)g +(e\016ciency)i(w)o(as)f(also)g(made)f(clear.)23 b(The)262 2043 +y(results)13 b(of)f(an)g(extensiv)o(e)i(analysis)e(of)f(time)h(allo)q(cation) +f(and)h(con)o(trol)g(are)h(also)f(explained)262 2093 y(in)h(this)h(c)o +(hapter.)324 2178 y(Chapter)19 b(7)g(describ)q(es)i(ho)o(w)e(the)g(p)q +(erformance)g(of)g(HIAR)o(CS)f(5.0)g(w)o(as)h(measured.)262 +2228 y(Both)14 b(tactical)g(and)h(p)q(ositional)e(abilit)o(y)f(w)o(as)j(quan) +o(ti\014ed)f(and)g(an)g(estimate)g(of)g(its)g(c)o(hess)262 +2278 y(rating)f(w)o(as)h(made)e(after)i(the)h(application)d(of)i(man)o(y)e +(tests.)946 2574 y(165)p eop +%%Page: 166 168 +166 167 bop 262 307 a Fr(8.2)69 b(Ac)n(hiev)n(emen)n(ts)262 +434 y Fp(Ha)o(ving)14 b(in)o(v)o(estigated)i(b)q(oth)f(tactical)h(and)f(p)q +(ositional)f(ev)n(aluation;)h(together)i(with)e(the)262 483 +y(dev)o(elopmen)o(t)e(and)h(implemen)o(tatio)o(n)e(of)h(ideas)i(in)f(a)f +(program,)g(it)h(is)g(time)f(to)h(re\015ect)i(on)262 533 y(what)d(has)h(b)q +(een)h(ac)o(hiev)o(ed.)324 618 y(The)i(ideas)g(in)o(v)o(estigated)f(ha)o(v)o +(e)g(b)q(een)i(implemen)o(ted)c(successfully)k(in)e(a)h(c)o(hess)h(pro-)262 +668 y(gram)12 b(called)h(HIAR)o(CS)h(5.0.)324 753 y(It)f(has)h(b)q(een)g +(clearly)f(sho)o(wn)h(that)f(tree)i(searc)o(hing)e(signi\014can)o(tly)g +(impro)o(v)o(es)f(the)h(tac-)262 803 y(tical)d(abilit)o(y)f(of)h(a)h +(program.)k(F)m(or)c(example,)f(a)g(2)h(ply)f(searc)o(h)i(with)f(rudimen)o +(tary)e(capture)262 853 y(searc)o(h)14 b(is)f(able)g(to)f('see')i(tactical)f +(concepts,)h(suc)o(h)g(as)f(a)g(knigh)o(t)f(fork,)h(whic)o(h)g(w)o(ould)f +(oth-)262 903 y(erwise)17 b(go)f(unseen)i(b)o(y)f(a)f(mere)h(1)f(ply)g(searc) +o(h.)28 b(There)18 b(app)q(ears)f(no)f(viable)g(substitute)262 +953 y(for)c(tree)i(searc)o(hing)f(of)f(some)g(kind.)17 b(Static)c(tactical)g +(ev)n(aluation)e(can)i(b)q(e)g(useful)g(in)f(some)262 1003 +y(p)q(ositions,)h(but)h(cannot)g(b)q(e)g(though)o(t)g(of)f(as)h(a)g(searc)o +(h)h(replacemen)o(t.)324 1088 y(More)d(surprisingly)m(,)e(tree)j(searc)o +(hing)f(w)o(as)f(seen)i(to)e(signi\014can)o(tly)f(impro)o(v)o(e)g(p)q +(ositional)262 1138 y(abilit)o(y)m(.)15 b(This)c(w)o(as)h(clearly)f +(illustrated)g(when)i(I)e(dev)o(elop)q(ed)h(an)g(almost)d('kno)o(wledge)i +(less')262 1187 y(v)o(ersion)20 b(of)f(HIAR)o(CS,)h(whic)o(h)g(con)o(tained)g +(only)f(Pc/Sq)i(tables.)37 b(When)20 b(this)g(sp)q(ecial)262 +1237 y(v)o(ersion)c(w)o(as)f(searc)o(hing)i(6)f(plies)f(in)h(the)g(matc)o(h)f +(against)g(HIAR)o(CS)h(5.0,)f(its)h(p)q(ositional)262 1287 +y(pla)o(y)h(w)o(as)h(found)g(to)g(b)q(e)g(of)g(a)g(higher)g(calibre)g(than)g +(could)g(b)q(e)h(exp)q(ected)h(considering)262 1337 y(its)f(rudimen)o(tary)f +(c)o(hess)j(kno)o(wledge.)33 b(The)20 b(searc)o(h)g(w)o(as)f(actually)g +(bridging)f(some)g(of)262 1387 y(the)c(program's)d(kno)o(wledge)i +(de\014ciency)i(gap)e(b)o(y)g(allo)o(wing)f(higher)h(lev)o(el)g(concepts,)i +(suc)o(h)262 1436 y(as)20 b(m)o(ultim)o(o)o(v)o(e)d(piece)22 +b(path)o(w)o(a)o(ys,)f(to)f(b)q(e)h(considered.)39 b(This)20 +b(in)g(part)h(explains)f(wh)o(y)262 1486 y(Deep)d(Though)o(t)f(is)g(able)h +(to)f(displa)o(y)f(a)i(p)q(ositional)e(kno)o(wledge)h(m)o(uc)o(h)f(higher)i +(than)g(its)262 1536 y(ev)n(aluation)12 b(function)i(w)o(ould)f(suggest.)324 +1621 y(The)j(amoun)o(t)d(of)i(kno)o(wledge)g(whic)o(h)g(can)g(b)q(e)h +(bridged)g(b)o(y)f(tree)h(searc)o(hing)g(dep)q(ends)262 1671 +y(on)h(the)h(depth)h(of)e(searc)o(h.)30 b(Ho)o(w)o(ev)o(er,)19 +b(some)e(c)o(hess)i(concepts)g(are)f(so)g(deep,)h(40)e(or)h(50)262 +1721 y(plies,)12 b(that)h(it)g(will)e(b)q(e)j(almost)d(imp)q(ossible)g(for)i +(searc)o(hing)h(alone)e(to)h(bridge)g(suc)o(h)h(a)f(gap.)262 +1771 y(This)h(explains)h(wh)o(y)f(b)q(oth)i(the)f(Hitec)o(h)h(and)e(Deep)i +(Though)o(t)e(teams)g(are)i(encoun)o(tering)262 1821 y(diminishing)8 +b(returns)13 b(from)d(eac)o(h)i(additional)e(ply)h(of)g(searc)o(h.)18 +b(In)12 b(order)g(to)g(a)o(v)o(oid)e(similar)262 1870 y(problems)k(and)h +(reduce)i(HIAR)o(CS's)d(dep)q(endency)k(on)c(tree)j(searc)o(hing,)e(I)g(ha)o +(v)o(e)g(instilled)262 1920 y(a)h(signi\014can)o(t)h(amoun)o(t)e(of)h(static) +h(kno)o(wledge)g(in)f(the)i(w)o(a)o(y)e(of)g(p)q(ositional)g(criteria)h(and) +262 1970 y(dynamic)12 b(tactical)h(kno)o(wledge)h(in)f(the)i(w)o(a)o(y)e(of)g +(selectiv)o(e)i(searc)o(h)g(extensions.)324 2055 y(HIAR)o(CS's)9 +b(p)q(erformance)g(has)h(clearly)f(illustrated)h(that)f(extra)h(kno)o(wledge) +g(can)g(more)262 2105 y(than)k(comp)q(ensate)h(for)g(reduced)i(searc)o(h)f +(capacit)o(y)m(.)k(A)15 b(pa)o(wn)f(outside)i(the)f(quadrate)g(of)262 +2155 y(the)i(opp)q(osing)f(king)f(is)i(a)f(clear)h(example)e(of)h(this:)24 +b(without)16 b(direct)h(kno)o(wledge)g(ab)q(out)262 2205 y(king-pa)o(wn)12 +b(quadrates,)j(a)e(full)g(width)h(searc)o(h)h(program)e(ma)o(y)f(require)j +(up)f(to)g(an)g(11)f(ply)262 2255 y(searc)o(h)j(to)g(realise)g(the)g(pa)o(wn) +f(can)h(queen.)24 b(HIAR)o(CS)15 b(5.0)g(is)g(capable)h(of)f(realising)g +(this)262 2304 y(after)f(a)f(mere)h(1)f(ply)h(searc)o(h)h(b)q(ecause)g(of)f +(its)g(c)o(hess)h(kno)o(wledge.)324 2390 y(Ho)o(w)d(far)g(c)o(hess)h(kno)o +(wledge)g(can)f(b)q(e)h(increased)h(at)e(the)h(exp)q(ense)h(of)d(searc)o +(hing,)i(with-)262 2439 y(out)h(degrading)g(o)o(v)o(erall)g(p)q(erformance)g +(is)h(still)f(op)q(en)h(to)f(question.)21 b(Ho)o(w)o(ev)o(er,)15 +b(I)f(b)q(eliev)o(e)946 2574 y(166)p eop +%%Page: 167 169 +167 168 bop 262 307 a Fp(full)10 b(width)i(searc)o(hing)g(can)g(b)q(e)g +(reduced)i(in)d(fa)o(v)o(our)g(of)h(sophisticated)g(searc)o(h)h(extensions.) +262 357 y(The)i(lev)o(el)g(to)g(whic)o(h)g(the)g(full)f(width)h(p)q(ortion)g +(of)f(the)i(searc)o(h)g(can)f(b)q(e)h(reduced)h(greatly)262 +407 y(dep)q(ends)i(on)e(ho)o(w)g(comprehensiv)o(e)h(and)f(e\013ectiv)o(e)i +(the)f(searc)o(h)h(extensions)f(are.)30 b(T)m(ak-)262 457 y(ing)15 +b(this)g(approac)o(h)h(to)g(its)f(extreme)h(w)o(ould)f(result)i(in)e(a)h +(totally)e(selectiv)o(e)j(searc)o(h)g(of)e(a)262 506 y(narro)o(w,)e(deep)i +(game)d(tree.)324 592 y(When)18 b(long)g(term)f(c)o(hess)j(kno)o(wledge)e(is) +g(con)o(tained)h(in)f(the)g(ev)n(aluation)f(function,)262 641 +y(suc)o(h)f(as)g(pa)o(wn)g(structure)i(information)13 b(for)j(example,)f(eac) +o(h)h(additional)e(ply)i(do)q(es)h(not)262 691 y(seem)d(to)h(su\013er)g(suc)o +(h)h(diminishing)c(returns)k(as)f(seen)h(when)f(the)g(kno)o(wledge)f(con)o +(ten)o(t)i(is)262 741 y(lo)o(w)o(er.)22 b(This)15 b(w)o(as)g(made)g(clear)g +(b)o(y)h(the)g(un)o(usually)e(large)h(impro)o(v)o(emen)o(t)e(in)i(HIAR)o +(CS's)262 791 y(pla)o(y)d(b)q(et)o(w)o(een)k(30)d(seconds)i(and)f(3)g(min)o +(utes)f(a)g(mo)o(v)o(e.)324 876 y(The)19 b(ac)o(hiev)o(emen)o(t)f(of)f(iden)o +(tifying)g(and)i(com)o(bining)d(tactical)i(uncertain)o(t)o(y)h(in)f(the)262 +926 y(ev)n(aluation)12 b(function)h(has)h(b)q(een)h(b)q(ene\014cial.)j(Allo)o +(wing)12 b(the)i(searc)o(h)h(heuristics)g(to)e(mak)o(e)262 +976 y(use)19 b(of)f(this)h(information)d(has)j(help)q(ed)h(reduce)g(the)g +(programs)d(susceptibilit)o(y)i(to)g(the)262 1026 y(horizon)13 +b(e\013ect.)324 1111 y(Not)d(only)g(is)h(HIAR)o(CS's)f(p)q(ositional)f(pla)o +(y)h(signi\014can)o(tly)g(impro)o(v)o(ed,)f(but)i(the)g(tactical)262 +1161 y(standard)h(pro)q(duced)i(from)c(ev)o(en)j(shallo)o(w)e(searc)o(h)i +(depths)h(is)e(impressiv)o(e.)17 b(F)m(or)11 b(example,)262 +1210 y(on)j(one)g(o)q(ccasion,)g(HIAR)o(CS)g(solv)o(ed)g(a)g("mate)f(in)h(5)g +(problem")f(while)g(only)h(at)g(the)h(\014rst)262 1260 y(ply)e(of)h(full)f +(width)h(searc)o(h.)20 b(The)15 b(tactical)f(impro)o(v)o(em)o(en)o(t)e(is)i +(only)g(eviden)o(t,)g(ho)o(w)o(ev)o(er,)g(in)262 1310 y(v)n(ariations)g(con)o +(taining)g(mo)o(v)o(es)h(that)g(can)h(b)q(e)g(iden)o(ti\014ed)g(b)o(y)f(the)i +(extension)f(heuristics.)262 1360 y(Ho)o(w)o(ev)o(er,)d(as)h(the)h(tactical)e +(co)o(v)o(erage)i(is)e(quite)h(large,)g(the)g(o)o(v)o(erall)f(a\013ect)i(is)e +(b)q(ene\014cial.)324 1445 y(A)d(lot)f(of)h(progress)h(has)f(b)q(een)i(made)d +(on)g(the)i(sub)r(ject)h(of)d(time)g(allo)q(cation)f(and)i(con)o(trol.)262 +1495 y(The)16 b(resulting)g(algorithm)d(has)j(certainly)g(impro)o(v)o(ed)f +(HIAR)o(CS's)g(o)o(v)o(erall)g(standard)h(of)262 1545 y(pla)o(y)c(b)o(y)i +(allo)q(cating)e(and)i(adjusting)f(time)g(relativ)o(e)h(to)f(the)i(needs)g +(of)e(the)i(p)q(osition.)324 1630 y(The)i(results)h(pro)q(duced)g(on)f(the)g +(Bratk)o(o-Kop)q(ec)h(test)g(p)q(ositions)e(clearly)h(illustrate)262 +1680 y(that)c(HIAR)o(CS)h(do)q(es)h(displa)o(y)d(the)j(tactical)f(and)f(p)q +(ositional)g(abilit)o(y)f(of)h(an)h(exp)q(ert)h(lev)o(el)262 +1730 y(pla)o(y)o(er,)9 b(hence)i(meeting)e(the)i(aims)d(set)i(out)g(at)g(the) +g(b)q(eginning)f(of)g(the)i(pro)r(ject.)17 b(What)10 b(w)o(as)262 +1779 y(most)j(surprising)h(ab)q(out)g(HIAR)o(CS's)g(results)i(on)e(the)h +(test)g(p)q(ositions)f(w)o(as)g(its)h(balanced)262 1829 y(p)q(ositional)g +(and)h(tactical)g(abilit)o(y)m(.)24 b(These)18 b(results)g(are)e +(particularly)g(impressiv)o(e)g(when)262 1879 y(compared)f(to)g(the)i +(results)g(obtained)e(from)f(other)j(c)o(hess)g(programs)e(on)g(the)i(same)e +(test)262 1929 y(p)q(ositions.)324 2014 y(The)d(results)h(ac)o(hiev)o(ed)g +(in)e(the)i(matc)o(hes)e(pla)o(y)o(ed)h(b)o(y)f(HIAR)o(CS)h(against)f(b)q +(oth)h(h)o(uman)262 2064 y(and)17 b(computer)g(opp)q(osition)f(re-enforce)j +(the)f(results)h(ac)o(hiev)o(ed)f(in)f(the)h(Bratk)o(o-Kop)q(ec)262 +2114 y(exp)q(erimen)o(t.)946 2574 y(167)p eop +%%Page: 168 170 +168 169 bop 262 307 a Fr(8.3)69 b(Implications)20 b(and)k(F)-6 +b(uture)23 b(Prosp)r(ects)262 434 y Fp(Ov)o(er)16 b(the)h(last)e(10)h(y)o +(ears,)g(full)f(width)g(Shannon)h(t)o(yp)q(e)g(A)g(programs)f(ha)o(v)o(e)h +(made)e(great)262 483 y(adv)n(ances,)c(partly)g(due)h(to)f(adv)n(anced)g(sp)q +(ecial)h(purp)q(ose)g(hardw)o(are)g(and)f(partly)g(to)g(sophis-)262 +533 y(ticated)17 b(searc)o(h)i(algorithms)c(suc)o(h)j(as)f(PVS)g(with)g +(singular)g(extensions,)h(for)f(example.)262 583 y(V)m(ery)g(little)g(or)h +(no)f(progress)i(has)f(b)q(een)g(made)f(o)o(v)o(er)g(the)h(same)f(p)q(erio)q +(d)h(in)f(dev)o(eloping)262 633 y(purely)i(kno)o(wledge)h(based)g(programs)e +(capable)i(of)f(high)g(lev)o(el)g(pla)o(y)f(throughout)i(the)262 +683 y(game.)c(It)e(seems)g(that)f(the)i(problems)e(of)g(kno)o(wledge)g +(acquisition,)f(represen)o(tation)k(and)262 732 y(\014nally)d(implemen)o +(tation)f(are)j(at)g(presen)o(t)h(to)q(o)f(great)g(to)g(mak)o(e)f(suc)o(h)h +(kno)o(wledge)g(based)262 782 y(programs)g(successful.)28 b(Certainly)m(,)16 +b(the)h(k)o(ey)g(to)g(these)h(t)o(yp)q(es)f(of)f(program)f(remains)h(in)262 +832 y(the)e(b)q(etter)i(understanding)e(of)f(ho)o(w)h(strong)g(pla)o(y)o(ers) +g(think.)324 917 y(There)e(seems)g(to)f(b)q(e)h(t)o(w)o(o)e(main)g(approac)o +(hes)i(to)f(dev)o(eloping)f(an)h(in)o(telligen)o(t)g(selectiv)o(e)262 +967 y(searc)o(h)k(program.)312 1081 y(1.)20 b(Creating)14 b(an)g(in)o +(telligen)o(t,)e(kno)o(wledge)i(based)g(program)e(from)h(scratc)o(h.)312 +1162 y(2.)20 b(Gradual)13 b(c)o(hange)h(to)g(a)g(full)e(width)i(Shannon)g(t)o +(yp)q(e)g(A)g(program.)262 1276 y(An)9 b(approac)o(h)h(of)f(gradual)f(c)o +(hange)i(to)g(existing)f(programs)f(seems)i(to)g(me)e(to)i(o\013er)g(a)f(b)q +(etter)262 1326 y(hop)q(e)k(of)g(ev)o(en)o(tual)g(success.)21 +b(I)13 b(feel)g(a)h(program)d(lik)o(e)i(HIAR)o(CS)g(5.0)f(could)h(represen)o +(t)j(the)262 1376 y(\014rst)e(step)g(in)f(a)g(gradual)f(transition)h(from)e +(a)i(sophisticated)h(Shannon)f(t)o(yp)q(e)h(A)f(program)262 +1426 y(to)18 b(an)g(in)o(telligen)o(t)f(Shannon)i(t)o(yp)q(e)g(B/C)f +(program.)31 b(The)19 b(ma)r(jor)d(adv)n(an)o(tage)i(of)g(suc)o(h)262 +1476 y(an)c(approac)o(h)g(is)h(that)f(the)i(program)d(can)h(serv)o(e)i(as)f +(a)f(v)o(ehicle)h(for)f(exp)q(erimen)o(ting)g(with)262 1525 +y(ideas.)34 b(Hop)q(efully)m(,)20 b(this)f(will)f(in)h(turn)h(enable)g(the)g +(researc)o(her)i(to)d(acquire)h(a)f(b)q(etter)262 1575 y(understanding)14 +b(of)f(the)i(problems)e(and)g(issues)i(in)o(v)o(olv)o(ed.)324 +1660 y(The)d(3)f(ma)r(jor)g(di\016culties)g(a\013ecting)h(the)g(dev)o +(elopmen)o(t)f(of)g(a)h(go)q(o)q(d)f(ev)n(aluation)g(func-)262 +1710 y(tion)i(remain)f(kno)o(wing:)324 1824 y Ff(\017)20 b +Fl(whic)o(h)13 b Fp(ev)n(aluation)f(criteria)j(are)f(imp)q(ortan)o(t.)324 +1905 y Ff(\017)20 b Fl(when)14 b Fp(ev)n(aluation)e(criteria)i(are)h(imp)q +(ortan)o(t.)324 1986 y Ff(\017)20 b Fl(what)14 b Fp(the)g(relativ)o(e)g +(merits)f(of)h(eac)o(h)g(ev)n(aluation)e(criterion)j(should)e(b)q(e.)262 +2100 y(The)i(solution)f(to)g(these)j(problems)d(lie)g(in)g(a)h(signi\014can)o +(t)f(con)o(tribution)h(from)e(high)h(lev)o(el)262 2150 y(pla)o(y)o(ers)h(and) +h(the)g(con)o(tin)o(ual)f(ev)o(olution)g(of)g(ev)n(aluation)f(criteria.)24 +b(The)17 b(problems)e(asso-)262 2200 y(ciated)g(with)g(assigning)f(discrete)j +(v)n(alues)e(to)g(c)o(hess)i(concepts)g(is)e(a)g(ma)r(jor)f(di\016cult)o(y)g +(for)262 2250 y(the)e(exp)q(ert)h(c)o(hess)g(pla)o(y)o(er.)k(Applying)11 +b(v)n(alue)g(ranges)h(instead)g(of)f(single)g(v)n(alues)h(ma)o(y)e(b)q(e)i(a) +262 2300 y(p)q(ossibilit)o(y)m(.)j(This)e(com)o(bined)f(with)g(a)g(range)h +(and)g(probabilit)o(y)e(based)i(searc)o(h)h(algorithm)262 2350 +y(w)o(ould)f(b)q(e)i(an)f(in)o(teresting)h(p)q(ossibilit)o(y)m(.)j(Learning)c +(ma)o(y)e(pla)o(y)i(an)g(imp)q(ortan)o(t)f(role)h(here,)262 +2399 y(ho)o(w)o(ev)o(er,)i(man)o(y)e(of)h(the)h(problems)f(outlined)g(in)h(c) +o(hapter)h(3)e(m)o(ust)g(b)q(e)h(solv)o(ed)g(if)f(this)h(is)262 +2449 y(to)d(b)q(e)i(the)f(case.)946 2574 y(168)p eop +%%Page: 169 171 +169 170 bop 324 307 a Fp(The)11 b(com)o(bination)e(of)i(the)g(transp)q +(osition)h(table)f(and)g(searc)o(h)h(extensions)g(has)f(pro)o(v)o(ed)262 +357 y(problematical.)j(The)e(expansion)e(of)g(eac)o(h)i(table)e(en)o(try)i +(to)e(include)h(mo)o(v)o(e)e(sequences)14 b(and)262 407 y(extension)j +(information)d(is)i(required.)27 b(As)18 b(w)o(ell)e(as)g(easing)h(the)g +(problems)f(outlined)g(in)262 457 y(section)i(7.6,)e(this)i(impro)o(v)o(em)o +(en)o(t)d(could)i(allo)o(w)f(a)h(h)o(uman)f(pla)o(y)o(er)g(to)i(ask)f("what)g +(if)f(?")262 506 y(questions.)31 b(The)18 b(transp)q(osition)g(table)g(could) +g(b)q(e)h(prob)q(ed)g(after)f(a)g(searc)o(h)h(to)f(answ)o(er)262 +556 y(suc)o(h)c(questions)h(with)f(mo)o(v)o(e)e(sequences)17 +b(and)d(scores.)20 b(The)14 b Fh(\013\014)j Fp(algorithm)11 +b(w)o(ould)i(limit)262 606 y(suc)o(h)j(a)g(metho)q(d)f(b)q(ecause)j(of)d(p)q +(ossible)h(cut)h(o\013s,)f(but)g(still)f(a)h(step)h(in)e(the)i(direction)f +(of)262 656 y(understanding)i(mo)o(v)o(e)e(selection)j(w)o(ould)e(b)q(e)h +(made.)29 b(Another)19 b(p)q(ossibilit)o(y)e(is)g(the)i(use)262 +706 y(of)c(the)h(ev)n(aluation)f(function)h(to)f(answ)o(er)i(questions)f(ab)q +(out)g(the)h(p)q(osition)e(e.g.)24 b("whic)o(h)262 756 y(squares)13 +b(are)h(w)o(eak)e(around)h(the)g(white)g(king)f(?".)17 b(Suc)o(h)c(approac)o +(hes)h(w)o(ould)e(help)g(strong)262 805 y(c)o(hess)h(pla)o(y)o(ers)f(to)g +(iden)o(tify)g(program)e(w)o(eaknesses)15 b(and)d(allo)o(w)e(the)j(program)e +(designer)i(to)262 855 y(w)o(ork)g(more)g(closely)h(with)f(c)o(hess)j(pla)o +(y)o(ers)e(ha)o(ving)e(little)i(programmi)o(ng)d(kno)o(wledge.)324 +940 y(HIAR)o(CS)16 b(5.0)f(con)o(tains)h(man)o(y)e(searc)o(h)j(extension)g +(heuristics)g(whic)o(h)f(mak)o(e)f(a)g(p)q(os-)262 990 y(itiv)o(e)i(con)o +(tribution)g(to)h(its)g(tactical)f(abilit)o(y)m(.)28 b(The)18 +b(next)h(step)f(w)o(ould)f(not)h(only)f(b)q(e)i(to)262 1040 +y(enhance)c(and)f(tune)h(these)h(existing)e(heuristics,)h(but)f(to)g(in)o +(tro)q(duce)h(new)g(heuristics.)21 b(In)262 1090 y(particular,)13 +b(there)h(seems)g(no)g(reason)g(wh)o(y)f(p)q(ositional)g(t)o(yp)q(e)h(searc)o +(h)h(extensions)f(cannot)262 1140 y(b)q(e)i(in)o(tro)q(duced.)27 +b(Although)15 b(the)i(asso)q(ciated)g(di\016culties)f(are)h(man)o(y)m(,)d +(the)j(rew)o(ards)g(are)262 1189 y(great.)324 1275 y(Ov)o(er)d(the)f(coming)e +(mon)o(ths,)h(I)h(will)f(endev)o(our)i(to)e(correct)j(man)o(y)c(of)i(the)h(w) +o(eaknesses)262 1324 y(iden)o(ti\014ed)20 b(in)h(HIAR)o(CS)f(5.0's)g(pla)o(y) +m(.)37 b(HIAR)o(CS)20 b(5.n)g(will)g(b)q(e)h(en)o(tered)h(in)f(the)g(c)o +(hess)262 1374 y(tournamen)o(t)10 b(of)h(the)h(2nd)f(Computer)g(Olympiad)e +(later)j(this)f(y)o(ear.)18 b(Hop)q(efully)m(,)10 b(HIAR)o(CS)262 +1424 y(will)16 b(b)q(e)j(using)f(a)g(25Mhz)h(68030)e(for)h(this)g(ev)o(en)o +(t.)32 b(The)19 b(result)g(this)g(summer)d(will)h(b)q(e)262 +1474 y(in)o(teresting.)324 1559 y(Man)o(y)e(of)f(the)i(tec)o(hniques)g(used)g +(in)f(computer)g(c)o(hess)i(programs)d(ma)o(y)f(b)q(e)j(useful)f(in)262 +1609 y(other)f(problem)e(domains.)k(I)e(con)o(tacted)h(Hans)f(Berliner)g(at)g +(CMU)g(ab)q(out)f(the)h(p)q(ossibil-)262 1659 y(ities)i(of)f(applying)g(some) +g(of)g(the)i(latest)f(searc)o(h)h(tec)o(hniques)h(to)d(Theorem)h(Pro)o(ving)f +([8].)262 1709 y(Although)i(no)i(one)f(has)h(built)f(sp)q(ecial)g(purp)q(ose) +i(hardw)o(are,)f(the)g('c)o(hess)h(approac)o(h')e(is)262 1758 +y(apparen)o(tly)13 b(b)q(eing)h(lo)q(ok)o(ed)f(up)q(on)h(fa)o(v)o(ourably)m +(.)324 1844 y(I)g(hop)q(e)g(this)g(pro)r(ject)h(has)f(sho)o(wn)g(that)f(b)q +(oth)h(c)o(hess)i(kno)o(wledge)d(and)h(searc)o(hing)g(can)262 +1893 y(complemen)o(t)f(eac)o(h)k(other)g(and)e(that)h(a)g(go)q(o)q(d)g +(balance)g(b)q(et)o(w)o(een)h(the)g(t)o(w)o(o)e(can)h(ac)o(hiev)o(e)262 +1943 y(results.)946 2574 y(169)p eop +%%Page: 170 172 +170 171 bop 262 675 a Fo(Bibliog)q(raph)m(y)324 913 y Fp([1])19 +b(G.)e(M.)g(Adelson-V)m(elskiy)h(and)f(M.)g(V.)h(Donsk)o(o)o(y)e(\(1975\))h +(:)26 b Fm(Some)19 b(Metho)n(ds)g(of)388 963 y(Contr)n(ol)r(ling)g(the)g(T)m +(r)n(e)n(e)g(Se)n(ar)n(ch)g(in)h(Chess)f(Pr)n(o)n(gr)n(ams.)f +Fp(Arti\014cial)g(In)o(telligence,)388 1012 y(V)m(ol)13 b(6)h(No)f(4,)h(pp)g +(361-371.)324 1095 y([2])19 b(G.)g(M.)f(Adelson-V)m(elskiy)m(,)i(V.)f(L.)f +(Arlazaro)o(v,)i(A.)f(R.)f(Bitman,)h(A.)f(A.)h(Zhiv)o(o-)388 +1145 y(to)o(vskiy)h(and)f(A.)h(V.)f(Usk)o(o)o(v)h(\(1970\))f(:)30 +b Fm(Pr)n(o)n(gr)n(amming)20 b(a)g(Computer)g(to)h(Play)388 +1195 y(Chess.)14 b Fp(Russian)f(Math.)h(Surv)o(eys,)g(pp)g(221-262)324 +1278 y([3])19 b(T.)14 b(Anan)o(tharaman,)f(M.)g(Campb)q(ell,)g(F.)h(Hsu)h +(\(1988\))e(:)19 b Fm(Singular)d(Extensions)g(:)388 1328 y(A)n(dding)i(Sele)n +(ctivity)e(to)h(Brute{F)m(or)n(c)n(e)g(Se)n(ar)n(ching.)f Fp(ICCA)h(Journal,) +f(V)m(ol)f(11)h(No)388 1378 y(4,)d(pp)h(135-143.)324 1461 y([4])19 +b(L.)f(R.)f(A)o(tkin)h(and)g(D.)f(J.)h(Slate)g(\(1977\))f(:)26 +b Fm(CHESS)20 b(4.5)e(-)h(The)g(Northwestern)388 1510 y(University)14 +b(Chess)g(Pr)n(o)n(gr)n(am.)f Fp(Chess)h(Skill)e(in)h(Man)g(and)g(Mac)o +(hine,)g(P)m(.)g(W.)f(F)m(rey)388 1560 y(\(ed\),)j(pp)e(82-118,)f(Springer{V) +m(erlag,)h(New)i(Y)m(ork.)324 1643 y([5])k(D.)13 b(F.)h(Beal)g(\(1989\))f(:) +18 b Fm(Exp)n(eriments)c(with)g(the)h(Nul)r(l)f(Move.)h Fp(Adv)n(ances)f(in)f +(Com-)388 1693 y(puter)20 b(Chess)g(5,)f(D.)f(F.)g(Beal)g(\(ed\),)j(pp)d +(65-79,)g(Elsevier)i(Science)g(Publishers)388 1743 y(B.V.,)13 +b(North)i(Holland.)324 1826 y([6])k(H.)f(J.)f(Berliner)i(\(1979\))e(:)26 +b Fm(The)18 b(B*)h(T)m(r)n(e)n(e)e(Se)n(ar)n(ch)i(A)o(lgorithm)e(:)26 +b(A)18 b(Best)h(First)388 1876 y(Pr)n(o)n(of)c(Pr)n(o)n(c)n(e)n(dur)n(e.)e +Fp(Arti\014cial)g(In)o(telligence,)h(V)m(ol)f(12,)f(No)i(1,)f(pp)h(23-40.)324 +1959 y([7])19 b(H.)11 b(J.)h(Berliner)g(\(1989\))f(:)16 b Fm(Some)e +(Innovations)f(Intr)n(o)n(duc)n(e)n(d)g(by)g(Hite)n(ch.)e Fp(Adv)n(ances)388 +2009 y(in)h(Computer)f(Chess)j(5,)d(D.)h(F.)g(Beal)g(\(ed\),)h(pp)f(283-293,) +e(Elsevier)j(Science)g(Pub-)388 2058 y(lishers)i(B.V.,)e(North)h(Holland.)324 +2141 y([8])19 b(H.)14 b(J.)g(Berliner)g(:)k Fm(Personal)d(Communic)n(ation,)g +(F)m(eb)g(1990.)324 2224 y Fp([9])k(A.)14 b(Bernstein)h(and)f(M.)f(de)h(V.)f +(Rob)q(erts)i(\(1958\))e(:)k Fm(Computer)e(vs)g(Chess)f(Player.)388 +2274 y Fp(Scien)o(ti\014c)h(American,)d(198,)h(pp)h(96-105.)303 +2357 y([10])19 b(P)m(.)14 b(Bettadapur)h(\(1986\))f(:)19 b +Fm(In\015uenc)n(e)e(of)e(Or)n(dering)f(on)i(Captur)n(e)f(Se)n(ar)n(ch.)g +Fp(ICCA)388 2407 y(Journal,)e(V)m(ol)g(9,)g(No)h(4,)f(pp)h(180-188.)946 +2574 y(170)p eop +%%Page: 171 173 +171 172 bop 303 307 a Fp([11])19 b(J.)12 b(A.)g(Birmingham)d(and)j(P)m(.)f +(Ken)o(t)i(\(1977\))e(:)17 b Fm(T)m(r)n(e)n(e-se)n(ar)n(ching)12 +b(and)i(T)m(r)n(e)n(e-pruning)388 357 y(T)m(e)n(chniques.)h +Fp(Adv)n(ances)g(in)f(Computer)f(Chess)j(1,)e(M.)f(Clark)o(e)h(\(ed\),)h(pp)g +(89-107.)388 407 y(Edin)o(burgh)f(Univ)o(ersit)o(y)g(Press.)303 +487 y([12])19 b(I.)g(Bratk)o(o)h(and)f(D.)f(Kop)q(ec)j(\(1982\))e(:)29 +b Fm(The)20 b(Br)n(atko{Kop)n(e)n(c)g(Exp)n(eriment)g(:)29 +b(A)388 536 y(Comp)n(arison)16 b(of)f(Human)i(and)f(Computer)f(Performanc)n +(e)h(in)f(Chess.)g Fp(Adv)n(ances)388 586 y(in)10 b(Computer)g(Chess)i(3,)e +(Clark)o(e)h(M.)f(\(ed\),)h(pp)g(51-72.)e(P)o(ergamon)g(Press,)j(Oxford.)303 +666 y([13])19 b(M.)12 b(S.)g(Campb)q(ell)f(and)h(T.)g(A.)g(Marsland)g +(\(1983\))g(:)17 b Fm(A)c(Comp)n(arison)h(of)f(Minimax)388 +716 y(T)m(r)n(e)n(e)h(Se)n(ar)n(ch)h(A)o(lgorithms.)e Fp(Arti\014cial)g(In)o +(telligence,)h(V)m(ol)e(20)i(No)f(4,)h(pp)g(347-367.)303 795 +y([14])19 b(J.)g(H.)f(Condon)g(and)g(K.)g(Thompson)f(\(1982\))h(:)27 +b Fm(Bel)r(le)19 b(Chess)g(Har)n(dwar)n(e.)e Fp(Ad-)388 845 +y(v)n(ances)d(in)e(Computer)g(Chess)h(3,)g(M.)f(Clark)o(e)g(\(ed\),)h(pp)g +(45-54,)e(P)o(ergamon)g(Press,)388 895 y(Oxford.)303 975 y([15])19 +b(S.)14 b(M.)f(Cracraft)h(\(1984\))f(:)18 b Fm(Bitmap)c(Move)i(Gener)n(ation) +f(in)f(Chess.)g Fp(ICCA)f(Jour-)388 1024 y(nal,)g(V)m(ol)g(7,)g(No)h(3,)f(pp) +h(146-153.)303 1104 y([16])19 b(A.)26 b(D.)f(de)h(Gro)q(ot)f(\(1978\))g(:)42 +b Fm(Thought)26 b(and)h(Choic)n(e)f(in)g(Chess.)f Fp(Mouton-)388 +1154 y(DeGruyter,)15 b(2nd)e(edition.)303 1234 y([17])19 b(A.)e(D.)g(de)h +(Gro)q(ot)f(and)h(R.)e(W.)h(Jongman)e(\(1966\))i(:)25 b Fm(Heuristics)18 +b(in)g(p)n(er)n(c)n(eptual)388 1284 y(pr)n(o)n(c)n(esses.)c +Fp(In)o(ternational)f(Congress)i(of)e(Psyc)o(hology)m(,)g(Mosco)o(w,)g +(August)h(1966.)303 1363 y([18])19 b(C.)10 b(Eb)q(eling)f(\(1986\))h(:)16 +b Fm(A)o(l)r(l)10 b(the)h(R)o(ight)h(Moves)f({)h(A)f(VLSI)g(A)o(r)n(chite)n +(ctur)n(e)f(for)h(Chess.)388 1413 y Fp(PhD)j(thesis,)h(Carnegie{Mellon)e +(Univ)o(ersit)o(y)m(.)303 1493 y([19])19 b(A.)i(E.)f(Elo)h(\(1978\))f(:)32 +b Fm(The)21 b(R)n(atings)g(of)h(Chess)f(Players)g(Past)g(and)h(Pr)n(esent.) +388 1543 y Fp(Batsford)15 b(Bo)q(oks,)e(London.)303 1622 y([20])19 +b(M.)d(Eu)o(w)o(e)h(\(1970\))f(:)23 b Fm(Computers)17 b(and)h(Chess.)e +Fp(The)h(Encyclopaedia)f(of)g(Chess,)388 1672 y(A.)e(Sunn)o(uc)o(ks)g +(\(ed\),)h(St)f(Martin's)f(Press,)i(New)g(Y)m(ork.)303 1752 +y([21])k Fm(Discussion)d(with)e(T)m(om)h(F)m(urstembur)n(g,)e(Fidelity)i(Ele) +n(ctr)n(onics,)f(A)o(ugust)h(1989.)303 1831 y Fp([22])k(J.)c(J.)f(Gillogly)e +(\(1972\))i(:)19 b Fm(The)d(T)m(e)n(chnolo)n(gy)g(Chess)f(Pr)n(o)n(gr)n(am.)f +Fp(Arti\014cial)g(In)o(telli-)388 1881 y(gence,)h(V)m(ol)e(3,)g(pp)h +(145-163.)303 1961 y([23])19 b(R.)f(D.)f(Green)o(blatt,)i(D.)f(E.)g(Eastlak)o +(e)g(I)q(I)q(I)h(and)f(S.)g(D.)f(Cro)q(c)o(k)o(er)i(\(1967\))f(:)27 +b Fm(The)388 2011 y(Gr)n(e)n(enblatt)15 b(Chess)f(Pr)n(o)n(gr)n(am.)f +Fp(Pro)q(c.)i(FJCC,V)m(ol)d(31,)h(pp)h(801-810)303 2090 y([24])19 +b(G.)14 b(Grottling)g(\(1986\))g(:)19 b Fm(The)d(Swe)n(dish)f(r)n(ating)h +(list.)d Fp(ICCA)i(Journal,)f(V)m(ol)g(9,)g(No)388 2140 y(1,)f(pp)h(56.)303 +2220 y([25])19 b(J.)i(Hamlen)e(\(1989\))g(:)32 b Fm(T)m(r)n(e)n(e)19 +b(Se)n(ar)n(ching)j(A)o(lgorithms)e(and)h(Computer)g(Chess.)388 +2270 y Fp(M.Sc.)14 b(Thesis,)g(Univ)o(ersit)o(y)g(of)f(London.)303 +2350 y([26])19 b(L.)12 b(R.)f(Harris)i(\(1977\))e(:)17 b Fm(The)d(Heuristic)e +(Se)n(ar)n(ch)h(:)18 b(A)o(n)c(alternative)f(to)g(the)g(alpha-)388 +2399 y(b)n(eta)19 b(minimax)f(pr)n(o)n(c)n(e)n(dur)n(e.)f Fp(Chess)i(Skill)d +(in)h(Man)h(and)f(Mac)o(hine.)h(P)m(.)f(W.)f(F)m(rey)388 2449 +y(\(ed\),)f(pp)e(157-166,)f(Springer{V)m(erlag,)h(New)i(Y)m(ork.)946 +2574 y(171)p eop +%%Page: 172 174 +172 173 bop 303 307 a Fp([27])19 b(D.)d(Hartmann)g(\(1989\))g(:)24 +b Fm(Notions)17 b(of)h(Evaluation)g(F)m(unctions)g(T)m(este)n(d)f(against)388 +357 y(Gr)n(andmaster)g(Games.)f Fp(Adv)n(ances)h(in)f(Computer)f(Chess)i(5,)f +(D.)f(F.)h(Beal)g(\(ed\),)388 407 y(pp)e(91-141,)e(Elsevier)j(Science)g +(Publishers)g(B.V.,)e(North)h(Holland.)303 487 y([28])19 b(E.)c(Hearst)i +(\(1977\))d(:)21 b Fm(Man)c(and)g(Machine)g(:)k(Chess)16 b(A)n(chievements)h +(and)g(Chess)388 536 y(Thinking.)f Fp(Chess)h(Skill)d(in)h(Man)g(and)h(Mac)o +(hine.)f(P)m(.)g(W.)f(F)m(rey)i(\(ed\),)g(Springer{)388 586 +y(V)m(erlag,)d(New)i(Y)m(ork.)303 666 y([29])k(R.)14 b(M.)g(Hy)o(att)g +(\(1983\))f(:)19 b Fm(Cr)n(ay)c(Blitz)g(-)g(A)g(Computer)g(Chess)g(Playing)h +(Pr)n(o)n(gr)n(am.)388 716 y Fp(M.Sc.)e(Thesis.)303 795 y([30])19 +b(R.)12 b(M.)g(Hy)o(att)h(\(1984\))f(:)17 b Fm(Using)d(Time)f(Wisely.)f +Fp(ICCA)h(Journal,)f(V)m(ol)g(7)g(No)g(1,)h(pp)388 845 y(4-9.)303 +925 y([31])19 b(R.)10 b(M.)f(Hy)o(att,)i(A.)e(E.)h(Go)o(w)o(er)g(and)g(H.)g +(L.)g(Nelson)g(\(1984\))g(:)16 b Fm(Cr)n(ay)11 b(Blitz.)e Fp(Adv)n(ances)388 +975 y(in)j(Computer)f(Chess)i(4,)e(D.)g(F.)h(Beal)g(\(ed\),)g(pp)g(8-18,)f(P) +o(ergamon)g(Press,)i(Oxford.)303 1054 y([32])19 b(B.)11 b(M.)f(Kazic)i +(\(1980\))e(:)16 b Fm(The)c(Chess)g(Comp)n(etitor's)f(Handb)n(o)n(ok.)h +Fp(Batsford)f(Bo)q(oks,)388 1104 y(London.)303 1184 y([33])19 +b(D.)9 b(E.)h(Kn)o(uth)g(and)f(R.)g(W.)f(Mo)q(ore)i(\(1975\))f(:)16 +b Fm(A)o(n)11 b(analysis)g(of)g(alpha-b)n(eta)g(pruning.)388 +1234 y Fp(Arti\014cial)j(In)o(telligence,)f(V)m(ol)g(6)h(No)f(4,)g(pp)h +(293-326.)303 1313 y([34])19 b(D.)11 b(Kop)q(ec,)h(M.)e(Newb)q(orn)i(and)f +(W.)f(Y)m(u)h(\(1986\))f(:)17 b Fm(Exp)n(eriments)12 b(in)h(Chess)f(Co)n +(gni-)388 1363 y(tion.)d Fp(Adv)n(ances)i(in)e(Computer)f(Chess)j(4,)e(D.)g +(F.)g(Beal)g(\(ed\),)i(pp)e(59-79.)f(P)o(ergamon)388 1413 y(Press,)15 +b(Oxford.)303 1493 y([35])k(A.)e(Kotok)h(\(1962\))e(:)25 b +Fm(A)18 b(Chess)h(Playing)f(Pr)n(o)n(gr)n(am)f(for)h(the)g(IBM)h(7090.)f +Fp(B.Sc.)388 1543 y(Thesis,)c(MIT.)303 1622 y([36])19 b(D.)13 +b(Levy)h(\(1976\))g(:)k Fm(Chess)c(and)i(Computers.)d Fp(Batsford)i(Bo)q +(oks,)e(London.)303 1702 y([37])19 b(D.)c(Levy)h(\(1979\))g(:)22 +b Fm(Chess)16 b(Pr)n(o)n(gr)n(amming.)f Fp(P)o(ersonal)h(Computer)f(W)m +(orld,)g(Ma)o(y)388 1752 y(1979,)e(pp)h(25-27.)303 1831 y([38])19 +b(D.)12 b(Levy)m(,)g(D.)f(Brough)o(ton,)h(M.)g(T)m(a)o(ylor)f(\(1989\))h(:)17 +b Fm(The)c(SEX)h(A)o(lgorithm)e(in)i(Com-)388 1881 y(puter)h(Chess.)f +Fp(ICCA)g(Journal,)f(V)m(ol)f(12)i(No)g(1,)f(pp)h(10-21.)303 +1961 y([39])19 b(T.)f(A.)f(Marsland)h(\(1985\))f(:)26 b Fm(Evaluation)19 +b(F)m(unction)g(F)m(actors.)e Fp(ICCA)h(Journal,)388 2011 y(V)m(ol)13 +b(8)h(No)f(2,)h(pp)g(47-57.)303 2090 y([40])19 b(T.)10 b(A.)f(Marsland)h +(\(1986\))f(:)16 b Fm(A)c(R)n(eview)f(of)g(Game-T)m(r)n(e)n(e)f(Pruning.)g +Fp(ICCA)g(Journal,)388 2140 y(V)m(ol)j(9)h(No)f(1,)h(pp)g(3-19.)303 +2220 y([41])19 b(T.)10 b(A.)f(Marsland)g(\(1990\))g(:)16 b +Fm(The)11 b(Br)n(atko-Kop)n(e)n(c)g(T)m(est)g(R)n(evisite)n(d.)e +Fp(ICCA)g(Journal,)388 2270 y(V)m(ol)k(13,)g(No)h(1,)f(pp)h(15-19.)303 +2350 y([42])19 b(A.)12 b(New)o(ell,)f(J.)h(C.)f(Sha)o(w)g(and)h(H.)f(A.)h +(Simon)d(\(1958\))i(:)17 b Fm(Chess)c(Playing)g(Pr)n(o)n(gr)n(ams)388 +2399 y(and)k(the)e(Pr)n(oblem)h(of)f(Complexity.)f Fp(IBM)h(Journal)g(of)f +(Researc)o(h)i(and)e(Dev)o(elop-)388 2449 y(men)o(t,)f(Oct)i(1958,)d(pp)i +(320-335.)946 2574 y(172)p eop +%%Page: 173 175 +173 174 bop 303 307 a Fp([43])19 b(A.)13 b(Nimzo)o(witsc)o(h)f(\(1929\))g(:) +18 b Fm(My)c(System.)f Fp(Mo)q(dern)h(Chess)g(Masterpieces,)h(Bats-)388 +357 y(ford)f(Bo)q(oks,)g(London.)303 440 y([44])19 b(A.)11 +b(Nimzo)o(witsc)o(h)f(\(1936\))g(:)17 b Fm(Chess)12 b(Pr)n(axis.)f +Fp(Batsford)g(Chess)i(Classics,)e(Batsford)388 490 y(Bo)q(oks,)j(London.)303 +573 y([45])19 b(T.)c(Nitsc)o(he)h(\(1982\))e(:)20 b Fm(A)c(L)n(e)n(arning)f +(Chess)h(Pr)n(o)n(gr)n(am.)e Fp(Adv)n(ances)i(in)e(Computer)388 +623 y(Chess)h(3,)f(M.)f(Clark)o(e)h(\(ed\),)g(pp)g(113-120.)d(P)o(ergamon)i +(Press,)i(Oxford.)303 706 y([46])k(A.)f(Reinefeld)f(\(1983\))g(:)25 +b Fm(A)o(n)18 b(Impr)n(ovement)h(of)f(the)g(Sc)n(out)h(T)m(r)n(e)n(e-Se)n(ar) +n(ch)e(A)o(lgo-)388 756 y(rithm.)c Fp(ICCA)h(Journal,)f(V)m(ol)g(6)h(No)f(4,) +g(pp)h(4-14.)303 839 y([47])19 b(F.)14 b(Rein\014eld)f(\(1945\))h(:)j +Fm(Win)f(A)o(t)e(Chess.)g Fp(Do)o(v)o(er)f(Bo)q(oks.)303 922 +y([48])19 b(A.)h(L.)e(Sam)o(uels)h(\(1959\))f(:)30 b Fm(Some)20 +b(Studies)h(in)f(Machine)h(L)n(e)n(arning)f(using)h(the)388 +971 y(Game)f(of)f(Che)n(ckers.)e Fp(IBM)i(Journal)f(of)g(Researc)o(h)h(and)f +(Dev)o(elopmen)o(t,)g(3,)h(pp)388 1021 y(211-229.)303 1104 +y([49])g(A.)h(L.)e(Sam)o(uels)h(\(1967\))f(:)30 b Fm(Some)20 +b(Studies)h(in)f(Machine)h(L)n(e)n(arning)f(using)h(the)388 +1154 y(Game)d(of)f(Che)n(ckers,)g(II)g(-)g(R)n(e)n(c)n(ent)g(Pr)n(o)n(gr)n +(ess.)e Fp(IBM)i(Journal)f(of)f(Researc)o(h)j(and)388 1204 +y(Dev)o(elopmen)o(t,)13 b(V)m(ol)f(2)i(No)g(6,)f(pp)h(601-617.)303 +1287 y([50])19 b(J.)14 b(Sc)o(hae\013er)h(\(1983\))e(:)18 b +Fm(The)d(History)f(Heuristic.)f Fp(ICCA)h(Journal,)f(V)m(ol)g(6,)g(No)g(3,) +388 1337 y(pp)h(16-19.)303 1420 y([51])19 b(J.)12 b(Sc)o(hae\013er)h +(\(1984\))e(:)17 b Fm(The)c(R)n(elative)f(Imp)n(ortanc)n(e)h(of)g(Know)r(le)n +(dge.)f Fp(ICCA)f(Jour-)388 1469 y(nal,)i(V)m(ol)g(7)g(No)h(3,)f(pp)h +(138-145.)303 1553 y([52])19 b(G.)14 b(Sc)o(hrufer)i(\(1989\))e(:)20 +b Fm(A)15 b(Str)n(ate)n(gic)g(Quiesc)n(enc)n(e)h(Se)n(ar)n(ch.)f +Fp(ICCA)g(Journal,)f(V)m(ol)388 1602 y(12)g(No)f(1,)h(pp)g(3-9.)303 +1685 y([53])19 b(C.)f(E.)g(Shannon)g(\(1950\))g(:)27 b Fm(Pr)n(o)n(gr)n +(amming)18 b(a)i(Computer)e(for)h(Playing)g(Chess.)388 1735 +y Fp(Philosophical)13 b(Mag,)g(V)m(ol)g(41,)f(pp)i(256-275.)303 +1818 y([54])19 b(A.)12 b(Shapiro)f(and)g(T.)g(Niblett)h(\(1982\))f(:)17 +b Fm(A)o(utomatic)12 b(Induction)i(of)f(Classi\014c)n(ation)388 +1868 y(R)o(ules)j(for)e(a)i(Chess)f(Endgame.)g Fp(Adv)n(ances)g(in)f +(Computer)f(Chess)j(3,)d(M.)h(Clark)o(e)388 1918 y(\(ed\),)h(pp)e(73-91.)g(P) +o(ergamon)f(Press,)j(Oxford.)303 2001 y([55])k(H.)14 b(A.)f(Simon)f(and)i(K.) +f(A.)h(Gilmartin)d(\(1973\))i(:)18 b Fm(A)c(Simulation)h(of)g(Memory)g(for) +388 2051 y(Chess)g(Positions.)f Fp(Cognitiv)o(e)f(Psyc)o(hology)m(,)f(5,)h +(pp)h(29-46.)303 2134 y([56])19 b(H.)10 b(A.)f(Simon)f(and)h(W.)g(G.)g(Chase) +i(\(1973\))e(:)15 b Fm(Skil)r(l)c(in)g(Chess.)f Fp(American)f(Scien)o(tist,) +388 2183 y(61,)k(pp)h(394-403.)303 2267 y([57])19 b(S.)f(S.)f(Skiena)h +(\(1986\))g(:)26 b Fm(A)o(n)19 b(Overview)e(of)i(Machine)g(L)n(e)n(arning)g +(in)g(Computer)388 2316 y(Chess.)14 b Fp(ICCA)g(Journal,)f(V)m(ol)g(9)g(No)h +(1,)f(pp)h(20-27.)303 2399 y([58])19 b(D.)c(J.)g(Slate)g(\(1987\))g(:)21 +b Fm(A)16 b(Chess)g(Pr)n(o)n(gr)n(am)f(that)h(uses)h(its)e(T)m(r)n(ansp)n +(osition)h(T)m(able)388 2449 y(to)f(L)n(e)n(arn)g(fr)n(om)f(Exp)n(erienc)n +(e.)g Fp(ICCA)g(Journal,)f(V)m(ol)g(10)g(No)h(2,)f(pp)h(59-71.)946 +2574 y(173)p eop +%%Page: 174 176 +174 175 bop 303 307 a Fp([59])19 b(E.)i(Slater)g(\(1950\))f(:)32 +b Fm(Statistics)20 b(for)h(the)g(Chess)h(Computer)f(and)h(the)f(F)m(actor)388 +357 y(of)e(Mobility.)d Fp(Symp)q(osium)f(on)i(Information)e(Theory)m(,)j +(London)f(:)26 b(Ministry)17 b(of)388 407 y(Supply)m(,)c(pp)h(150-152.)303 +490 y([60])19 b(A.)11 b(M.)h(T)m(uring)e(\(1950\))h(:)17 b +Fm(Computing)c(Machinery)g(and)g(Intel)r(ligenc)n(e.)f Fp(Mind,)f(V)m(ol)388 +540 y(59,)i(pp)h(433-460.)303 623 y([61])19 b(D.)g(E.)f(Wilkins)g(\(1980\))g +(:)28 b Fm(Using)20 b(Patterns)f(and)h(Plans)g(in)g(Chess.)e +Fp(Arti\014cial)388 672 y(In)o(telligence,)c(V)m(ol)f(14,)g(No)g(1,)h(pp)f +(165-203.)303 756 y([62])19 b(B.)14 b(H.)g(W)m(o)q(o)q(d)e(\(1986\))i(:)k +Fm(The)c(World)h(Chess)g(Championship.)f Fp(Chess)h(Magazine,)388 +805 y(B.)f(H.)g(W)m(o)q(o)q(d)f(\(ed\),)h(August)g(-)g(No)o(v)o(em)o(b)q(er)f +(86,)g(V)m(ol)g(51,)f(Nos)j(987-994.)303 888 y([63])k(A.)f(L.)e(Zobrist)i +(\(1970\))f(:)25 b Fm(A)19 b(Hashing)f(Metho)n(d)h(with)f(Applic)n(ations)g +(for)f(Game)388 938 y(Playing.)d Fp(T)m(ec)o(hnical)f(rep)q(ort)i(88,)e +(Computer)g(Sciences)i(Dept,)f(Univ)f(of)g(Wiscon-)388 988 +y(sin,)h(Madison)f(WI,)g(April)g(1970.)303 1071 y([64])19 b(A.L.)f(Zobrist)h +(and)f(F.)h(R.)e(Carlson,)i(Jr)g(\(1973\))f(:)27 b Fm(A)o(n)19 +b(A)n(dvic)n(e{T)m(aking)h(Chess)388 1121 y(Computer.)14 b +Fp(Scien)o(ti\014c)g(American,)f(228,)f(pp)i(92-105.)946 2574 +y(174)p eop +%%Page: 175 177 +175 176 bop 262 654 a Fn(App)s(endix)33 b(A)262 897 y Fo(Glossary)321 +1120 y Fl(ABF)254 b(A)p Fp(v)o(erage)14 b Fl(B)p Fp(ranc)o(hing)g +Fl(F)p Fp(actor.)321 1220 y Fl(AI)300 b Fp(Arti\014cial)13 +b(In)o(telligence.)321 1320 y Fl(ELO)258 b Fp(A)14 b(c)o(hess)h(rating)f +(system)f(used)i(b)o(y)f(the)g(w)o(orld)f(c)o(hess)j(federation.)321 +1419 y Fl(en-prise)187 b Fp(A)14 b(piece)h(is)e Fm(en-prise)h +Fp(if)f(it)h(can)g(b)q(e)g(pro\014tably)g(captured.)321 1519 +y Fl(HIAR)o(CS)167 b(H)p Fp(igher)14 b Fl(I)p Fp(n)o(telligence)g +Fl(A)p Fp(uto)g Fl(R)p Fp(esp)q(onse)i Fl(C)p Fp(hess)f Fl(S)p +Fp(ystem.)321 1619 y Fl(ply)288 b Fp(One)15 b(half)d(mo)o(v)o(e)h(e.g.)k(a)d +(mo)o(v)o(e)e(for)i(white.)321 1718 y Fl(P)o(osition)o(al)e(Pla)o(y)39 +b Fp(The)14 b(mano)q(euv)o(ering)f(of)g(pieces)i(to)f(b)q(etter)h(squares.) +321 1818 y Fl(Pc/Sq)g(table)104 b Fp(Piece)15 b(Square)f(T)m(able.)321 +1918 y Fl(PVS)258 b(P)p Fp(rinciple)13 b Fl(V)p Fp(ariation)g +Fl(S)p Fp(earc)o(h.)321 2017 y Fl(T)l(actical)i(Pla)o(y)81 +b Fp(Sequence)16 b(of)d(threat)i(and)e(capture)i(t)o(yp)q(e)g(mo)o(v)o(es.) +321 2117 y Fl(T)l(emp)q(o)211 b Fp(A)14 b(single)f(mo)o(v)o(e)g(as)h(a)f +(unit)h(of)f(time)g(in)g(c)o(hess,)i(e.g.)j(the)c(loss)g(of)f(a)h(temp)q(o) +675 2167 y(w)o(ould)f(b)q(e)h(caused)h(b)o(y)f(taking)f(t)o(w)o(o)h(mo)o(v)o +(es)e(to)i(accomplish)e(something)675 2216 y(whic)o(h)i(could)f(b)q(e)i(ac)o +(hiev)o(ed)f(in)f(one)i(mo)o(v)o(e.)321 2316 y Fl(USCF)226 +b(U)p Fp(nited)14 b Fl(S)p Fp(tates)g Fl(C)p Fp(hess)i Fl(F)p +Fp(ederation)e(rating)f(system.)18 b(Ratings)675 2366 y(on)c(this)g(scale)g +(are)g(t)o(ypically)f(100-150)f(p)q(oin)o(ts)i(higher)g(than)f(the)675 +2416 y(equiv)n(alen)o(t)g(ELO)h(rating,)f(e.g.)18 b(2100)13 +b(USCF)h Ff(\031)g Fp(2000)f(ELO.)946 2574 y(175)p eop +%%Page: 176 178 +176 177 bop 262 654 a Fn(App)s(endix)33 b(B)262 897 y Fo(Pseudo)40 +b(F)-10 b(unctions)262 1148 y Fp(This)15 b(app)q(endix)g(con)o(tains)h(a)f +(description)h(of)e(the)i(pseudo)h(functions)e(used)h(in)f(the)h(de\014-)262 +1198 y(nition)11 b(of)h(m)o(y)f(ev)n(aluation)g(function.)18 +b(The)13 b(functions)f(are)h(giv)o(en)f(in)h(alphab)q(etical)e(order.)946 +2574 y(176)p eop +%%Page: 177 179 +177 178 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(A)n(ttac)n(k)n(ed)19 b(:)24 b(PieceList)17 b(x)h(Colour)h(x)f(Square)h +Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 +571 182 2 v 262 660 a Ft(A)o(ttac)o(k)o(ed\(pl,c)o(ol,sq\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g +(if)f(square)i Fm(sq)f Fp(is)f(attac)o(k)o(ed)h(b)o(y)g(an)o(y)g(of)f(the)h +(pieces)h(in)f(piecelist)g Fm(pl)g Fp(of)321 910 y(colour)f +Fm(c)n(ol)p Fp(.)321 960 y(Otherwise)i(F)-5 b(ALSE.)262 1309 +y Fu(FUNCTION)p 262 1316 309 2 v 262 1408 a(A)n(ttac)n(king)18 +b(:)25 b(Piece)17 b(x)i(Colour)g(x)f(Square)g(x)g(Square)g +Ft(=)-8 b Fa(\))19 b Fu(Bo)r(olean)262 1508 y Fl(Example)p +262 1523 182 2 v 262 1612 a Ft(A)o(ttac)o(king\(p)q(c,col,sq1,sq2\))262 +1711 y Fl(Descripti)o(on)p 262 1726 241 2 v 321 1812 a Fp(Returns)14 +b(TR)o(UE)g(if)f(piece)i Fm(p)n(c)f Fp(of)f(colour)h Fm(c)n(ol)f +Fp(on)h(square)h Fm(sq1)f Fp(is)f(attac)o(king)h(square)g Fm(sq2)p +Fp(.)321 1862 y(Otherwise)h(F)-5 b(ALSE.)946 2574 y(177)p eop +%%Page: 178 180 +178 179 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a Fs(])p Fu(A)n(ttac)n(ks)19 b(:)24 b(PieceList)17 b(x)h(Colour)h(x)f(Square) +g Ft(=)-8 b Fa(\))19 b Fu(In)n(teger)262 556 y Fl(Example)p +262 571 182 2 v 262 660 a Fs(])p Ft(A)o(ttac)o(ks\(pl,col,sq\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)14 +b(the)h(n)o(um)o(b)q(er)e(of)g(attac)o(ks)h(on)g(square)h Fm(sq)f +Fp(b)o(y)f(an)o(y)h(of)f(the)i(pieces)g(in)e(piecelist)h Fm(pl)321 +910 y Fp(of)f(colour)g Fm(c)n(ol)p Fp(.)262 1259 y Fu(FUNCTION)p +262 1266 309 2 v 262 1359 a(Bishop)18 b(:)24 b(Colour)19 b(x)g(Colour)f +Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 1458 y Fl(Example)p +262 1473 182 2 v 262 1562 a Ft(Bishop\(col1,col2\))262 1661 +y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(TR)o(UE)g(if)f +(colour)h Fm(c)n(ol1)f Fp(still)g(has)h(a)g(bishop)g(whic)o(h)f(op)q(erates)j +(on)d(squares)i(of)321 1812 y(colour)e Fm(c)n(ol2)p Fp(.)946 +2574 y(178)p eop +%%Page: 179 181 +179 180 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(Castled)18 b(:)25 b(Colour)18 b Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 +556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(Castled\(col\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g +(if)f(colour)h Fm(c)n(ol)f Fp(has)h(castled.)19 b(Otherwise)c(F)-5 +b(ALSE.)262 1060 y Fu(FUNCTION)p 262 1067 309 2 v 262 1159 +a(Cen)n(tralP)n(oin)n(t)19 b(:)24 b(Square)19 b Ft(=)-8 b Fa(\))18 +b Fu(Square)262 1259 y Fl(Example)p 262 1274 182 2 v 262 1363 +a Ft(Cen)o(tralP)o(oin)o(t\(sq\))262 1462 y Fl(Descripti)o(on)p +262 1477 241 2 v 321 1563 a Fp(Returns)c(an)g(o\013set)h(square,)f +Fm(csq)g Fp(whic)o(h)g(represen)o(ts)i(the)f(cen)o(tral)f(p)q(oin)o(t)f(of)h +(the)g(defensiv)o(e)321 1613 y(kings)f(p)q(osition.)k(Returns)e +Fm(csq)f Fp(where)380 1713 y(csq)g(=)g(sq)380 1762 y Fl(if)e +Fp(\(OnRank\(sq\))i(=)h(1\))439 1812 y(csq)f(=)g(csq)h(+)f(8)380 +1862 y Fl(else)439 1912 y(if)e Fp(\(OnRank\(sq\))j(=)f(8\))498 +1962 y(csq)g(=)g(csq)h(-)f(8)439 2012 y Fl(endif)380 2061 y(endif)380 +2111 y(if)e Fp(\(OnFile\(sq\))j(=)f(1\))439 2161 y(csq)g(=)g(csq)h(+)f(1)380 +2211 y Fl(else)439 2261 y(if)e Fp(\(OnFile\(sq\))j(=)f(8\))498 +2310 y(csq)g(=)g(csq)h(-)f(1)439 2360 y Fl(endif)380 2410 y(endif)946 +2574 y Fp(179)p eop +%%Page: 180 182 +180 181 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(Con)n(trol)19 b(:)24 b(Square)18 b Ft(=)-8 b Fa(\))18 b Fu(Con)n(troller) +262 556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(Con)o(trol\(sq\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h(con)o +(troller)f(of)f(square)i Fm(sq)p Fp(.)j(The)c(con)o(troller)g(is)g(de\014ned) +h(to)e(b)q(e)i(the)321 910 y(colour)e(who)h(attac)o(ks)g(the)h(square)f +Fm(sq)g Fp(with)g(more)f(pieces)i(of)e(a)h(sp)q(eci\014c)h(t)o(yp)q(e)f(than) +321 960 y(the)g(opp)q(onen)o(t)g(and)g(the)g(n)o(um)o(b)q(er)g(of)f(all)g +(other)h(attac)o(ks)g(b)o(y)g(lo)o(w)o(er)f(v)n(alued)h(pieces)321 +1010 y(are)g(equal.)321 1060 y(A)o(ttac)o(ks)g(are)g(compared)g(in)f(the)h +(order)h(:)j(P)m(,N,B,R,Q,K.)12 b(If)h(all)g(attac)o(ks)h(b)o(y)g(eac)o(h)321 +1110 y(piece)g(are)h(equal)e(in)h(n)o(um)o(b)q(er)f(then)h(the)h(con)o +(troller)f(is)f('None'.)262 1408 y Fu(FUNCTION)p 262 1415 309 +2 v 262 1508 a Fs(])p Fu(Di\013A)n(ttac)n(ks)18 b(:)24 b(Colour)19 +b(x)g(Square)f Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1608 +y Fl(Example)p 262 1622 182 2 v 262 1711 a Fs(])p Ft(Di\013A)o(ttac)o +(ks\(col,sq\))262 1811 y Fl(Descripti)o(on)p 262 1826 241 2 +v 321 1912 a Fp(Returns)c(:)k Fh(])p Fp(A)o(ttac)o(ks\([An)o(y],col,sq\))13 +b Ff(\000)p Fh(])p Fp(A)o(ttac)o(ks\([An)o(y],Opp\(col\),sq\))946 +2574 y(180)p eop +%%Page: 181 183 +181 182 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(Distance)17 b(:)25 b(Square)18 b(x)g(Square)h Ft(=)-8 b Fa(\))18 +b Fu(In)n(teger)262 556 y Fl(Example)p 262 571 182 2 v 262 +660 a Ft(Distance\(sq1,sq2\))262 759 y Fl(Descripti)o(on)p +262 774 241 2 v 321 860 a Fp(Returns)c(:)380 910 y(max\()p +Ff(j)d Fp(OnRank\(white,)p Fm(sq1)p Fp(\))j(-)g(OnRank\(white,)p +Fm(sq2)p Fp(\))g Ff(j)f Fp(,)g Ff(j)h Fp(OnFile\()p Fm(sq1)p +Fp(\))g(-)g(OnFile\()p Fm(sq2)p Fp(\))g Ff(j)f Fp(\))262 1259 +y Fu(FUNCTION)p 262 1266 309 2 v 262 1359 a(Doubled)18 b(:)24 +b(Colour)19 b(x)f(File)g Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 +1458 y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(Doubled\(col,f)s(\))262 +1661 y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(TR)o(UE)g +(if)f(more)g(than)h(one)g(pa)o(wn)f(of)h(colour)f Fm(c)n(ol)h +Fp(is)g(on)f(\014le)h Fm(f)p Fp(.)321 1812 y(Otherwise)h(F)-5 +b(ALSE.)946 2574 y(181)p eop +%%Page: 182 184 +182 183 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(Escap)r(e)17 b(:)25 b(Colour)19 b(x)f(Square)g(x)g(Square)h +Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 +571 182 2 v 262 660 a Ft(Escap)q(e\(col,sq1,sq2\))262 759 y +Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f +(the)h(king)g(of)f(colour)g Fm(c)n(ol)h Fp(can)g(escap)q(e)i(a)d(c)o(hec)o(k) +i(from)d(square)j Fm(sq2)321 910 y Fp(b)o(y)e(a)h(piece)h(mo)o(v)o(ed)d(from) +g(square)j Fm(sq1)p Fp(.)262 1259 y Fu(FUNCTION)p 262 1266 +309 2 v 262 1359 a(Has)j(:)25 b(PieceList)17 b(x)h(Colour)h +Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1458 y Fl(Example)p +262 1473 182 2 v 262 1562 a Ft(Has\(pl,col\))262 1661 y Fl(Descripti)o(on)p +262 1676 241 2 v 321 1762 a Fp(Returns)c(the)h(n)o(um)o(b)q(er)e(of)g(pieces) +i(in)f(piecelist)g Fm(pl)g Fp(of)f(colour)h Fm(c)n(ol)f Fp(whic)o(h)h(are)g +(still)321 1812 y(on)f(the)i(b)q(oard.)946 2574 y(182)p eop +%%Page: 183 185 +183 184 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(InsideQuadrate)18 b(:)24 b(Colour)19 b(x)f(Square)g Ft(=)-8 +b Fa(\))19 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182 +2 v 262 660 a Ft(InsideQuadrate\(col,sq\))262 759 y Fl(Descripti)o(on)p +262 774 241 2 v 321 860 a Fp(Returns)14 b(TR)o(UE)g(if)f(the)h(king)g(of)f +(colour)g Fm(c)n(ol)h Fp(is)g(inside)g(the)g("queening)g(square")g(or)321 +910 y("quadrate")f(with)h(resp)q(ect)i(to)e(square)g Fm(sq)p +Fp(,)g(taking)f(in)o(to)g(accoun)o(t)h(who)g(has)g(the)321 +960 y(\014rst)g(mo)o(v)o(e.)262 1309 y Fu(FUNCTION)p 262 1316 +309 2 v 262 1408 a(Isolated)j(:)25 b(Colour)19 b(x)f(File)g +Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 1508 y Fl(Example)p +262 1523 182 2 v 262 1612 a Ft(Isolated\(col,f)s(\))262 1711 +y Fl(Descripti)o(on)p 262 1726 241 2 v 321 1812 a Fp(Returns)c(TR)o(UE)g(if)f +(there)i(do)q(es)g(not)f(exist)g(a)f(pa)o(wn)h(of)f(colour)h +Fm(c)n(ol)g Fp(on)f(either)i(\014le)321 1862 y(adjacen)o(t)f(to)f(\014le)h +Fm(f)p Fp(.)321 1912 y(Otherwise)h(F)-5 b(ALSE.)946 2574 y(183)p +eop +%%Page: 184 186 +184 185 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(K)n(CRigh)n(ts)19 b(:)24 b(Colour)19 b Ft(=)-8 b Fa(\))18 +b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182 2 v 262 +660 a Ft(K)o(CRigh)o(ts\(col\))262 759 y Fl(Descripti)o(on)p +262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(king)g(side)h(castling) +g(righ)o(ts)g(for)f(colour)h Fm(c)n(ol)f Fp(are)i(in)o(tact.)321 +910 y(Otherwise)g(F)-5 b(ALSE.)262 1259 y Fu(FUNCTION)p 262 +1266 309 2 v 262 1359 a(KingDistance)17 b(:)25 b(Square)18 +b(x)g(Square)g Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1458 +y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(KingDistance\(sq1,sq2\))262 +1661 y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(:)380 +1812 y(min\()p Ff(j)d Fp(OnRank\(white,)p Fm(sq1)p Fp(\))j(-)g +(OnRank\(white,)p Fm(sq2)p Fp(\))f Ff(j)h Fp(,)f Ff(j)h Fp(OnFile\()p +Fm(sq1)p Fp(\))g(-)g(OnFile\()p Fm(sq2)p Fp(\))g Ff(j)f Fp(\))946 +2574 y(184)p eop +%%Page: 185 187 +185 186 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(KingSq)18 b(:)24 b(Colour)19 b Ft(=)-8 b Fa(\))18 b Fu(square)262 +556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(KingSq\(col\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h +(square)f(the)h(king)e(of)g(colour)h Fm(c)n(ol)g Fp(is)f(curren)o(tly)i(on.) +262 1209 y Fu(FUNCTION)p 262 1216 309 2 v 262 1309 a(Lev)n(erSq)i(:)24 +b(File)18 b(x)g(Colour)h Ft(=)-8 b Fa(\))18 b Fu(Square)262 +1408 y Fl(Example)p 262 1423 182 2 v 262 1512 a Ft(Lev)o(erSq\(f,col\))262 +1612 y Fl(Descripti)o(on)p 262 1626 241 2 v 321 1713 a Fp(Returns)c(the)h +(\014rst)f(square)h(where)g(a)f(pa)o(wn)f(of)h(colour)f Fm(c)n(ol)h +Fp(on)g(\014le)f Fm(f)h Fp(w)o(ould)f(lev)o(er)h(an)g(enem)o(y)321 +1762 y(pa)o(wn)f(on)h(an)f(adjacen)o(t)h(\014le.)946 2574 y(185)p +eop +%%Page: 186 188 +186 187 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a Fs(])p Fu(Mo)n(v)n(es)18 b(:)25 b(Piece)18 b(x)g(Colour)h(x)f(Square)g +Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 556 y Fl(Example)p 262 +571 182 2 v 262 660 a Fs(])p Ft(Mo)o(v)o(es\(p)q(c,col,sq\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h(n)o +(um)o(b)q(er)e(of)g(mo)o(v)o(es)g(p)q(ossible)h(b)o(y)g(piece)g +Fm(p)n(c)g Fp(of)g(colour)f Fm(c)n(ol)h Fp(from)e(square)j +Fm(sq)p Fp(.)262 1209 y Fu(FUNCTION)p 262 1216 309 2 v 262 +1309 a(Occupied)j(:)24 b(Square)18 b(x)h(Square)f Ft(=)-8 b +Fa(\))18 b Fu(In)n(teger)262 1408 y Fl(Example)p 262 1423 182 +2 v 262 1512 a Ft(Occupied\(sq1,sq2\))262 1612 y Fl(Descripti)o(on)p +262 1626 241 2 v 321 1713 a Fp(Returns)c(the)h(n)o(um)o(b)q(er)e(of)g +(squares)i(whic)o(h)f(are)g(o)q(ccupied)h(b)q(et)o(w)o(een)g(square)g +Fm(sq1)f Fp(and)321 1762 y Fm(sq2)g Fp(inclusiv)o(e)f(in)h(one)g(linear)f +(direction.)946 2574 y(186)p eop +%%Page: 187 189 +187 188 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(Occup)n(y)18 b(:)25 b(PieceList)17 b(x)h(Colour)h(x)f(Square)g +Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 +571 182 2 v 262 660 a Ft(Occup)o(y\(pl,col,sq\))262 759 y Fl(Descripti)o(on)p +262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(one)h(of)f(the)i +(pieces)g(in)e(piecelist)i Fm(pl)e Fp(of)h(colour)f Fm(c)n(ol)h +Fp(is)g(on)f(square)i Fm(sq)p Fp(.)321 910 y(Otherwise)g(F)-5 +b(ALSE.)262 1259 y Fu(FUNCTION)p 262 1266 309 2 v 262 1359 +a(On)18 b(:)25 b(Square)18 b Ft(=)-8 b Fa(\))18 b Fu(Piece)262 +1458 y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(On\(sq\))262 +1661 y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(the)h +(piece)g(t)o(yp)q(e)f(o)q(ccup)o(ying)g(square)h Fm(sq)e Fp(regardless)j(of)d +(colour.)946 2574 y(187)p eop +%%Page: 188 190 +188 189 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(OnFile)17 b(:)25 b(Square)18 b Ft(=)-8 b Fa(\))18 b Fu(File)262 +556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(OnFile\(sq\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h +(\014le)f(of)f(square)i Fm(sq)p Fp(.)262 1209 y Fu(FUNCTION)p +262 1216 309 2 v 262 1309 a(OnRank)j(:)25 b(Colour)18 b(x)h(Square)f +Ft(=)-8 b Fa(\))18 b Fu(Rank)262 1408 y Fl(Example)p 262 1423 +182 2 v 262 1512 a Ft(OnRank\(col,sq\))262 1612 y Fl(Descripti)o(on)p +262 1626 241 2 v 321 1713 a Fp(Returns)c(the)h(rank)f(of)f(square)i +Fm(sq)e Fp(with)h(resp)q(ect)i(to)e(colour)g Fm(c)n(ol)p Fp(.)946 +2574 y(188)p eop +%%Page: 189 191 +189 190 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(OnWing)18 b(:)24 b(Flank)19 b(x)f(Square)g Ft(=)-8 b Fa(\))19 +b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182 2 v 262 +660 a Ft(OnWing\(\015k,sq\))262 759 y Fl(Descripti)o(on)p 262 +774 241 2 v 321 860 a Fp(Returns)14 b(TR)o(UE)g(if)f(square)i +Fm(sq)f Fp(is)f(on)h(\015ank)g Fm(\015k)p Fp(.)321 910 y(Otherwise)h(F)-5 +b(ALSE.)262 1259 y Fu(FUNCTION)p 262 1266 309 2 v 262 1359 +a(Op)r(en)18 b(:)24 b(File)18 b Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 +1458 y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(Op)q(en\(f)s(\))262 +1661 y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(TR)o(UE)g +(if)f(\014le)h Fm(f)f Fp(has)h(no)g(pa)o(wns)g(of)f(an)o(y)h(colour)f(on)h +(it.)321 1812 y(Otherwise)h(F)-5 b(ALSE.)946 2574 y(189)p eop +%%Page: 190 192 +190 191 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(Opp)19 b(:)24 b(Colour)19 b Ft(=)-8 b Fa(\))18 b Fu(Colour)262 +556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(Opp\(col\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h(opp)q +(osite)f(colour)g(of)f(colour)h Fm(c)n(ol)p Fp(.)262 1209 y +Fu(FUNCTION)p 262 1216 309 2 v 262 1309 a(Opp)r(ositeFlanks)j(:)24 +b Ft(=)-8 b Fa(\))19 b Fu(Bo)r(olean)262 1408 y Fl(Example)p +262 1423 182 2 v 262 1509 a Ft(Opp)q(ositeFlanks)262 1609 y +Fl(Descripti)o(on)p 262 1624 241 2 v 321 1710 a Fp(Returns)14 +b(:)380 1760 y(\(\(OnFile\(KingSq\(White\)\))g Ff(\024)g Fp(3)f +Fl(and)h Fp(OnFile\(KingSq\(Blac)o(k\)\))f Ff(\025)i Fp(5\))e +Fl(or)380 1810 y Fp(\(OnFile\(KingSq\(Blac)o(k\)\))h Ff(\024)g +Fp(3)f Fl(and)g Fp(OnFile\(KingSq\(White\)\))h Ff(\025)g Fp(5\)\))946 +2574 y(190)p eop +%%Page: 191 193 +191 192 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(PSq)18 b(:)25 b(Colour)18 b(x)h(Square)f Ft(=)-8 b Fa(\))18 +b Fu(Square)262 556 y Fl(Example)p 262 571 182 2 v 262 660 +a Ft(PSq\(col,sq\))262 759 y Fl(Descripti)o(on)p 262 774 241 +2 v 321 860 a Fp(Returns)c(the)h(promotion)d(square)i(for)g(a)f(pa)o(wn)h(on) +g(square)g Fm(sq)g Fp(of)f(colour)h Fm(c)n(ol)p Fp(.)262 1209 +y Fu(FUNCTION)p 262 1216 309 2 v 262 1309 a(P)n(assed)19 b(:)25 +b(Colour)18 b(x)h(Square)f Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 +1408 y Fl(Example)p 262 1423 182 2 v 262 1512 a Ft(P)o(assed\(col,sq\))262 +1612 y Fl(Descripti)o(on)p 262 1626 241 2 v 321 1713 a Fp(Returns)c(TR)o(UE)g +(if)f(there)i(do)q(es)g(not)f(exist)g(an)f(enem)o(y)h(pa)o(wn)f(on)h(the)g +(same)f(or)h(adjacen)o(t)321 1762 y(\014le,)f(whic)o(h)h(can)g(hinder)g(the)h +(pa)o(wns)f(adv)n(ance)f(to)h(the)h(promotion)c(square.)946 +2574 y(191)p eop +%%Page: 192 194 +192 193 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(P)n(a)n(wnHole)19 b(:)25 b(Colour)18 b(x)h(Square)f Ft(=)-8 +b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182 +2 v 262 660 a Ft(P)o(a)o(wnHole\(col,sq\))262 759 y Fl(Descripti)o(on)p +262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(square)i +Fm(sq)f Fp(cannot)g(ev)o(er)g(b)q(e)h(attac)o(k)o(ed)f(b)o(y)g(pa)o(wns)g(of) +f(colour)h Fm(c)n(ol)p Fp(.)321 910 y(Otherwise)h(F)-5 b(ALSE.)262 +1259 y Fu(FUNCTION)p 262 1266 309 2 v 262 1359 a(P)n(a)n(wnLev)n(er)19 +b(:)24 b(File)18 b(x)g(Colour)h Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 +1458 y Fl(Example)p 262 1473 182 2 v 262 1562 a Ft(P)o(a)o(wnLev)o +(er\(f,col\))262 1661 y Fl(Descripti)o(on)p 262 1676 241 2 +v 321 1762 a Fp(Returns)c(TR)o(UE)g(if)f(a)h(pa)o(wn)f(of)g(colour)h +Fm(c)n(ol)g Fp(can)g(b)q(e)g(a)g(pa)o(wn)f(lev)o(er)i(on)e(\014le)h +Fm(f)g Fp(and)321 1812 y(incur)g(no)f(enem)o(y)h(pa)o(wn)f(blo)q(c)o(k)n(ade) +h(b)q(efore)g(the)h(pa)o(wn)e(lev)o(erage)i(square.)321 1862 +y(Otherwise)g(F)-5 b(ALSE.)946 2574 y(192)p eop +%%Page: 193 195 +193 194 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a Fs(])p Fu(P)n(a)n(wns)20 b(:)25 b Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 +556 y Fl(Example)p 262 571 182 2 v 262 657 a Fs(])p Ft(P)o(a)o(wns)262 +757 y Fl(Descripti)o(on)p 262 772 241 2 v 321 858 a Fp(Returns)c(the)h(n)o +(um)o(b)q(er)e(of)g(pa)o(wns)h(curren)o(tly)h(on)f(the)g(b)q(oard.)262 +1207 y Fu(FUNCTION)p 262 1214 309 2 v 262 1306 a(Pin)k(:)25 +b(Colour)18 b(x)h(Square)f(x)g(Square)g(x)h(Square)f Ft(=)-8 +b Fa(\))18 b Fu(Bo)r(olean)262 1406 y Fl(Example)p 262 1421 +182 2 v 262 1509 a Ft(Pin\(col,sq1,sq2,sq3\))262 1609 y Fl(Descripti)o(on)p +262 1624 241 2 v 321 1710 a Fp(Returns)c(TR)o(UE)g(if)f(a)h(piece)g(of)g +(colour)f Fm(c)n(ol)h Fp(on)g(square)g Fm(sq1)g Fp(pins)g(a)g(piece)h(of)321 +1760 y(colour)e(OPP\(col\))i(on)f(square)g Fm(sq2)g Fp(against)g(a)f(piece)i +(also)e(of)g(colour)h(Opp\(col\))321 1810 y(on)f(square)i Fm(sq3)p +Fp(.)380 1860 y(where)131 b(On\(sq1\))14 b Ff(2)g Fp([Bishop,Ro)q(ok,Queen])e +Fl(and)616 1909 y Fp(On\(sq2\))i Ff(2)g Fp([Knigh)o(t,Bishop,Ro)q(ok,Queen])e +Fl(and)616 1959 y Fp(On\(sq3\))i Ff(2)g Fp([Knigh)o(t,Bishop,Ro)q +(ok,Queen,King].)946 2574 y(193)p eop +%%Page: 194 196 +194 195 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(P)n(oten)n(tialChec)n(k)18 b(:)25 b(Colour)18 b(x)h(Square)f(x)g(Square)g +Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 +571 182 2 v 262 660 a Ft(P)o(oten)o(tialChec)o(k\(col,sq1,sq2\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g +(if)f(a)h(piece)g(of)g(colour)f Fm(c)n(ol)h Fp(on)g(square)g +Fm(sq1)g Fp(can)g(mo)o(v)o(e)f(to)g(square)i Fm(sq2)321 910 +y Fp(and)e(giv)o(e)h(c)o(hec)o(k.)262 1259 y Fu(FUNCTION)p +262 1266 309 2 v 262 1359 a(QCRigh)n(ts)19 b(:)24 b(Colour)19 +b Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 1458 y Fl(Example)p +262 1473 182 2 v 262 1562 a Ft(QCRigh)o(ts\(col\))262 1661 +y Fl(Descripti)o(on)p 262 1676 241 2 v 321 1762 a Fp(Returns)c(TR)o(UE)g(if)f +(queen)i(side)f(castling)f(righ)o(ts)h(for)g(colour)f Fm(c)n(ol)h +Fp(are)g(in)o(tact.)321 1812 y(Otherwise)h(F)-5 b(ALSE.)946 +2574 y(194)p eop +%%Page: 195 197 +195 196 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a Fs(])p Fu(SafeBlo)r(c)n(ks)17 b(:)25 b(Colour)19 b(x)f(Square)g(x)g(Square) +g Ft(=)-8 b Fa(\))19 b Fu(In)n(teger)262 556 y Fl(Example)p +262 571 182 2 v 262 660 a Fs(])p Ft(SafeBlo)q(c)o(ks\(col,sq1,sq2\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)14 +b(the)h(sum)e(of)g(:)380 910 y Fh(])p Fp(Di\013A)o(ttac)o(ks\(col,)p +Fh(sq)719 916 y Fe(n)741 910 y Fp(\))321 960 y(if)g(and)g(only)g(if)g(\()p +Fh(])p Fp(Di\013A)o(ttac)o(ks\(col,)p Fh(sq)923 966 y Fe(n)946 +960 y Fp(\))h Fh(>)g Fp(1\))g(and)f(where)i Fh(sq)1311 966 +y Fe(n)1348 960 y Fp(is)f(ev)o(ery)g(square)321 1010 y(on)f(a)h(piece)h(mo)o +(v)o(emen)o(t)c(direction)j(b)q(et)o(w)o(een)h Fm(sq1)f Fp(and)g +Fm(sq2)g Fp(inclusiv)o(e.)262 1359 y Fu(FUNCTION)p 262 1366 +309 2 v 262 1458 a(SameDiagonal)j(:)24 b(Square)18 b(x)h(Square)f +Ft(=)-8 b Fa(\))18 b Fu(Bo)r(olean)262 1558 y Fl(Example)p +262 1573 182 2 v 262 1661 a Ft(SameDiagonal\(sq1,sq2\))262 +1761 y Fl(Descripti)o(on)p 262 1776 241 2 v 321 1862 a Fp(Returns)c(TR)o(UE)g +(if)f(squares)i Fm(sq1)f Fp(and)g Fm(sq2)g Fp(are)g(on)g(the)g(same)f +(diagonal.)321 1912 y(Otherwise)i(F)-5 b(ALSE.)946 2574 y(195)p +eop +%%Page: 196 198 +196 197 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(SemiOp)r(en)16 b(:)24 b(Colour)19 b(x)f(File)g Ft(=)-8 b +Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182 +2 v 262 660 a Ft(SemiOp)q(en\(col,f)s(\))262 759 y Fl(Descripti)o(on)p +262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(there)i(are)f(no)g(pa)o +(wns)g(of)f(colour)h Fm(c)n(ol)g Fp(on)f(\014le)h Fm(f)p Fp(.)321 +910 y(Otherwise)h(F)-5 b(ALSE.)262 1259 y Fu(FUNCTION)p 262 +1266 309 2 v 262 1359 a(Side)18 b(:)24 b(Square)18 b Ft(=)-8 +b Fa(\))18 b Fu(Colour)262 1458 y Fl(Example)p 262 1473 182 +2 v 262 1562 a Ft(Side\(sq\))262 1661 y Fl(Descripti)o(on)p +262 1676 241 2 v 321 1762 a Fp(Returns)c(the)h(colour)e(whose)i(territory)f +(square)h Fm(sq)f Fp(is)g(in.)321 1812 y(Where)g(eac)o(h)h(colour's)e +(territory)i(is)f(de\014ned)h(to)e(b)q(e)i(within)e(its)h(\014rst)g(4)g +(ranks.)946 2574 y(196)p eop +%%Page: 197 199 +197 198 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(SqColour)18 b(:)24 b(Square)19 b Ft(=)-8 b Fa(\))18 b Fu(Colour)262 +556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(SqColour\(sq\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h +(colour)e(of)h(the)g(square)h Fm(sq)p Fp(.)262 1209 y Fu(FUNCTION)p +262 1216 309 2 v 262 1309 a(T)-5 b(axicab)18 b(:)25 b(Square)18 +b(x)g(Square)g Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1408 +y Fl(Example)p 262 1423 182 2 v 262 1512 a Ft(T)l(axicab\(sq1,sq2\))262 +1612 y Fl(Descripti)o(on)p 262 1626 241 2 v 321 1713 a Fp(Returns)c(:)321 +1762 y(\()p Ff(j)f Fp(OnRank\(white,)p Fm(sq1)p Fp(\))h(-)f(OnRank\(white,)p +Fm(sq2)p Fp(\))h Ff(j)g Fp(+)g Ff(j)f Fp(OnFile\()p Fm(sq1)p +Fp(\))h(-)g(OnFile\()p Fm(sq2)p Fp(\))g Ff(j)p Fp(\))946 2574 +y(197)p eop +%%Page: 198 200 +198 199 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(T)-5 b(rapp)r(ed)18 b(:)25 b(Colour)18 b(x)h(Square)f Ft(=)-8 +b Fa(\))18 b Fu(Bo)r(olean)262 556 y Fl(Example)p 262 571 182 +2 v 262 660 a Ft(T)l(rapp)q(ed\(col,sq\))262 759 y Fl(Descripti)o(on)p +262 774 241 2 v 321 860 a Fp(Returns)c(TR)o(UE)g(if)f(ev)o(ery)i(square,)f +Fm(sq2)p Fp(,)f(a)h(piece)h(on)e(square)i Fm(sq)f Fp(can)g(mo)o(v)o(e)e(to,)i +(meets)f(the)321 910 y(follo)o(wing)e(condition)i(:)380 960 +y(Con)o(trol\(sq2\))g(=)h(Opp\(col\))321 1010 y(Otherwise)h(F)-5 +b(ALSE.)262 1359 y Fu(FUNCTION)p 262 1366 309 2 v 262 1458 +a Fs(])p Fu(UnMo)n(v)n(ed)19 b(:)24 b(Colour)19 b(x)f(Piece)g +Ft(=)-8 b Fa(\))18 b Fu(In)n(teger)262 1558 y Fl(Example)p +262 1573 182 2 v 262 1661 a Fs(])p Ft(UnMo)o(v)o(ed\(col,p)q(c\))262 +1761 y Fl(Descripti)o(on)p 262 1776 241 2 v 321 1862 a Fp(Returns)c(the)h(n)o +(um)o(b)q(er)e(of)g(pieces)i(of)f(colour)f Fm(c)n(ol)h Fp(and)g(t)o(yp)q(e)g +Fm(p)n(c)g Fp(whic)o(h)g(ha)o(v)o(e)g(nev)o(er)g(mo)o(v)o(ed.)946 +2574 y(198)p eop +%%Page: 199 201 +199 200 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(V)-5 b(alue)18 b(:)25 b(Square)18 b Ft(=)-8 b Fa(\))18 b +Fu(In)n(teger)262 556 y Fl(Example)p 262 571 182 2 v 262 660 +a Ft(V)l(alue\(sq\))262 759 y Fl(Descripti)o(on)p 262 774 241 +2 v 321 860 a Fp(Returns)c(a)g(v)n(alue)f(for)h(the)g(piece)h(on)f(square)g +Fm(sq)g Fp(regardless)h(of)f(colour.)321 910 y(De\014ned)g(b)o(y)g(:)380 +960 y(P)o(a)o(wn)77 b(=)14 b(1)380 1010 y(Knigh)o(t)51 b(=)14 +b(3)380 1060 y(Bishop)53 b(=)14 b(3)380 1110 y(Ro)q(ok)81 b(=)14 +b(5)380 1159 y(Queen)63 b(=)14 b(9)380 1209 y(King)89 b(=)14 +b(14)262 1508 y Fu(FUNCTION)p 262 1515 309 2 v 262 1608 a(W)-5 +b(eak)18 b(:)24 b(Colour)19 b(x)f(Square)h Ft(=)-8 b Fa(\))18 +b Fu(Bo)r(olean)262 1707 y Fl(Example)p 262 1722 182 2 v 262 +1811 a Ft(W)l(eak\(col,sq\))262 1910 y Fl(Descripti)o(on)p +262 1925 241 2 v 321 2012 a Fp(Returns)c(:)380 2061 y Fl(not)e +Fp(\()79 b(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,sq\))12 b Fl(or)557 +2111 y Fp(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,)p Fh(sq)972 +2117 y Fe(inf)s(r)q(ont)1090 2111 y Fp(\))i Fl(or)557 2161 +y Fp(A)o(ttac)o(k)o(ed\([P)o(a)o(wn],col,)p Fh(sq)972 2167 +y Fe(behind)1072 2161 y Fp(\))f(\).)946 2574 y(199)p eop +%%Page: 200 202 +200 201 bop 262 357 a Fu(FUNCTION)p 262 364 309 2 v 262 457 +a(Wing)18 b(:)24 b(Square)19 b Ft(=)-8 b Fa(\))18 b Fu(Flank)262 +556 y Fl(Example)p 262 571 182 2 v 262 660 a Ft(Wing\(sq\))262 +759 y Fl(Descripti)o(on)p 262 774 241 2 v 321 860 a Fp(Returns)c(the)h +(\015ank)e(the)i(square)g Fm(sq)e Fp(is)h(on.)946 2574 y(200)p +eop +%%Page: 201 203 +201 202 bop 324 307 a Fp(Pre{De\014ned)15 b(t)o(yp)q(es)g(are)f(as)g(follo)o +(ws)e(:)321 475 y(Bo)q(olean)90 b(:)18 b(TR)o(UE)13 b Ff(j)h +Fp(F)-5 b(ALSE)321 525 y(Colour)113 b(:)18 b(White)13 b Ff(j)h +Fp(Blac)o(k)321 575 y(Con)o(troller)52 b(:)18 b(White)13 b +Ff(j)h Fp(Blac)o(k)g Ff(j)f Fp(None)321 625 y(File)167 b(:)18 +b(Cardinal)13 b(Range)g(1)h(to)f(8)321 675 y(Flank)131 b(:)18 +b(QueenSide)d Ff(j)e Fp(KingSide)321 725 y(In)o(teger)110 b(:)18 +b(In)o(teger)d(Range)321 774 y(Piece)142 b(:)18 b(P)o(a)o(wn)13 +b Ff(j)h Fp(Knigh)o(t)f Ff(j)h Fp(Bishop)g Ff(j)f Fp(Ro)q(ok)g +Ff(j)g Fp(Queen)i Ff(j)f Fp(King)f Ff(j)h Fp(An)o(y)321 824 +y(PieceList)72 b(:)18 b(Set)c(of)g(Piece)321 874 y(Rank)139 +b(:)18 b(Cardinal)13 b(Range)g(1)h(to)f(8)321 924 y(Square)113 +b(:)18 b(Cardinal)13 b(Range)g(1)h(to)f(64)321 1023 y(Note:)18 +b(An)o(y)c(is)g(a)f('wild)g(card')h(piece.)946 2574 y(201)p +eop +%%Page: 202 204 +202 203 bop 262 654 a Fn(App)s(endix)33 b(C)262 897 y Fo(Time)40 +b(Allo)s(catio)q(n)i(Graphs)262 1148 y Fp(This)13 b(app)q(endix)g(con)o +(tains)g(the)g(time)f(allo)q(cation)g(graphs)h(for)g(Kasparo)o(v)g(and)g +(Karp)q(o)o(v)g(in)262 1198 y(their)h(1986)f(w)o(orld)g(c)o(hampionship)f +(matc)o(h.)946 2574 y(202)p eop +%%Page: 203 205 +203 204 bop 526 2156 a Fp(Figure)14 b(C.1:)j(Time)c(Allo)q(cation,)f(Kasparo) +o(v)i(as)g(White.)946 2574 y(203)p eop +%%Page: 204 206 +204 205 bop 532 2156 a Fp(Figure)14 b(C.2:)j(Time)12 b(Allo)q(cation,)g +(Kasparo)o(v)i(as)g(Blac)o(k.)946 2574 y(204)p eop +%%Page: 205 207 +205 206 bop 544 2156 a Fp(Figure)14 b(C.3:)j(Time)c(Allo)q(cation,)f(Karp)q +(o)o(v)i(as)g(White.)946 2574 y(205)p eop +%%Page: 206 208 +206 207 bop 550 2156 a Fp(Figure)14 b(C.4:)j(Time)12 b(Allo)q(cation,)g(Karp) +q(o)o(v)i(as)g(Blac)o(k.)946 2574 y(206)p eop +%%Page: 207 209 +207 208 bop 401 2156 a Fp(Figure)14 b(C.5:)j(Time)c(Allo)q(cation,)f(Kasparo) +o(v)i(and)f(Karp)q(o)o(v)h(Com)o(bined.)946 2574 y(207)p eop +%%Page: 208 210 +208 209 bop 262 654 a Fn(App)s(endix)33 b(D)262 897 y Fo(Bratk)m(o-Kop)s(ec) +40 b(T)-10 b(est)262 1021 y(P)m(ositions)946 2574 y Fp(208)p +eop +%%Page: 209 211 +209 210 bop 641 301 673 5 v 641 965 5 665 v 646 384 a Fg(0j0s0Z0Z)646 +467 y(opZbZRZ0)646 550 y(0Z0l0Zpo)646 633 y(Z0Z0o0Z0)646 716 +y(0ZBZ0Z0Z)646 799 y(Z0Z0L0Z0)646 882 y(POPZ0A0Z)646 965 y(Z0J0Z0Z0)p +1310 965 V 641 969 673 5 v 423 1087 a Fp(T)m(est)15 b(1)e(\(T\):)h +Fm(A)o(ndersson)h(v)g(Knuttson)p Fp(,)f(Blac)o(k)g(to)g(Pla)o(y)m(,)e +Fl(...)22 b(Qd1+)p Fp(.)p 641 1450 V 641 2114 5 665 v 646 1533 +a Fg(0Z0s0j0Z)646 1616 y(Z0Z0mpo0)646 1699 y(0ops0Z0o)646 1782 +y(o0Z0Z0ZP)646 1865 y(PZ0OPOPZ)646 1948 y(ZNS0Z0Z0)646 2031 +y(0Z0Z0J0Z)646 2114 y(Z0S0Z0Z0)p 1310 2114 V 641 2118 673 5 +v 467 2237 a Fp(T)m(est)14 b(2)g(\(L\):)f Fm(Bo)n(golyub)n(ow)j(v)f +(Spielmann)p Fp(,)f(White)f(to)h(Pla)o(y)m(,)e Fl(d5)p Fp(.)946 +2574 y(209)p eop +%%Page: 210 212 +210 211 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0ZqZrs0j)646 +482 y(Z0Zbanmp)646 565 y(pZ0o0opZ)646 648 y(Z0oPo0Z0)646 731 +y(PoPZPZPZ)646 814 y(ZPZ0ANMP)646 897 y(0ZBL0ORJ)646 980 y(Z0Z0Z0ZR)p +1310 980 V 641 984 673 5 v 500 1102 a Fp(T)m(est)14 b(3)g(\(L\):)g +Fm(Evans)h(v)g(R)n(ossolimo)p Fp(,)f(Blac)o(k)f(to)h(Pla)o(y)m(,)e +Fl(...)22 b(f5)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 +a Fg(rmblka0s)646 1631 y(o0Z0opop)646 1714 y(0o0Z0Z0Z)646 1797 +y(Z0opO0Z0)646 1880 y(0Z0M0Z0Z)646 1963 y(Z0O0Z0Z0)646 2046 +y(POPZQOPO)646 2129 y(S0A0JBZR)p 1310 2129 V 641 2133 673 5 +v 511 2252 a Fp(T)m(est)14 b(4)g(\(L\):)g Fm(Spielmann)h(v)g(Walter)p +Fp(,)e(White)h(to)g(Pla)o(y)m(,)e Fl(e6)p Fp(.)946 2574 y(210)p +eop +%%Page: 211 213 +211 212 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZbZ0skZ)646 +482 y(Z0l0a0op)646 565 y(pZ0opm0Z)646 648 y(ZpZ0Z0Z0)646 731 +y(0Z0LPZ0Z)646 814 y(ZBM0A0Z0)646 897 y(POPZ0ZPO)646 980 y(S0Z0ZRJ0)p +1310 980 V 641 984 673 5 v 492 1102 a Fp(T)m(est)14 b(5)g(\(T\):)f +Fm(R)n(o)n(golewicz)i(v)g(Jar)n(e)n(cz)p Fp(,)e(White)g(to)h(Pla)o(y)m(,)e +Fl(Nd5)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(0ZrZ0ZkZ)646 +1631 y(opoRZpo0)646 1714 y(0Z0ZpZ0Z)646 1797 y(Z0Z0O0O0)646 +1880 y(0Z0Z0O0Z)646 1963 y(ZPZ0Z0J0)646 2046 y(PZPZ0Z0Z)646 +2129 y(Z0Z0Z0Z0)p 1310 2129 V 641 2133 673 5 v 552 2252 a Fp(T)m(est)i(6)g +(\(L\):)f Fm(Pachman)j(D222)p Fp(,)f(White)e(to)h(Pla)o(y)m(,)e +Fl(g6)p Fp(.)946 2574 y(211)p eop +%%Page: 212 214 +212 213 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0mkZrZrZ)646 +482 y(opZ0m0op)646 565 y(0Z0ZpZ0Z)646 648 y(l0ZpOpZN)646 731 +y(bZpO0O0Z)646 814 y(A0O0ZRZ0)646 897 y(0ZPZBZPO)646 980 y(S0ZQZ0J0)p +1310 980 V 641 984 673 5 v 524 1102 a Fp(T)m(est)14 b(7)g(\(T\):)f +Fm(Golyak)j(v)e(Gaiduk)p Fp(,)g(White)g(to)g(Pla)o(y)m(,)e +Fl(Nf6)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(0Z0ZbZ0Z)646 +1631 y(o0Z0jpZ0)646 1714 y(0Z0Z0ZpZ)646 1797 y(Z0ZpO0Zp)646 +1880 y(0ZpO0O0Z)646 1963 y(Z0Z0J0O0)646 2046 y(PZ0ZNZ0O)646 +2129 y(Z0Z0Z0Z0)p 1310 2129 V 641 2133 673 5 v 544 2252 a Fp(T)m(est)i(8)g +(\(L\):)g Fm(A)o(lekhine)g(v)h(Y)m(ates)p Fp(,)e(White)h(to)g(Pla)o(y)m(,)e +Fl(f5)p Fp(.)946 2574 y(212)p eop +%%Page: 213 215 +213 214 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Zks0ans)646 +482 y(oboqZ0Z0)646 565 y(0onZpo0Z)646 648 y(Z0ZpZ0Zp)646 731 +y(0Z0O0O0A)646 814 y(Z0M0ZNZQ)646 897 y(POPZ0ZPO)646 980 y(Z0JRZBZR)p +1310 980 V 641 984 673 5 v 539 1102 a Fp(T)m(est)15 b(9)e(\(L\):)h +Fm(Jansa)h(v)g(Ornstein)p Fp(,)e(White)h(to)g(Pla)o(y)m(,)e +Fl(f5)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(0Z0srZkZ)646 +1631 y(opZ0Zpo0)646 1714 y(0lnZ0mpZ)646 1797 y(Z0Z0Z0Z0)646 +1880 y(0Z0o0Z0Z)646 1963 y(OPZRZPZ0)646 2046 y(0ZPZNLPO)646 +2129 y(S0A0Z0J0)p 1310 2129 V 641 2133 673 5 v 427 2252 a Fp(T)m(est)i(10)f +(\(T\):)h Fm(Kab)n(adzjan)i(v)e(Cib)n(elasvili)p Fp(,)e(Blac)o(k)i(to)g(Pla)o +(y)m(,)e Fl(...)22 b(Ne5)p Fp(.)946 2574 y(213)p eop +%%Page: 214 216 +214 215 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0ZrZnskZ)646 +482 y(o0ZqZpop)646 565 y(bo0o0Z0Z)646 648 y(m0oPo0Z0)646 731 +y(PZPZPZ0Z)646 814 y(Z0OBA0M0)646 897 y(0Z0ZQOPO)646 980 y(S0Z0ZRJ0)p +1310 980 V 641 984 673 5 v 552 1102 a Fp(T)m(est)15 b(11)e(\(L\):)h +Fm(Byrne)h(v)g(Kotov)p Fp(,)e(White)h(to)g(Pla)o(y)m(,)e Fl(f4)p +Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(rZ0ZrZkZ)646 +1631 y(oplbZpop)646 1714 y(0Z0Z0Z0Z)646 1797 y(Z0Z0o0MQ)646 +1880 y(0Z0Z0Z0Z)646 1963 y(Z0O0Z0Z0)646 2046 y(PO0Z0OPO)646 +2129 y(S0Z0S0J0)p 1310 2129 V 641 2133 673 5 v 523 2252 a Fp(T)m(est)i(12)g +(\(T\):)f Fm(Pachman)j(D3)p Fp(,)e(Blac)o(k)g(to)g(Pla)o(y)m(,)e +Fl(...)22 b(Bf5)p Fp(.)946 2574 y(214)p eop +%%Page: 215 217 +215 216 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZ0l0skZ)646 +482 y(Z0Z0apop)646 565 y(pZ0o0Z0Z)646 648 y(Z0oPZ0Z0)646 731 +y(0Z0oPZ0Z)646 814 y(Z0ZQZ0Z0)646 897 y(PO0A0OPO)646 980 y(S0Z0S0J0)p +1310 980 V 641 984 673 5 v 483 1102 a Fp(T)m(est)14 b(13)g(\(L\):)f +Fm(Pfei\013er)i(v)g(T)m(rifunovich)p Fp(,)e(White)g(to)h(Pla)o(y)m(,)e +Fl(b4)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(rmbZ0s0j)646 +1631 y(opZ0o0Zp)646 1714 y(0Zpo0ZpZ)646 1797 y(l0ZPZpZ0)646 +1880 y(0Z0Z0Z0Z)646 1963 y(ZPa0ZNO0)646 2046 y(PA0ZPOBO)646 +2129 y(S0ZQZRJ0)p 1310 2129 V 641 2133 673 5 v 425 2252 a Fp(T)m(est)i(14)f +(\(T\):)h Fm(R)n(ob)n(atsch)h(v)g(Jansa)p Fp(,)f(White)g(to)g(Pla)o(y)m(,)e +Fl(Qd2)j(or)g(Qe1)p Fp(.)946 2574 y(215)p eop +%%Page: 216 218 +216 217 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0ZrZ0ZkZ)646 +482 y(ZpZ0l0op)646 565 y(0ZbZps0Z)646 648 y(o0opZ0Z0)646 731 +y(0Z0Z0ZQZ)646 814 y(ZPZPO0S0)646 897 y(PZPM0ZPO)646 980 y(Z0Z0ZRJ0)p +1310 980 V 641 984 673 5 v 464 1102 a Fp(T)m(est)15 b(15)e(\(T\):)g +Fm(Fischer)i(v)g(Me)n(cking)p Fp(,)f(White)g(to)f(Pla)o(y)m(,)g +Fl(Qxg7+)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(rZblka0s)646 +1631 y(Z0Z0mpo0)646 1714 y(pZpZ0Z0o)646 1797 y(ZpZpO0A0)646 +1880 y(0Z0Z0Z0Z)646 1963 y(ZBZ0Z0Z0)646 2046 y(POPM0OPO)646 +2129 y(S0ZQZRJ0)p 1310 2129 V 641 2133 673 5 v 448 2252 a Fp(T)m(est)h(16)f +(\(T\):)h Fm(V)m(asilchuk)h(v)g(Bob)n(olovitch)p Fp(,)e(White)h(to)g(Pla)o(y) +m(,)e Fl(Ne4)p Fp(.)946 2574 y(216)p eop +%%Page: 217 219 +217 218 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZ0l0skZ)646 +482 y(Zponapop)646 565 y(pZ0o0mbZ)646 648 y(Z0ZPo0Z0)646 731 +y(0ZPZPZPZ)646 814 y(Z0M0ZNZP)646 897 y(POBZQO0Z)646 980 y(S0A0ZRJ0)p +1310 980 V 641 984 673 5 v 517 1102 a Fp(T)m(est)15 b(17)e(\(L\):)h +Fm(Bisch)h(v)g(Kmo)n(ch)p Fp(,)e(Blac)o(k)h(to)g(Pla)o(y)m(,)e +Fl(...)22 b(h5)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 +a Fg(rZbl0skZ)646 1631 y(opZ0opap)646 1714 y(0Zno0ZpZ)646 1797 +y(Z0m0Z0Z0)646 1880 y(PZ0ZPO0Z)646 1963 y(M0O0ZNZ0)646 2046 +y(0OBZ0ZPO)646 2129 y(S0A0LRJ0)p 1310 2129 V 641 2133 673 5 +v 488 2252 a Fp(T)m(est)14 b(18)g(\(T\):)f Fm(Maric)i(v)g(Fischer)p +Fp(,)e(Blac)o(k)h(to)g(Pla)o(y)m(,)e Fl(...)22 b(Nb3)p Fp(.)946 +2574 y(217)p eop +%%Page: 218 220 +218 219 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Z0srZ0Z)646 +482 y(Z0oqZ0ok)646 565 y(pZ0o0ono)646 648 y(Z0Z0Z0Z0)646 731 +y(0ZQAPO0Z)646 814 y(ZPZ0Z0Z0)646 897 y(PZ0Z0ZPO)646 980 y(Z0Z0SRJ0)p +1310 980 V 641 984 673 5 v 500 1102 a Fp(T)m(est)14 b(19)f(\(T\):)h +Fm(Euwe)h(v)g(Ker)n(es)p Fp(,)e(Blac)o(k)g(to)h(Pla)o(y)m(,)e +Fl(...)22 b(Rxe4)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 +a Fg(rZ0Z0j0Z)646 1631 y(obZ0apZr)646 1714 y(0o0lpZ0o)646 1797 +y(Z0ZpMpZ0)646 1880 y(0Z0O0O0Z)646 1963 y(Z0M0Z0O0)646 2046 +y(POPZQZ0O)646 2129 y(Z0JRS0Z0)p 1310 2129 V 641 2133 673 5 +v 559 2252 a Fp(T)m(est)14 b(20)f(\(L\):)h Fm(Euwe)h(v)g(Flohr)p +Fp(,)e(White)g(to)h(Pla)o(y)m(,)e Fl(g4)p Fp(.)946 2574 y(218)p +eop +%%Page: 219 221 +219 220 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(0Z0snZ0j)646 +482 y(opa0Zrop)646 565 y(0Zpoqo0Z)646 648 y(Z0Z0ZNZ0)646 731 +y(0ZPZPZ0Z)646 814 y(ZPZ0Z0ZQ)646 897 y(PA0Z0OPO)646 980 y(Z0ZRS0J0)p +1310 980 V 641 984 673 5 v 454 1102 a Fp(T)m(est)14 b(21)g(\(T\):)f +Fm(T)m(arr)n(asch)h(v)h(Blackburne)p Fp(,)f(White)g(to)g(Pla)o(y)m(,)e +Fl(Nh6)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 a Fg(0ZrZ0skZ)646 +1631 y(Zblnapo0)646 1714 y(0o0opm0o)646 1797 y(oPZ0Z0Z0)646 +1880 y(NZPZPZ0Z)646 1963 y(O0ZBZNZP)646 2046 y(0A0ZQOPZ)646 +2129 y(S0ZRZ0J0)p 1310 2129 V 641 2133 673 5 v 442 2252 a Fp(T)m(est)i(22)f +(\(T\):)h Fm(Najdorf)g(v)h(R)n(eshevsky)p Fp(,)f(Blac)o(k)g(to)g(Pla)o(y)m(,) +e Fl(...)22 b(Bxe4)p Fp(.)946 2574 y(219)p eop +%%Page: 220 222 +220 221 bop 641 315 673 5 v 641 980 5 665 v 646 399 a Fg(rZblkZ0s)646 +482 y(opZ0apop)646 565 y(0ZpZ0Z0Z)646 648 y(Z0ZpO0Z0)646 731 +y(PZ0L0O0Z)646 814 y(Z0M0A0Z0)646 897 y(0OPZ0ZPO)646 980 y(S0Z0ZRJ0)p +1310 980 V 641 984 673 5 v 512 1102 a Fp(T)m(est)14 b(23)g(\(L\):)f +Fm(Jansa)j(v)f(Kavalek)p Fp(,)e(Blac)o(k)h(to)g(Pla)o(y)m(,)e +Fl(...)22 b(f6)p Fp(.)p 641 1465 V 641 2129 5 665 v 646 1548 +a Fg(rZ0lnsnj)646 1631 y(o0ZbZ0a0)646 1714 y(0o0o0Zpo)646 1797 +y(Z0oPopZ0)646 1880 y(0OPZPZ0Z)646 1963 y(ORMBA0Z0)646 2046 +y(0Z0LNOPO)646 2129 y(Z0Z0ZRJ0)p 1310 2129 V 641 2133 673 5 +v 563 2252 a Fp(T)m(est)15 b(24)e(\(L\):)h Fm(Szab)n(o)h(v)g(Ivkov)p +Fp(,)f(White)g(to)g(Pla)o(y)m(,)e Fl(f4)p Fp(.)946 2574 y(220)p +eop +%%Page: 221 223 +221 222 bop 262 654 a Fn(App)s(endix)33 b(E)262 897 y Fo(T)-10 +b(est)39 b(Games)h(Pla)m(y)m(ed)262 1148 y Fp(This)19 b(app)q(endix)h(con)o +(tains)f(the)i(test)g(games)d(pla)o(y)o(ed)h(b)o(y)h(HIAR)o(CS)f(5.0.)35 +b(The)20 b(matc)o(h)262 1198 y(scores)15 b(w)o(ere)g(as)f(follo)o(ws:)p +324 1416 977 2 v 323 1466 2 50 v 349 1451 a Fm(Players)p 724 +1466 V 267 w(1)p 795 1466 V 50 w(2)p 866 1466 V 50 w(3)p 937 +1466 V 50 w(4)p 1008 1466 V 50 w(5)p 1079 1466 V 53 w(6)p 1156 +1466 V 53 w(T)m(otal)p 1299 1466 V 324 1468 977 2 v 323 1518 +2 51 v 349 1503 a Fp(HIAR)o(CS)f(5.0)p 724 1518 V 174 w(1)p +795 1518 V 50 w(1)p 866 1518 V 50 w(1)p 937 1518 V 50 w(1)p +1008 1518 V 50 w(1)p 1079 1518 V 1110 1487 a Fk(1)p 1110 1494 +17 2 v 1110 1517 a(2)p 1156 1518 2 51 v 1205 1503 a Fp(5)1231 +1487 y Fk(1)p 1230 1494 17 2 v 1230 1517 a(2)p 1299 1518 2 +51 v 324 1520 977 2 v 323 1570 2 51 v 349 1555 a Fp(Mephisto)h(Exclusiv)o(e)p +724 1570 V 50 w(0)p 795 1570 V 50 w(0)p 866 1570 V 50 w(0)p +937 1570 V 50 w(0)p 1008 1570 V 50 w(0)p 1079 1570 V 1110 1538 +a Fk(1)p 1110 1545 17 2 v 1110 1569 a(2)p 1156 1570 2 51 v +1220 1538 a(1)p 1220 1545 17 2 v 1220 1569 a(2)p 1299 1570 +2 51 v 324 1571 977 2 v 324 1790 589 2 v 323 1839 2 50 v 349 +1825 a Fm(Players)p 627 1839 V 169 w(1)p 698 1839 V 50 w(2)p +769 1839 V 50 w(T)m(otal)p 912 1839 V 324 1841 589 2 v 323 +1891 2 50 v 349 1876 a Fp(HIAR)o(CS)f(5.0)p 627 1891 V 77 w(1)p +698 1891 V 50 w(0)p 769 1891 V 86 w(1)p 912 1891 V 324 1893 +589 2 v 323 1942 2 50 v 349 1927 a(Mark)h(Uniac)o(k)o(e)p 627 +1942 V 50 w(0)p 698 1942 V 50 w(1)p 769 1942 V 86 w(1)p 912 +1942 V 324 1944 589 2 v 324 2163 826 2 v 323 2212 2 50 v 349 +2197 a Fm(Players)p 716 2212 V 261 w(1)p 792 2212 V 53 w(2)p +863 2212 V 50 w(3)p 934 2212 V 50 w(4)p 1005 2212 V 50 w(T)m(otal)p +1148 2212 V 324 2214 826 2 v 323 2264 2 51 v 349 2249 a Fp(HIAR)o(CS)f(5.0,)g +(3)g(ply)p 716 2264 V 747 2233 a Fk(1)p 747 2240 17 2 v 747 +2263 a(2)p 792 2264 2 51 v 818 2249 a Fp(0)p 863 2264 V 50 +w(0)p 934 2264 V 50 w(1)p 1005 2264 V 73 w(1)1080 2233 y Fk(1)p +1080 2240 17 2 v 1080 2263 a(2)p 1148 2264 2 51 v 324 2266 +826 2 v 323 2316 2 51 v 349 2301 a Fp(NOKNO)o(W,)h(6)f(ply)p +716 2316 V 747 2284 a Fk(1)p 747 2291 17 2 v 747 2315 a(2)p +792 2316 2 51 v 818 2301 a Fp(1)p 863 2316 V 50 w(1)p 934 2316 +V 50 w(0)p 1005 2316 V 73 w(2)1080 2284 y Fk(1)p 1080 2291 +17 2 v 1080 2315 a(2)p 1148 2316 2 51 v 324 2317 826 2 v 946 +2574 a Fp(221)p eop +%%Page: 222 224 +222 223 bop 262 307 a Fr(E.1)69 b(HIAR)n(CS)22 b(5.0)i(v)n(ersus)f(Mephisto)g +(Exclusiv)n(e)262 442 y Fu(E.1.1)55 b(Game)17 b(1)321 604 y +Fp(White)77 b(:)18 b Fl(Mephisto)13 b(Exclusiv)o(e)321 654 +y Fp(Blac)o(k)88 b(:)18 b Fl(HIAR)o(CS)d(5.0)321 703 y Fp(Op)q(ening)36 +b(:)18 b(Kings)13 b(Gam)o(bit)f(Accepted)415 803 y(1.)62 b(e4)102 +b(e5)552 b(31.)40 b(Qc2)71 b(Qf4)415 853 y(2.)62 b(f4)107 b(ef)560 +b(32.)40 b(Nf2)77 b(g3)415 903 y(3.)62 b(Nf3)76 b(d6)547 b(33.)40 +b(Nd3)67 b(gh+)14 b(\(mate)f(in)g(5\))415 952 y(4.)62 b(Bc4)73 +b(Be6)523 b(34.)40 b(Kh1)66 b(Rxf1+)415 1002 y(5.)c(Bxe6)51 +b(fe)560 b(35.)40 b(Rxf1)55 b(Qxf1+)415 1052 y(6.)62 b(d4)97 +b(Qf6)525 b(36.)40 b(Kxh2)k(Qg1+)415 1102 y(7.)62 b(o-o)85 +b(Nc6)521 b(37.)40 b(Kh3)66 b(Qg3+)14 b(mate)415 1152 y(8.)62 +b(Nc3)71 b(Nge7)618 b(0)35 b Ff(\000)54 b Fp(1)415 1201 y(9.)62 +b(Nb5)k(o-o-o)415 1251 y(10.)41 b(a4)99 b(a6)415 1301 y(11.)41 +b(Nc3)71 b(e5)415 1351 y(12.)41 b(d5)97 b(Nb4)415 1401 y(13.)41 +b(Bd2)68 b(Qg6)415 1451 y(14.)41 b(Nh4)66 b(Qh6)415 1500 y(15.)41 +b(Qg4+)35 b(Kb8)415 1550 y(16.)41 b(Rac1)50 b(g5)415 1600 y(17.)41 +b(Nf3)76 b(Rg8)415 1650 y(18.)41 b(Nd1)66 b(a5)415 1700 y(19.)41 +b(Bxb4)46 b(ab)415 1749 y(20.)41 b(a5)99 b(Qg6)415 1799 y(21.)41 +b(Nd2)66 b(Bg7)415 1849 y(22.)41 b(c4)102 b(h5)415 1899 y(23.)41 +b(Qf3)75 b(g4)415 1949 y(24.)41 b(Qe2)70 b(f3)415 1998 y(25.)41 +b(Qf2)75 b(Bh6)415 2048 y(26.)41 b(Ne3)71 b(fg)415 2098 y(27.)41 +b(Kxg2)k(Rdf8)415 2148 y(28.)c(Qe2)70 b(Rf3)415 2198 y(29.)41 +b(Nd1)66 b(Bxd2)415 2248 y(30.)41 b(Qxd2)i(Qxe4)946 2574 y(222)p +eop +%%Page: 223 225 +223 224 bop 262 307 a Fu(E.1.2)55 b(Game)17 b(2)321 469 y Fp(White)77 +b(:)18 b Fl(HIAR)o(CS)d(5.0)321 519 y Fp(Blac)o(k)88 b(:)18 +b Fl(Mephisto)13 b(Exclusiv)o(e)321 569 y Fp(Op)q(ening)36 +b(:)18 b(Bogo{Indian)415 668 y(1.)62 b(d4)97 b(Nf6)526 b(31.)40 +b(Rc8)72 b(Rdd8)415 718 y(2.)62 b(c4)102 b(e6)552 b(32.)40 +b(Rc6)72 b(Qh6)415 768 y(3.)62 b(Nf3)76 b(Bb4)518 b(33.)40 +b(Qe2)71 b(Rf6)415 818 y(4.)62 b(Bd2)68 b(Bxd2)496 b(34.)40 +b(h3)98 b(Qg5)415 868 y(5.)62 b(Qxd2)43 b(o-o)535 b(35.)40 +b(Qb5)66 b(Qh4)415 917 y(6.)c(Nc3)71 b(d5)547 b(36.)40 b(Rxb6)45 +b(Nxb6)415 967 y(7.)62 b(e3)102 b(Ne4)521 b(37.)40 b(Qxb6)k(Rc8)415 +1017 y(8.)62 b(Nxe4)49 b(de)550 b(38.)40 b(Rxa5)47 b(Rc1+)415 +1067 y(9.)62 b(Ng1)68 b(Nc6)521 b(39.)40 b(Kh2)66 b(Rc2)415 +1117 y(10.)41 b(Ne2)71 b(Rb8)516 b(40.)40 b(Ra8)69 b(Kf7)415 +1166 y(11.)41 b(Ng3)68 b(f5)557 b(41.)40 b(Ra7)69 b(Kg6)415 +1216 y(12.)41 b(Be2)73 b(b6)547 b(42.)40 b(Re7)72 b(Rxf2)415 +1266 y(13.)41 b(o-o)85 b(Bb7)518 b(43.)40 b(Rxe6)50 b(Kf7)415 +1316 y(14.)41 b(Rac1)50 b(Ne5)521 b(44.)40 b(d5)98 b(Qh6)415 +1366 y(15.)41 b(Qc2)70 b(Nc6)521 b(45.)40 b(Kg1)68 b(Rd2)415 +1416 y(16.)41 b(c5)102 b(Nb4)516 b(46.)40 b(Nxf5)55 b(Rd1+)415 +1465 y(17.)41 b(Qb3)65 b(Nd5)516 b(47.)40 b(Kh2)66 b(Rxe6)415 +1515 y(18.)41 b(c6)102 b(Ba8)520 b(48.)40 b(Qb7+)34 b(Kf8)415 +1565 y(19.)41 b(Qa4)67 b(a5)549 b(49.)40 b(Qb4+)34 b(Kf7)415 +1615 y(20.)41 b(Qb3)65 b(Qh4)515 b(50.)40 b(Nxh6+)13 b(Rxh6)415 +1665 y(21.)41 b(Rfd1)53 b(Rb)q(d8)492 b(51.)40 b(Qxe4)49 b(Rd2)415 +1714 y(22.)41 b(a4)99 b(Rd6)516 b(52.)40 b(b4)98 b(Rg6)415 +1764 y(23.)41 b(Bb5)68 b(Nb4)516 b(53.)40 b(a5)100 b(Ra2)415 +1814 y(24.)41 b(Rd2)66 b(Bxc6)501 b(54.)40 b(d6)98 b(Rxd6)415 +1864 y(25.)41 b(Bxc6)51 b(Nxc6)499 b(55.)40 b(Qc4+)f(Re6)415 +1914 y(26.)i(Rdc2)48 b(Ne7)521 b(56.)40 b(Qxa2)46 b(Kf6)415 +1963 y(27.)41 b(Rxc7)49 b(Nd5)516 b(57.)40 b(Qxe6+)17 b(Kxe6)415 +2013 y(28.)41 b(Ra7)68 b(Qd8)515 b(58.)40 b(a6)100 b(Resigns)415 +2063 y(29.)41 b(Qb5)65 b(Qg5)635 b(1)35 b Ff(\000)54 b Fp(0)415 +2113 y(30.)41 b(Qa6)67 b(Qh4)946 2574 y(223)p eop +%%Page: 224 226 +224 225 bop 262 307 a Fu(E.1.3)55 b(Game)17 b(3)321 469 y Fp(White)77 +b(:)18 b Fl(Mephisto)13 b(Exclusiv)o(e)321 519 y Fp(Blac)o(k)88 +b(:)18 b Fl(HIAR)o(CS)d(5.0)321 569 y Fp(Op)q(ening)36 b(:)18 +b(Ruy)13 b(Lop)q(ez,)h(exc)o(hange)h(v)n(ariation)415 668 y(1.)62 +b(e4)102 b(e5)552 b(31.)40 b(Qf3)76 b(Red8)415 718 y(2.)62 +b(Nf3)76 b(Nc6)521 b(32.)40 b(Qg4)68 b(Rd3)415 768 y(3.)62 +b(Bb5)68 b(a6)549 b(33.)40 b(Ne2)72 b(Rb3)415 818 y(4.)62 b(Bxc6)51 +b(dc)550 b(34.)40 b(g3)100 b(Rd2)415 868 y(5.)62 b(d3)97 b(Bg4)520 +b(35.)40 b(h5)98 b(Ke7)415 917 y(6.)62 b(h3)97 b(Bxf3)506 b(36.)40 +b(h6)98 b(Rbb2)415 967 y(7.)62 b(Qxf3)53 b(Nf6)526 b(37.)40 +b(Qf3)76 b(Rxe2)415 1017 y(8.)62 b(o-o)85 b(Qd4)515 b(38.)40 +b(Qa3)68 b(Ke6)415 1067 y(9.)62 b(Nc3)71 b(Qb4)515 b(39.)40 +b(Qxb2)k(Bxb2)415 1117 y(10.)d(Qf5)75 b(Bd6)518 b(40.)40 b(h7)98 +b(f5)415 1166 y(11.)41 b(Qg5)67 b(o-o)535 b(41.)40 b(Resigns)415 +1216 y(12.)h(Rb1)66 b(Rfe8)626 b(0)35 b Ff(\000)54 b Fp(1)415 +1266 y(13.)41 b(a3)99 b(Qc5)415 1316 y(14.)41 b(Be3)73 b(Qa5)415 +1366 y(15.)41 b(b4)97 b(h6)415 1416 y(16.)41 b(Qg3)67 b(Qxa3)415 +1465 y(17.)41 b(Rb3)66 b(Qxb3)415 1515 y(18.)41 b(cb)100 b(Bxb4)415 +1565 y(19.)41 b(Na2)68 b(Bf8)415 1615 y(20.)41 b(f4)107 b(ef)415 +1665 y(21.)41 b(Bxf4)56 b(Bc5+)415 1714 y(22.)41 b(Kh1)65 b(Nh5)415 +1764 y(23.)41 b(Qg4)67 b(Nxf4)415 1814 y(24.)41 b(Rxf4)54 b(Bd6)415 +1864 y(25.)41 b(Rf6)76 b(h5)415 1914 y(26.)41 b(Qxh5)i(gf)415 +1963 y(27.)e(h4)97 b(Rad8)415 2013 y(28.)41 b(Nc3)71 b(Be5)415 +2063 y(29.)41 b(Qg4)67 b(Kf8)415 2113 y(30.)41 b(d4)97 b(Rxd4)946 +2574 y(224)p eop +%%Page: 225 227 +225 226 bop 262 307 a Fu(E.1.4)55 b(Game)17 b(4)321 469 y Fp(White)77 +b(:)18 b Fl(HIAR)o(CS)d(5.0)321 519 y Fp(Blac)o(k)88 b(:)18 +b Fl(Mephisto)13 b(Exclusiv)o(e)321 569 y Fp(Op)q(ening)36 +b(:)18 b(Catalan)415 668 y(1.)62 b(d4)97 b(Nf6)526 b(31.)40 +b(Kg2)68 b(Nb4)415 718 y(2.)62 b(c4)102 b(e6)552 b(32.)40 b(Rxa5)47 +b(Na6)415 768 y(3.)62 b(g3)99 b(d5)547 b(33.)40 b(Rad5)46 b(g6)415 +818 y(4.)62 b(Bg2)70 b(dc)550 b(34.)40 b(a4)100 b(Nb8)415 868 +y(5.)62 b(Nf3)76 b(Nb)q(d7)492 b(35.)40 b(Rf7)77 b(Na6)415 +917 y(6.)62 b(Nc3)71 b(Bb4)518 b(36.)40 b(Rd7)67 b(Re6)415 +967 y(7.)62 b(Bd2)68 b(o-o)535 b(37.)40 b(Rxh7+)13 b(Resigns)415 +1017 y(8.)62 b(o-o)85 b(Be7)617 b(\(mate)13 b(in)h(3\))415 +1067 y(9.)62 b(Bf4)78 b(c5)670 b(1)35 b Ff(\000)54 b Fp(0)415 +1117 y(10.)41 b(e3)102 b(cd)415 1166 y(11.)41 b(Qxd4)i(Qb6)415 +1216 y(12.)e(Rb1)66 b(Qxd4)415 1266 y(13.)41 b(Nxd4)j(Nc5)415 +1316 y(14.)d(Bc7)73 b(Bd7)415 1366 y(15.)41 b(Rfd1)53 b(Ng4)415 +1416 y(16.)41 b(h3)97 b(Rfc8)415 1465 y(17.)41 b(Ndb5)i(Bxb5)415 +1515 y(18.)e(Nxb5)j(Nh6)415 1565 y(19.)d(Bd6)68 b(Bxd6)415 +1615 y(20.)41 b(Nxd6)j(Rcb8)415 1665 y(21.)d(Nxc4)49 b(a5)415 +1714 y(22.)41 b(Rb)q(c1)47 b(Nf5)415 1764 y(23.)41 b(e4)102 +b(Ne7)415 1814 y(24.)41 b(Nb6)66 b(Ra6)415 1864 y(25.)41 b(Rxc5)49 +b(Rxb6)415 1914 y(26.)41 b(Rd7)66 b(Nc6)415 1963 y(27.)41 b(b3)97 +b(e5)415 2013 y(28.)41 b(Bf1)78 b(f6)415 2063 y(29.)41 b(Bb5)68 +b(Ra8)415 2113 y(30.)41 b(Bc4+)g(Kh8)946 2574 y(225)p eop +%%Page: 226 228 +226 227 bop 262 307 a Fu(E.1.5)55 b(Game)17 b(5)321 469 y Fp(White)77 +b(:)18 b Fl(Mephisto)13 b(Exclusiv)o(e)321 519 y Fp(Blac)o(k)88 +b(:)18 b Fl(HIAR)o(CS)d(5.0)321 569 y Fp(Op)q(ening)36 b(:)18 +b(Sicilian)12 b(Dragon,)g(early)i(white)g(div)o(ergence)415 +668 y(1.)62 b(e4)102 b(c5)552 b(31.)40 b(Rb)q(c1)48 b(Rd2)415 +718 y(2.)62 b(Nf3)76 b(d6)547 b(32.)40 b(R1c2)51 b(Rxc2)415 +768 y(3.)62 b(Bc4)73 b(Nc6)521 b(33.)40 b(Rxc2)50 b(Rxa3)415 +818 y(4.)62 b(d4)97 b(Nf6)526 b(34.)40 b(Kf2)76 b(Kf7)415 868 +y(5.)62 b(d5)97 b(Na5)518 b(35.)40 b(Re2)72 b(Kf6)415 917 y(6.)62 +b(Bb5+)36 b(Bd7)518 b(36.)40 b(h3)98 b(Kf5)415 967 y(7.)62 +b(Bxd7+)14 b(Qxd7)493 b(37.)40 b(Ke1)71 b(h5)415 1017 y(8.)62 +b(Qd2)j(Nc4)521 b(38.)40 b(Kf2)76 b(Ra4)415 1067 y(9.)62 b(Qc3)70 +b(Nb6)516 b(39.)40 b(Rd2)67 b(Ke5)415 1117 y(10.)41 b(Nfd2)53 +b(e6)552 b(40.)40 b(Re2)72 b(Kd5)415 1166 y(11.)41 b(de)100 +b(fe)560 b(41.)40 b(Rd2)67 b(Rd4)415 1216 y(12.)41 b(o-o)85 +b(d5)547 b(42.)40 b(Ke3)71 b(Rxd2)415 1266 y(13.)41 b(ed)100 +b(Nb)o(xd5)472 b(43.)40 b(Kxd2)k(h4)415 1316 y(14.)d(Qh3)65 +b(Nf4)526 b(44.)40 b(Ke3)71 b(Ke5)415 1366 y(15.)41 b(Qe3)70 +b(Nf6d5)482 b(45.)40 b(Kd3)66 b(Kf4)415 1416 y(16.)41 b(Qe4)70 +b(Bd6)518 b(46.)40 b(Ke2)71 b(b5)415 1465 y(17.)41 b(Nc4)71 +b(o-o)535 b(47.)40 b(Kf2)76 b(a5)415 1515 y(18.)41 b(Nxd6)j(Qxd6)493 +b(48.)40 b(Ke2)71 b(b4)415 1565 y(19.)41 b(Na3)68 b(Qc6)520 +b(49.)40 b(Kf2)76 b(a4)415 1615 y(20.)41 b(Re1)71 b(g5)549 +b(50.)40 b(g3+)68 b(hg+)415 1665 y(21.)41 b(Bxf4)56 b(Rxf4)504 +b(51.)40 b(Ke2)71 b(a3)415 1714 y(22.)41 b(Qxe6+)16 b(Qxe6)498 +b(52.)40 b(h4)98 b(b3)415 1764 y(23.)41 b(Rxe6)49 b(Raf8)505 +b(53.)40 b(h5)98 b(ba)415 1814 y(24.)41 b(c4)102 b(Nb6)516 +b(54.)40 b(h6)98 b(a1\(Q\))415 1864 y(25.)41 b(Re5)71 b(h6)547 +b(55.)40 b(h7)98 b(a2)13 b(\(mate)g(in)h(7\))415 1914 y(26.)41 +b(f3)107 b(Nxc4)499 b(56.)40 b(h8\(Q\))34 b(Qxh8)415 1963 y(27.)41 +b(Rxc5)49 b(Nxa3)496 b(57.)40 b(Resigns)415 2013 y(28.)h(ba)97 +b(Ra4)636 b(0)35 b Ff(\000)54 b Fp(1)415 2063 y(29.)41 b(Rb1)66 +b(b6)415 2113 y(30.)41 b(Rc3)71 b(Rd8)946 2574 y(226)p eop +%%Page: 227 229 +227 228 bop 262 307 a Fu(E.1.6)55 b(Game)17 b(6)321 469 y Fp(White)77 +b(:)18 b Fl(HIAR)o(CS)d(5.0)321 519 y Fp(Blac)o(k)88 b(:)18 +b Fl(Mephisto)13 b(Exclusiv)o(e)321 569 y Fp(Op)q(ening)36 +b(:)18 b(P)o(etro\013)c(Defence)415 668 y(1.)62 b(e4)102 b(e5)552 +b(31.)40 b(Qd4)66 b(Qxd4)415 718 y(2.)c(Nf3)76 b(Nf6)526 b(32.)40 +b(Rxd4)45 b(Kg7)415 768 y(3.)62 b(Nxe5)49 b(d6)547 b(33.)40 +b(Kf1)76 b(Bb6)415 818 y(4.)62 b(Nf3)76 b(Nxe4)499 b(34.)40 +b(Rd5)67 b(f5)415 868 y(5.)62 b(d4)97 b(d5)547 b(35.)40 b(Ke2)71 +b(h6)415 917 y(6.)62 b(Bd3)68 b(Be7)523 b(36.)40 b(h5)98 b(Kf6)415 +967 y(7.)62 b(o-o)85 b(Nc6)521 b(37.)40 b(hg)98 b(f4)415 1017 +y(8.)62 b(Re1)71 b(Bf5)528 b(38.)40 b(Kf3)76 b(Bc7)415 1067 +y(9.)62 b(Nb)q(d2)42 b(Nd6)516 b(39.)40 b(Kg4)68 b(Kxg6)415 +1117 y(10.)41 b(Nb3)66 b(o-o)535 b(40.)40 b(Bf5+)47 b(Kf6)415 +1166 y(11.)41 b(Nc5)71 b(b6)547 b(41.)40 b(Rxd8)45 b(Bxd8)415 +1216 y(12.)c(Bf4)78 b(b)q(c)549 b(42.)40 b(Kxf4)54 b(Be7)415 +1266 y(13.)41 b(Bxd6)46 b(Qxd6)493 b(43.)40 b(a4)100 b(Bc5)415 +1316 y(14.)41 b(Bxf5)56 b(Qf6)525 b(44.)40 b(f3)108 b(a5)415 +1366 y(15.)41 b(Qd3)65 b(g6)549 b(45.)40 b(Ke4)71 b(h5)415 +1416 y(16.)41 b(Bd7)68 b(Nxd4)494 b(46.)40 b(f4)108 b(h4)415 +1465 y(17.)41 b(Nxd4)j(cd)550 b(47.)40 b(Bc8)74 b(Bf2)415 1515 +y(18.)41 b(Rad1)k(Bb4)518 b(48.)40 b(Kf3)76 b(Bg3)415 1565 +y(19.)41 b(Re2)71 b(c5)552 b(49.)40 b(Kg4)68 b(Ke7)415 1615 +y(20.)41 b(c3)102 b(dc)550 b(50.)40 b(Kg5)68 b(Kd6)415 1665 +y(21.)41 b(a3)99 b(Ba5)520 b(51.)40 b(f5)108 b(Ke7)415 1714 +y(22.)41 b(Qxd5)i(cb)550 b(52.)40 b(f6+)76 b(Kf7)415 1764 y(23.)41 +b(Qxc5)48 b(Qc3)520 b(53.)40 b(Kf5)76 b(Kf8)415 1814 y(24.)41 +b(Re5)71 b(f6)557 b(54.)40 b(Be6)74 b(Ke8)415 1864 y(25.)41 +b(Qd5+)33 b(Kh8)515 b(55.)40 b(Bd5)69 b(Kf8)415 1914 y(26.)41 +b(Re3)71 b(Qc7)520 b(56.)40 b(f7)108 b(Ke7)415 1963 y(27.)41 +b(h4)97 b(Rab8)495 b(57.)40 b(Kg6)68 b(Kf8)415 2013 y(28.)41 +b(Rb3)66 b(Rxb3)494 b(58.)40 b(Dra)o(wn)415 2063 y(29.)h(Qxb3)i(Rd8)1365 +2047 y Fk(1)p 1365 2054 17 2 v 1365 2078 a(2)1422 2063 y Ff(\000)1507 +2047 y Fk(1)p 1507 2054 V 1507 2078 a(2)415 2113 y Fp(30.)e(Qxb2)i(Qf4)946 +2574 y(227)p eop +%%Page: 228 230 +228 229 bop 262 307 a Fr(E.2)69 b(HIAR)n(CS)22 b(5.0)i(v)n(ersus)f(Mark)i +(Uniac)n(k)n(e)262 442 y Fu(E.2.1)55 b(Game)17 b(1)321 604 +y Fp(White)77 b(:)18 b Fl(Mark)e(Uniac)o(k)o(e)321 654 y Fp(Blac)o(k)88 +b(:)18 b Fl(HIAR)o(CS)d(5.0)321 703 y Fp(Op)q(ening)36 b(:)18 +b(Queens)d(Gam)o(bit)c(Declined)415 803 y(1.)62 b(d4)97 b(d5)547 +b(31.)40 b(ed)101 b(Qc5)415 853 y(2.)62 b(c4)102 b(e6)552 b(32.)40 +b(Kh2)66 b(Qxd5)415 903 y(3.)c(Nc3)71 b(Nf6)526 b(33.)40 b(Qxd5)k(Bxd5)415 +952 y(4.)62 b(Bg5)70 b(Be7)523 b(34.)40 b(Bd3)69 b(b5)415 1002 +y(5.)62 b(e3)102 b(o-o)535 b(35.)40 b(Kg1)68 b(h5)415 1052 +y(6.)62 b(Nf3)76 b(Nb)q(d7)492 b(36.)40 b(Be2)74 b(g6)415 1102 +y(7.)62 b(Bd3)68 b(dc)550 b(37.)40 b(a4)100 b(ba)415 1152 y(8.)62 +b(Bxc4)51 b(b6)547 b(38.)40 b(Bxa6)49 b(Bc6)415 1201 y(9.)62 +b(o-o)85 b(Bb7)518 b(39.)40 b(Kf2)76 b(Ke7)415 1251 y(10.)41 +b(Rc1)71 b(c5)552 b(40.)40 b(Be2)74 b(Kf6)415 1301 y(11.)41 +b(Re1)71 b(Rc8)521 b(41.)40 b(Bc4)74 b(h4)415 1351 y(12.)41 +b(Bd3)68 b(cd)550 b(42.)40 b(Be2)74 b(Ke5)415 1401 y(13.)41 +b(Nxd4)j(Ne5)521 b(43.)40 b(Bf3)79 b(Bxf3)415 1451 y(14.)41 +b(Bb1)68 b(Nfg4)505 b(44.)40 b(Kxf3)54 b(Kf5)415 1500 y(15.)41 +b(Bxe7)51 b(Qxe7)498 b(45.)40 b(Kf2)76 b(Ke4)415 1550 y(16.)41 +b(h3)97 b(Nf6)526 b(46.)40 b(Ke2)71 b(f5)415 1600 y(17.)41 +b(Qe2)70 b(Rfd8)503 b(47.)40 b(Kf2)76 b(Kd3)415 1650 y(18.)41 +b(Red1)48 b(Rc5)521 b(48.)40 b(Kf3)76 b(g5)415 1700 y(19.)41 +b(e4)102 b(a6)549 b(49.)40 b(Resigns)415 1749 y(20.)h(f4)107 +b(Ng6)636 b(0)35 b Ff(\000)54 b Fp(1)415 1799 y(21.)41 b(Qf2)75 +b(Qc7)415 1849 y(22.)41 b(Nde2)48 b(Rc4)415 1899 y(23.)41 b(Rxd8)j(Qxd8)415 +1949 y(24.)d(Rd1)66 b(Qc7)415 1998 y(25.)41 b(Rd4)66 b(Rxd4)415 +2048 y(26.)41 b(Qxd4)i(Nxf4)415 2098 y(27.)e(Nxf4)54 b(e5)415 +2148 y(28.)41 b(Qd2)65 b(ef)415 2198 y(29.)41 b(a3)99 b(Kf8)415 +2248 y(30.)41 b(Nd5)66 b(Nxd5)946 2574 y(228)p eop +%%Page: 229 231 +229 230 bop 262 307 a Fu(E.2.2)55 b(Game)17 b(2)321 469 y Fp(White)77 +b(:)18 b Fl(HIAR)o(CS)d(5.0)321 519 y Fp(Blac)o(k)88 b(:)18 +b Fl(Mark)e(Uniac)o(k)o(e)321 569 y Fp(Op)q(ening)36 b(:)18 +b(Pirc)c(Defence)415 668 y(1.)62 b(e4)102 b(d6)547 b(31.)40 +b(b3)98 b(Nb6)415 718 y(2.)62 b(d4)97 b(Nf6)526 b(32.)40 b(h4)98 +b(a5)415 768 y(3.)62 b(Nc3)71 b(g6)549 b(33.)40 b(h5)98 b(Na6)415 +818 y(4.)62 b(f4)107 b(Bg7)520 b(34.)40 b(hg)98 b(hg)415 868 +y(5.)62 b(Nf3)76 b(o-o)535 b(35.)40 b(Rh1+)35 b(Kg7)415 917 +y(6.)62 b(Be3)73 b(Ng4)518 b(36.)40 b(Kc1)71 b(a4)415 967 y(7.)62 +b(Bd2)68 b(c5)552 b(37.)40 b(ba)98 b(Nxa4)415 1017 y(8.)62 +b(dc)100 b(dc)550 b(38.)40 b(Qc2)71 b(Qc6)415 1067 y(9.)62 +b(e5)102 b(a6)549 b(39.)40 b(Rh3)67 b(ba)415 1117 y(10.)41 +b(h3)97 b(Nh6)516 b(40.)40 b(Nxa3)47 b(Nb4)415 1166 y(11.)41 +b(Be3)73 b(Qa5)517 b(41.)40 b(Rxd8)45 b(Nxc2)415 1216 y(12.)c(Qd5)65 +b(Nd7)516 b(42.)40 b(Rxe8)50 b(Qxe8)415 1266 y(13.)41 b(g4)99 +b(Kh8)515 b(43.)40 b(Kxc2)49 b(Qc6)415 1316 y(14.)41 b(o-o-o)50 +b(e6)552 b(44.)40 b(Bd2)69 b(Qe4+)415 1366 y(15.)41 b(Qd6)65 +b(Re8)521 b(45.)40 b(Kb3)66 b(Qe2)415 1416 y(16.)41 b(Ng5)68 +b(Bf8)528 b(46.)40 b(Kc2)71 b(Qxg4)415 1465 y(17.)41 b(Qd2)65 +b(Be7)523 b(47.)40 b(Rb3)67 b(Qf5+)415 1515 y(18.)41 b(Nge4)50 +b(b5)547 b(48.)40 b(Kc1)71 b(Qe4)415 1565 y(19.)41 b(Nd6)66 +b(Bxd6)496 b(49.)40 b(Kd1)66 b(Qd4)415 1615 y(20.)41 b(Qxd6)i(Bb7)518 +b(50.)40 b(Kc2)71 b(g5)415 1665 y(21.)41 b(Rh2)66 b(Rad8)495 +b(51.)40 b(Rg3)69 b(Kf8)415 1714 y(22.)41 b(Bg2)70 b(Bxg2)498 +b(52.)40 b(fg)108 b(Qxe5)415 1764 y(23.)41 b(Rxg2)46 b(b4)547 +b(53.)40 b(Rd3)67 b(Qe4)415 1814 y(24.)41 b(Nb1)66 b(Ng8)518 +b(54.)40 b(Be3)74 b(Nb2)415 1864 y(25.)41 b(a3)99 b(Ne7)521 +b(55.)40 b(Kxb2)k(Qxd3)415 1914 y(26.)d(c4)102 b(Nc8)521 b(56.)40 +b(Bxc5+)20 b(Kg7)415 1963 y(27.)41 b(Qc6)70 b(Ncb6)498 b(57.)40 +b(Be7)74 b(Kg6)415 2013 y(28.)41 b(Qe4)70 b(Nb8)516 b(58.)40 +b(Bf6)79 b(e5)415 2063 y(29.)41 b(Rgg1)47 b(Na4)518 b(59.)40 +b(Be7)74 b(e4)415 2113 y(30.)41 b(Kc2)70 b(Qc7)520 b(60.)40 +b(Nc2)72 b(Qxc4)946 2574 y(229)p eop +%%Page: 230 232 +230 231 bop 415 357 a Fp(61.)41 b(Bf6)78 b(Qd3)415 407 y(62.)41 +b(Nb4)66 b(Qd2+)415 457 y(63.)41 b(Nc2)71 b(e3)415 506 y(64.)41 +b(Bc3)73 b(Qd3)415 556 y(65.)41 b(Bd4)68 b(e2)415 606 y(66.)41 +b(Bf6)78 b(Qd2)415 656 y(67.)41 b(Kb1)65 b(e1\(Q\)+)415 706 +y(68.)41 b(Nxe1)49 b(Qxe1+)415 756 y(69.)41 b(Kc2)70 b(Qf2+)415 +805 y(70.)41 b(Kd3)65 b(Qf4)415 855 y(71.)41 b(Ke2)70 b(Qxf6)415 +905 y(72.)41 b(gf)107 b(Kxf6)415 955 y(73.)41 b(Kf2)75 b(Kf5)415 +1005 y(74.)41 b(Kf3)75 b(f6)415 1054 y(75.)41 b(Kg3)67 b(Ke4)415 +1104 y(76.)41 b(Kf2)75 b(Kf4)415 1154 y(77.)41 b(Kg2)67 b(Ke3)415 +1204 y(78.)41 b(Kg3)67 b(f5)415 1254 y(79.)41 b(Kg2)67 b(f4)415 +1303 y(80.)41 b(Kf1)75 b(Kf3)415 1353 y(81.)41 b(Ke1)70 b(Kg2)415 +1403 y(82.)41 b(Resigns)533 1453 y(0)35 b Ff(\000)54 b Fp(1)946 +2574 y(230)p eop +%%Page: 231 233 +231 232 bop 262 307 a Fr(E.3)69 b(HIAR)n(CS)22 b(5.0)i(v)n(ersus)f(NOKNO)n(W) +262 442 y Fu(E.3.1)55 b(Game)17 b(1)321 604 y Fp(White)77 b(:)18 +b Fl(NOKNO)o(W,)f(6)e(ply)321 654 y Fp(Blac)o(k)88 b(:)18 b +Fl(HIAR)o(CS)d(5.0,)i(3)e(ply)321 703 y Fp(Op)q(ening)36 b(:)18 +b(Queens)d(Gam)o(bit)c(Declined)415 803 y(1.)62 b(d4)97 b(d5)547 +b(31.)40 b(Qa7)68 b(Qxe5)415 853 y(2.)62 b(c4)102 b(e6)552 +b(32.)40 b(Rb1)67 b(Qe4)415 903 y(3.)62 b(Nc3)71 b(Nf6)526 +b(33.)40 b(a5)100 b(Rc2)415 952 y(4.)62 b(Bg5)70 b(Be7)523 +b(34.)40 b(a6)100 b(ba)415 1002 y(5.)62 b(e3)102 b(o-o)535 +b(35.)40 b(Qxa6)46 b(Kh7)415 1052 y(6.)62 b(Nf3)76 b(h6)547 +b(36.)40 b(Qd6)66 b(Rc6)415 1102 y(7.)c(Bxf6)56 b(Bxf6)506 +b(37.)40 b(Qd1)66 b(Rcc7)415 1152 y(8.)c(Qb3)j(c6)552 b(38.)40 +b(Rb6)67 b(Rcd7)415 1201 y(9.)62 b(Rd1)k(Nd7)516 b(39.)40 b(Rd6)67 +b(Qf5)415 1251 y(10.)41 b(Bd3)68 b(g6)549 b(40.)40 b(Rxd7)45 +b(Rxd7)415 1301 y(11.)c(cd)100 b(ed)550 b(41.)40 b(Qe2)71 b(Qc5)415 +1351 y(12.)41 b(e4)102 b(de)550 b(42.)40 b(Kg2)68 b(Qd5+)415 +1401 y(13.)41 b(Nxe4)49 b(Nb6)516 b(43.)40 b(f3)108 b(Qd4)415 +1451 y(14.)41 b(Nxf6)54 b(Qxf6)503 b(44.)40 b(f4)108 b(Qc3)415 +1500 y(15.)41 b(Be4)73 b(Bf5)528 b(45.)40 b(Kh3)66 b(Qd2)415 +1550 y(16.)41 b(Bxf5)56 b(Qxf5)503 b(46.)40 b(Qxd2)k(Rxd2)415 +1600 y(17.)d(o-o)85 b(Rde8)498 b(47.)40 b(Rh1)67 b(Kg7)415 +1650 y(18.)41 b(Ne5)71 b(Kg7)517 b(48.)40 b(Kg4)68 b(Kf6)415 +1700 y(19.)41 b(Qa3)67 b(f6)557 b(49.)40 b(Kf3)76 b(Rc2)415 +1749 y(20.)41 b(Qxa7)k(fe)560 b(50.)40 b(Ke4)71 b(Re2+)415 +1799 y(21.)41 b(Qxb6)i(Rf7)526 b(51.)40 b(Kd3)66 b(Rb2)415 +1849 y(22.)41 b(Qc5)70 b(Qf4)525 b(52.)40 b(Kc3)71 b(Rf2)415 +1899 y(23.)41 b(a4)99 b(Ree7)503 b(53.)40 b(Kd4)66 b(Rd2+)415 +1949 y(24.)41 b(b4)97 b(Ree8)503 b(54.)40 b(Kc4)71 b(Rc2+)415 +1998 y(25.)41 b(b5)97 b(Rf6)526 b(55.)40 b(Kd5)66 b(Rd2+)415 +2048 y(26.)41 b(Qa7)67 b(Re7)521 b(56.)40 b(Kc6)71 b(g5)415 +2098 y(27.)41 b(b)q(c)99 b(Rxc6)499 b(57.)40 b(fg+)76 b(Kxg5)415 +2148 y(28.)41 b(Qb8)65 b(Rc4)521 b(58.)40 b(h3)98 b(Rc2+)415 +2198 y(29.)41 b(g3)99 b(Qf5)525 b(59.)40 b(Kd5)66 b(Rg2)415 +2248 y(30.)41 b(de)100 b(Rc8)521 b(60.)40 b(g4)100 b(Kh4)946 +2574 y(231)p eop +%%Page: 232 234 +232 233 bop 415 357 a Fp(61.)41 b(Ke4)70 b(Rg3)415 407 y(62.)41 +b(Kf4)75 b(Rxh3)415 457 y(63.)41 b(Rg1)68 b(Rd3)415 506 y(64.)41 +b(Kf5)75 b(Rd5+)415 556 y(65.)41 b(Kf6)75 b(Rd2)415 606 y(66.)41 +b(Ke5)70 b(Kg5)415 656 y(67.)41 b(Rh1)66 b(Re2+)415 706 y(68.)41 +b(Kd5)65 b(Re3)415 756 y(69.)41 b(Rh5+)34 b(Kxg4)415 805 y(70.)41 +b(Rxh6)510 855 y(Dra)o(wn)538 889 y Fk(1)p 538 896 17 2 v 538 +919 a(2)595 905 y Ff(\000)680 889 y Fk(1)p 680 896 V 680 919 +a(2)946 2574 y Fp(232)p eop +%%Page: 233 235 +233 234 bop 262 307 a Fu(E.3.2)55 b(Game)17 b(2)321 469 y Fp(White)77 +b(:)18 b Fl(HIAR)o(CS)d(5.0,)i(3)e(ply)321 519 y Fp(Blac)o(k)88 +b(:)18 b Fl(NOKNO)o(W,)f(6)e(ply)321 569 y Fp(Op)q(ening)36 +b(:)18 b(Ruy)13 b(Lop)q(ez)415 668 y(1.)62 b(e4)102 b(e5)415 +718 y(2.)62 b(Nf3)76 b(Nc6)415 768 y(3.)62 b(Bb5)68 b(a6)415 +818 y(4.)62 b(Ba4)70 b(Nf6)415 868 y(5.)62 b(o-o)85 b(Be7)415 +917 y(6.)62 b(Re1)71 b(b5)415 967 y(7.)62 b(Bb3)68 b(d6)415 +1017 y(8.)62 b(c3)102 b(o-o)415 1067 y(9.)62 b(h3)97 b(Bb7)415 +1117 y(10.)41 b(d4)97 b(Re8)415 1166 y(11.)41 b(Ng5)68 b(Rf8)415 +1216 y(12.)41 b(f4)107 b(ed)415 1266 y(13.)41 b(cd)100 b(h6)415 +1316 y(14.)41 b(Nf3)76 b(d5)415 1366 y(15.)41 b(ed)100 b(Na5)415 +1416 y(16.)41 b(Bc2)73 b(Bxd5)415 1465 y(17.)41 b(Nc3)71 b(Bxf3)415 +1515 y(18.)41 b(gf)107 b(c5)415 1565 y(19.)41 b(Be3)73 b(Nc4)415 +1615 y(20.)41 b(dc)100 b(Nxe3)415 1665 y(21.)41 b(Rxe3)49 b(Bxc5)415 +1714 y(22.)41 b(Qe1)70 b(Qd4)415 1764 y(23.)41 b(Nd1)66 b(Nd5)415 +1814 y(24.)41 b(Resigns)533 1864 y(0)35 b Ff(\000)54 b Fp(1)946 +2574 y(233)p eop +%%Page: 234 236 +234 235 bop 262 307 a Fu(E.3.3)55 b(Game)17 b(3)321 469 y Fp(White)77 +b(:)18 b Fl(NOKNO)o(W,)f(6)e(ply)321 519 y Fp(Blac)o(k)88 b(:)18 +b Fl(HIAR)o(CS)d(5.0,)i(3)e(ply)321 569 y Fp(Op)q(ening)36 +b(:)18 b(Reti)13 b(\(irregular\))415 668 y(1.)62 b(Nf3)76 b(d5)547 +b(31.)40 b(Ra1)69 b(Nb4)415 718 y(2.)62 b(Na3)68 b(Nc6)521 +b(32.)40 b(Rxa7)47 b(b6)415 768 y(3.)62 b(c4)102 b(e5)552 b(33.)40 +b(Rc7)72 b(c5+)415 818 y(4.)62 b(cd)100 b(Qxd5)493 b(34.)40 +b(Kc4)71 b(Nc2)415 868 y(5.)62 b(d3)97 b(Bb4+)486 b(35.)40 +b(Rb7)67 b(Nd4)415 917 y(6.)62 b(Bd2)68 b(Bg4)520 b(36.)40 +b(f4)108 b(Ne6)415 967 y(7.)62 b(Bxb4)46 b(Bxf3)506 b(37.)40 +b(Rxb6)45 b(g6)415 1017 y(8.)62 b(ef)110 b(Nxb4)494 b(38.)40 +b(f3)108 b(Ke7)415 1067 y(9.)62 b(Nc4)71 b(Nf6)526 b(39.)40 +b(Kd5)66 b(h5)415 1117 y(10.)41 b(Qe2)70 b(o-o)535 b(40.)40 +b(Ke4)71 b(Ng7)415 1166 y(11.)41 b(Nxe5)49 b(Nxd3+)462 b(41.)40 +b(Ke5)71 b(Nf5)415 1216 y(12.)41 b(Qxd3)i(Qxe5+)466 b(42.)40 +b(Rb7)67 b(Ke8)415 1266 y(13.)41 b(Qe2)70 b(Qc5)520 b(43.)40 +b(Kf6)76 b(Nxh4)415 1316 y(14.)41 b(Qd2)65 b(Rfe8+)476 b(44.)40 +b(Re7+)g(Kd8)415 1366 y(15.)h(Be2)73 b(Rad8)495 b(45.)40 b(Rxf7)55 +b(Nxf3)415 1416 y(16.)41 b(Qc1)70 b(Qb5)515 b(46.)40 b(Kxg6)46 +b(Nd4)415 1465 y(17.)41 b(Qc2)70 b(Rxe2+)467 b(47.)40 b(Rb7)67 +b(h4)415 1515 y(18.)41 b(Qxe2)48 b(Re8)521 b(48.)40 b(Kg5)68 +b(Kc8)415 1565 y(19.)41 b(Qxe8+)16 b(Qxe8+)466 b(49.)40 b(Rh7)67 +b(Nxb3)415 1615 y(20.)41 b(Kd2)65 b(Qe5)520 b(50.)40 b(Kxh4)k(c4)415 +1665 y(21.)d(b3)97 b(Qg5+)485 b(51.)40 b(Kg5)68 b(Nd4)415 1714 +y(22.)41 b(Ke2)70 b(Qxg2)495 b(52.)40 b(Kf6)76 b(c3)415 1764 +y(23.)41 b(h4)97 b(Nd5)516 b(53.)40 b(Rh5)67 b(Kb7)415 1814 +y(24.)41 b(Rag1)47 b(Nc3+)489 b(54.)40 b(Rc5)72 b(c2)415 1864 +y(25.)41 b(Ke3)70 b(Qxh1)493 b(55.)40 b(Ke5)71 b(Nc6+)415 1914 +y(26.)41 b(Rxh1)j(c6)552 b(56.)40 b(Kd6)66 b(Nb4)415 1963 y(27.)41 +b(Kd4)65 b(Nb5+)484 b(57.)40 b(f5)108 b(c1\(Q\))415 2013 y(28.)41 +b(Kc5)70 b(Nc3)521 b(58.)40 b(Rxc1)50 b(Resigns)415 2063 y(29.)41 +b(Re1)71 b(Kf8)643 b(1)35 b Ff(\000)54 b Fp(0)415 2113 y(30.)41 +b(Kd4)65 b(Nxa2)946 2574 y(234)p eop +%%Page: 235 237 +235 236 bop 262 307 a Fu(E.3.4)55 b(Game)17 b(4)321 469 y Fp(White)77 +b(:)18 b Fl(HIAR)o(CS)d(5.0,)i(3)e(ply)321 519 y Fp(Blac)o(k)88 +b(:)18 b Fl(NOKNO)o(W,)f(6)e(ply)321 569 y Fp(Op)q(ening)36 +b(:)18 b(Alekhines)c(Defence)415 668 y(1.)62 b(e4)102 b(Nf6)526 +b(31.)40 b(Rb6)67 b(Rac8)415 718 y(2.)62 b(e5)102 b(Nd5)516 +b(32.)40 b(Rd4)67 b(Bc6)415 768 y(3.)62 b(d4)97 b(e6)552 b(33.)40 +b(Ra6)69 b(a4)415 818 y(4.)62 b(c4)102 b(Bb4+)486 b(34.)40 +b(Ra5)69 b(g6)415 868 y(5.)62 b(Bd2)68 b(Bxd2+)464 b(35.)40 +b(h5)98 b(Ke6)415 917 y(6.)62 b(Qxd2)43 b(Ne7)521 b(36.)40 +b(hg)98 b(hg)415 967 y(7.)62 b(Nc3)71 b(Nb)q(c6)497 b(37.)40 +b(Nh4)67 b(Rg7)415 1017 y(8.)62 b(Nf3)76 b(d6)547 b(38.)40 +b(f4)108 b(Ra8)415 1067 y(9.)62 b(o-o-o)50 b(o-o)535 b(39.)40 +b(Rc5)72 b(Ra6)415 1117 y(10.)41 b(Bd3)68 b(Nf5)526 b(40.)40 +b(Rd2)67 b(Be4)415 1166 y(11.)41 b(Bxf5)56 b(ef)560 b(41.)40 +b(Nf3)77 b(Rg8)415 1216 y(12.)41 b(ed)100 b(cd)550 b(42.)40 +b(Nd4+)35 b(Ke7)415 1266 y(13.)41 b(Rde1)48 b(b6)547 b(43.)40 +b(Rc7+)g(Ke8)415 1316 y(14.)h(Nd5)66 b(Be6)523 b(44.)40 b(Nb5)67 +b(Ra8)415 1366 y(15.)41 b(Ne3)71 b(Bd7)518 b(45.)40 b(Nd6+)35 +b(Kd8)415 1416 y(16.)41 b(h4)97 b(a5)549 b(46.)40 b(Rf7)77 +b(Bc6)415 1465 y(17.)41 b(Nd5)66 b(Be6)523 b(47.)40 b(Nxf5+)23 +b(Ke8)415 1515 y(18.)41 b(Nxb6)j(Qxb6)493 b(48.)40 b(Nd6+)35 +b(Kd8)415 1565 y(19.)41 b(d5)97 b(Qc5)520 b(49.)40 b(Nb5+)35 +b(Ke8)415 1615 y(20.)41 b(b3)97 b(Bd7)518 b(50.)40 b(Rxf6)55 +b(Bxb5)415 1665 y(21.)41 b(dc)100 b(Bxc6)501 b(51.)40 b(cb)101 +b(Ke7)415 1714 y(22.)41 b(Re7)71 b(d5)547 b(52.)40 b(Rfd6)54 +b(Rgf8)415 1764 y(23.)41 b(Re5)71 b(Qa3+)485 b(53.)40 b(g3)100 +b(Rf6)415 1814 y(24.)41 b(Qb2)65 b(Qxb2+)461 b(54.)40 b(Rd7+)35 +b(Ke8)415 1864 y(25.)41 b(Kxb2)i(dc)550 b(55.)40 b(Kb4)66 b(Re6)415 +1914 y(26.)41 b(b)q(c)99 b(Be4)523 b(56.)40 b(R7d6)46 b(Ke7)415 +1963 y(27.)41 b(Rd1)66 b(f6)557 b(57.)40 b(Rxe6+)18 b(Kxe6)415 +2013 y(28.)41 b(Re7)71 b(Rf7)526 b(58.)40 b(b6)98 b(Rb8)415 +2063 y(29.)41 b(Re6)71 b(Rc7)521 b(59.)40 b(Kc5)71 b(Rc8+)415 +2113 y(30.)41 b(Kc3)70 b(Kf7)525 b(60.)40 b(Kb5)66 b(a3)946 +2574 y(235)p eop +%%Page: 236 238 +236 237 bop 415 357 a Fp(61.)41 b(Rd3)66 b(Ra8)415 407 y(62.)41 +b(b7)97 b(Rb8)415 457 y(63.)41 b(Kb6)65 b(Rg8)415 506 y(64.)41 +b(Rxa3)46 b(Rd8)415 556 y(65.)41 b(Re3+)e(Kf6)415 606 y(66.)i(Kc7)70 +b(Rf8)415 656 y(67.)41 b(b8\(Q\))33 b(Rxb8)415 706 y(68.)41 +b(Kxb8)i(g5)415 756 y(69.)e(fg+)75 b(Kxg5)415 805 y(70.)41 +b(a4)99 b(Resigns)533 855 y(1)35 b Ff(\000)54 b Fp(0)946 2574 +y(236)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/programs/xboard.html b/programs/xboard.html new file mode 100644 index 0000000..c02b03b --- /dev/null +++ b/programs/xboard.html @@ -0,0 +1,1300 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> +<html> +<head> +<title>Chess Engine Communication Protocol</title> +</head> + +<body> +<hr noshade size="2"> +<h1>Chess Engine Communication Protocol</h1> +<h2><a href="http://www.tim-mann.org/chess.html">Tim Mann</a></h2> +<p> +Last modified on Sun Sep 17 23:37:17 PDT 2000 by mann +<hr noshade size="2"> + +<ul> +<li><a href="#1">1. Introduction</a> +<li><a href="#2">2. Connection</a> +<li><a href="#3">3. Debugging</a> +<li><a href="#4">4. How it got this way</a> +<li><a href="#5">5. WinBoard requires Win32 engines</a> +<li><a href="#6">6. Hints on input/output</a> +<li><a href="#7">7. Interrupts</a> +<li><a href="#8">8. Commands from xboard to the engine</a> +<li><a href="#9">9. Commands from the engine to xboard</a> +<li><a href="#10">10. Thinking Output</a> +<li><a href="#11">11. Time control</a> +<li><a href="#12">12. Analyze Mode</a> +<li><a href="#13">13. Idioms and backward compatibility features</a> +</ul> + +<hr noshade size="2"> + +<h2><a name="1">1. Introduction</a></h2> + +<p> +This document is a set of rough notes on the protocol that xboard and +WinBoard use to communicate with gnuchessx and other chess engines. +These notes may be useful if you want to connect a different chess +engine to xboard. Throughout the notes, "xboard" means both xboard +and WinBoard except where they are specifically contrasted. +</p> + +<p> +There are two reasons I can imagine someone wanting to do this: +</p> +<ol> +<li>You have, or are developing, a chess engine but you don't want to +write your own graphical interface. +<li>You have, or are developing,a chess engine, and you want to +interface it to the Internet Chess Server. +</ol> + +<p> +In case (2), if you are using xboard, you will need to configure the +"Zippy" code into it, but WinBoard includes this code already. See +the file <a +href="http://www.tim-mann.org/xboard/zippy.README">zippy.README</a> +in the xboard or WinBoard distribution for more information. + +</p> + +<p> +These notes are unpolished, but I've attempted to make them complete +in this release. If you notice any errors, omissions, or misleading +statements, let me know. +</p> + +<p> +I'd like to hear from everyone who is trying to interface their own +chess engine to xboard/WinBoard. Please email me, <a +href="mailto:[email protected]">[email protected]</a>. Also, please join +the mailing list for authors of xboard/WinBoard compatible chess +engines. The list is now hosted by egroups.com; you can join at <a +href="http://www.egroups.com/group/chess-engines" +>http://www.egroups.com/group/chess-engines</a>, or you can read the +list there without joining. The list is filtered to prevent spam. +</p> + +<h2><a name="2">2. Connection</a></h2> + +<p> +An xboard chess engine runs as a separate process from xboard itself, +connected to xboard through a pair of anonymous pipes. The engine +does not have to do anything special to set up these pipes. xboard +sets up the pipes itself and starts the engine with one pipe as its +standard input and the other as its standard output. The engine then +reads commands from its standard input and writes responses to its +standard output. This is, unfortunately, a little more complicated to +do right than it sounds; see <a href="#6">section 6</a> below. +</p> + +<p> +And yes, contrary to some people's expectations, exactly the same +thing is true for WinBoard. Pipes and standard input/output are +implemented in Win32 and work fine. You don't have to use DDE, COM, +DLLs, BSOD, or any of the other infinite complexity that +Microsoft has created just to talk between two programs. A WinBoard +chess engine is a Win32 console program that simply reads from its +standard input and writes to its standard output. See sections +<a href="#5">5</a> and <a href="#6">6</a> below for additional details. +</p> + +<h2><a name="3">3. Debugging</a></h2> + +<p> +To diagnose problems in your engine's interaction with xboard, use the +-debug flag on xboard's command line to see the messages that are +being exchanged. In WinBoard, these messages are written to the file +WinBoard.debug instead of going to the screen. +</p> + +<p> +You can turn debug mode on or off while WinBoard is running by +pressing Ctrl+Alt+F12. You can turn debug mode on or off while xboard +is running by binding DebugProc to a shortcut key (and pressing the +key!); see the instructions on shortcut keys in the xboard man page. +</p> + +<p> +While your engine is running under xboard/WinBoard, you can send a +command directly to the engine by pressing Shift+1 (xboard) or Alt+1 +(WinBoard 4.0.3 and later). This brings up a dialog that you can type +your command into. Press Shift+2 (Alt+2) instead to send to the +second chess engine in Two Machines mode. On WinBoard 4.0.2 and earlier, +Ctrl+Alt is used in place of Alt; this had to be changed due to a conflict +with typing the @-sign on some European keyboards. +</p> + +<h2><a name="4">4. How it got this way</a></h2> + +<p> +Originally, xboard was just trying to talk to the existing +command-line interface of gnuchess, designed for people to type +commands to. So the communication protocol is very ad-hoc. (The +reason why there is a gnuchessx that's different from gnuchessr is +buried in the mists of time, before I started working on xboard, but I +think it was due to someone working around a stupid bug in xboard by +changing gnuchess instead of fixing the bug. The differences are +tiny.) It's now tough to change the interface, because xboard and +gnuchess are separate programs, and I don't want to force people to +upgrade them together to versions that match. +</p> + +<p> +Things have changed a bit now that there are many more engines that +work with xboard. I've had to make the protocol description more +precise, and I've added some features that GNU Chess does not support. +In the latest version, I've specified a standard semantics for many +commands that differs in some details from what GNU Chess provides, +but is easier to work with. In the future I may release a modified +GNU Chess that conforms exactly to this protocol. +</p> + +<h2><a name="5">5. WinBoard requires Win32 engines</a></h2> + +<p> +Due to some Microsoft brain damage that I don't understand, WinBoard +does not work with chess engines that were compiled to use a DOS +extender for 32-bit addressing. (Probably not with 16-bit DOS or +Windows programs either.) WinBoard works only with engines that are +compiled for the Win32 API. You can get a free compiler that targets +the Win32 API from <a href="http://sourceware.cygnus.com/cygwin/" +>http://sourceware.cygnus.com/cygwin/</a>. I think DJGPP 2.x should +also work if you use the RSXNTDJ extension, but I haven't tried it. +Of course, Microsoft Visual C++ will work. Most likely the other +commercial products that support Win32 will work too (Borland, etc.), +but I have not tried them. +</p> + +<h2><a name="6">6. Hints on input/output</a></h2> + +<p> +Beware of using buffered I/O in your chess engine. The C stdio +library, C++ streams, and the I/O packages in most other languages use +buffering both on input and output. That means two things. First, +when your engine tries to write some characters to xboard, the library +stashes them in an internal buffer and does not actually write them to +the pipe connected to xboard until either the buffer fills up or you +call a special library routine asking for it to be flushed. (In C +stdio, this routine is named <tt>fflush</tt>.) Second, when your engine tries +to read some characters from xboard, the library does not read just +the characters you asked for -- it reads all the characters that are +currently available (up to some limit) and stashes any characters you +are not yet ready for in an internal buffer. The next time you ask to +read, you get the characters from the buffer (if any) before the +library tries to read more data from the actual pipe. +</p> + +<p> +Why does this cause problems? First, on the output side, remember +that your engine produces output in small quantities (say, a few +characters for a move, or a line or two giving the current analysis), +and that data always needs to be delivered to xboard/WinBoard for +display immediately. If you use buffered output, the data you print +will sit in a buffer in your own address space instead of being +delivered. +</p> + +<p> +You can usually fix the output buffering problem by asking for the +buffering to be turned off. In C stdio, you do this by calling +<tt>setbuf(stdout, NULL)</tt>. A more laborious and error-prone +method is to carefully call <tt>fflush(stdout)</tt> after every line +you output; I don't recommend this. In C++, you can try +<tt>cout.setf(ios::unitbuf)</tt>, which is documented in current +editions of "The C++ Programming Language," but not older ones. +Another C++ method that might work is +<tt>cout.rdbuf()->setbuf(NULL, 0)</tt>. Alternatively, you can +carefully call <tt>cout.flush()</tt> after every line you output; +again, I don't recommend this. +</p> + +<p> +Another way to fix the problem is to use unbuffered operating system +calls to write directly to the file descriptor for standard output. +On Unix, this means <tt>write(1, ...)</tt> -- see the man page for write(2). +On Win32, you can use either the Unix-like <tt>_write(1, ...)</tt> or Win32 +native routines like <tt>WriteFile</tt>. +</p> + +<p> +Second, on the input side, you are likely to want to poll during your +search and stop it if new input has come in. If you implement +pondering, you'll need this so that pondering stops when the user +makes a move. You should also poll during normal thinking on your +move, so that you can implement the "?" (move now) command, and so +that you can respond promptly to a "result", "force", or "quit" +command if xboard wants to end the game or terminate your engine. +Buffered input makes polling more complicated -- when you poll, you +must stop your search if there are <em>either</em> characters in the buffer +<em>or</em> characters available from the underlying file descriptor. +</p> + +<p> +The most direct way to fix this problem is to use unbuffered operating +system calls to read (and poll) the underlying file descriptor +directly. On Unix, use <tt>read(0, ...)</tt> to read from standard input, and +use <tt>select()</tt> to poll it. See the man pages read(2) and select(2). +(Don't follow the example of GNU Chess and use the FIONREAD ioctl to +poll for input. It is not very portable; that is, it does not exist +on all versions of Unix, and is broken on some that do have it.) On +Win32, you can use either the Unix-like <tt>_read(0, ...)</tt> or the native +Win32 <tt>ReadFile()</tt> to read. Unfortunately, under Win32, the function to +use for polling is different depending on whether the input device is +a pipe, a console, or something else. (More Microsoft brain damage +here -- did they never hear of device independence?) For pipes, you +can use <tt>PeekNamedPipe</tt> to poll (even when the pipe is unnamed). +For consoles, +you can use <tt>GetNumberOfConsoleInputEvents</tt>. For sockets only, you can +use <tt>select()</tt>. It might be possible to use +<tt>WaitForSingleObject</tt> more +generally, but I have not tried it. Some code to do these things can +be found in Crafty's utility.c, but I don't guarantee that it's all +correct or optimal. +</p> + +<p> +A second way to fix the problem might be to ask your I/O library not +to buffer on input. It should then be safe to poll the underlying +file descriptor as descrbed above. With C, you can try calling +<tt>setbuf(stdin, NULL)</tt>. However, I have never tried this. Also, there +could be problems if you use <tt>scanf()</tt>, at least with certain patterns, +because <tt>scanf()</tt> sometimes needs to read one extra character and "push +it back" into the buffer; hence, there is a one-character pushback +buffer even if you asked for stdio to be unbuffered. With C++, you +can try <tt>cin.rdbuf()->setbuf(NULL, 0)</tt>, but again, I have never tried +this. +</p> + +<p> +A third way to fix the problem is to check whether there are +characters in the buffer whenever you poll. C I/O libraries generally +do not provide any portable way to do this. Under C++, you can use +<tt>cin.rdbuf()->in_avail()</tt>. This method has been reported to +work with +EXchess. Remember that if there are no characters in the buffer, you +still have to poll the underlying file descriptor too, using the +method descrbed above. +</p> + +<p> +A fourth way to fix the problem is to use a separate thread to read +from stdin. This way works well if you are familiar with thread +programming. This thread can be blocked waiting for input to come in +at all times, while the main thread of your engine does its thinking. +When input arrives, you have the thread put the input into a buffer +and set a flag in a global variable. Your search routine then +periodically tests the global variable to see if there is input to +process, and stops if there is. WinBoard and my Win32 ports of ICC +timestamp and FICS timeseal use threads to handle multiple input +sources. +</p> + +<h2><a name="7">7. Signals</a></h2> + +<p>Engines that run on Unix need to be concerned with two Unix +signals: <tt>SIGTERM</tt> and <tt>SIGINT</tt>. This applies both to +engines that run under xboard and (the unusual case of) engines that +WinBoard remotely runs on a Unix host using the -firstHost or +-secondHost feature. It does not apply to engines that run on +Windows, because Windows does not have Unix-style signals.</p> + +<p>First, when an engine is sent the "quit" command, it is also given a +<tt>SIGTERM</tt> signal shortly afterward to make sure it goes away. If your +engine reliably responds to "quit", and the signal causes problems for +you, you should ignore it by calling <tt>signal(SIGTERM, SIG_IGN)</tt> at the +start of your program.</p> + +<p>Second, +xboard will send an interrupt signal (<tt>SIGINT</tt>) at certain times when it +believes the engine may not be listening to user input (thinking or +pondering). WinBoard currently does this only when the engine is +running remotely using the -firstHost or -secondHost feature, not when +it is running locally. You probably need to know only enough about +this grungy feature to keep it from getting in your way. +</p> + +<p> +The <tt>SIGINT</tt>s are basically tailored to the needs of GNU Chess on +systems where its input polling code is broken or disabled. Because +they work in a rather peculiar way, it is recommended that you simply +ignore <tt>SIGINT</tt> when running under Unix in xboard mode. You can do this +by having your engine call <tt>signal(SIGINT, SIG_IGN)</tt>. Alternatively, +you can configure your personal copy of xboard to not send <tt>SIGINT</tt> by +running configure with the --disable-sigint option. This won't help +you if you give your engine to other people who don't want to +recompile their xboard and possibly break its interaction with GNU +Chess. +</p> + +<p> +Here are details for the curious. If xboard needs to send a command +when it is the chess engine's move (such as before the "?" command), +it sends a <tt>SIGINT</tt> first. If xboard needs to send commands when it is +not the chess engine's move, but the chess engine may be pondering +(thinking on its opponent's time) or analyzing (analysis or analyze +file mode), xboard sends a <tt>SIGINT</tt> before the first such command only. +Another <tt>SIGINT</tt> is not sent until another move is made, even if xboard +issues more commands. This behavior is necessary for GNU Chess. The +first <tt>SIGINT</tt> stops it from pondering until the next move, but on some +systems, GNU Chess will die if it receives a <tt>SIGINT</tt> when not actually +thinking or pondering. +</p> + +<p> +There are two reasons why WinBoard does not send the Win32 equivalent +of <tt>SIGINT</tt> (which is called <tt>CTRL_C_EVENT</tt>) to local engines. First, the +Win32 GNU Chess port does not need it. Second, I could not find a way +to get it to work. Win32 seems to be designed under the assumption +that only console applications, not windowed applications, would ever +want to send a <tt>CTRL_C_EVENT</tt>. (More Microsoft brain damage.) +</p> + +<h2><a name="8">8. Commands from xboard to the engine</a></h2> + +<p> +All commands from xboard to the engine end with a newline (\n), even +where that is not explicitly stated. All your output to xboard must +be in complete lines; any form of prompt or partial line will cause +problems. +</p> + +<p> +At the beginning of each game, xboard sends an initialization string. +This is currently "new\nrandom\n" unless the user changes it with the +initString or secondInitString option. +</p> + +<p> +xboard normally reuses the same chess engine process for multiple +games. At the end of a game, xboard will send the +"force" command (see +below) to make sure your engine stops thinking about the current +position. It will later send the initString again to start a new +game. If your engine can't play multiple games, give xboard the +-xreuse (or -xreuse2) command line option to disable reuse. xboard +will then ask the process to quit after each game and start a new +process for the next game. +</p> + +<dl> +<dt><strong>xboard</strong> +<dd>This command will be sent once immediately after your engine +process is started. You can use it to put your engine into "xboard +mode" if that is needed. If your engine prints a prompt to ask for +user input, you must turn off the prompt and output a newline when the +"xboard" command comes in. +<p> + +<dt><strong>new</strong> +<dd>Reset the board to the standard chess starting position. Set +White on move. Leave force mode and set the engine to play Black. +Associate the engine's clock with Black and the opponent's clock with +White. Reset clocks and time controls to the start of a new game. +Stop clocks. Do not ponder on this move, even if pondering is on. +Remove any search depth limit previously set by the sd command. +<p> + +<dt><strong>variant VARNAME</strong> +<dd>If the game is not standard chess, but a variant, this command is +sent after "new" and before the first move or "edit" command. Currently +defined variant names are: + +<table> +<tr align="left"><th>wildcastle<td>Shuffle chess where king can castle from d file +<tr align="left"><th>nocastle<td>Shuffle chess with no castling at all +<tr align="left"><th>fischerandom<td>FischeRandom (not supported yet) +<tr align="left"><th>bughouse<td>Bughouse, ICC/FICS rules +<tr align="left"><th>crazyhouse<td>Crazyhouse, ICC/FICS rules +<tr align="left"><th>losers<td>Win by losing all pieces or getting mated (ICC) +<tr align="left"><th>suicide<td>Win by losing all pieces including king (FICS) +<tr align="left"><th>twokings<td>Weird ICC wild 9 +<tr align="left"><th>kriegspiel<td>Kriegspiel (not really supported) +<tr align="left"><th>atomic<td>Atomic (not really supported) +<tr align="left"><th>3check<td>Win by giving check 3 times (not supported) +<tr align="left"><th>unknown<td>Unknown variant (not supported) +</table> +<p> + +<dt><strong>quit</strong> +<dd>The chess engine should immediately exit. This command is used +when xboard is itself exiting, and also between games if the -xreuse +command line option is given (or -xreuse2 for the second engine). +See also <a href="#7">Signals</a> above. +<p> + +<dt><strong>random</strong> +<dd>This command is specific to GNU Chess. You can either ignore it +completely (that is, treat it as a no-op) or implement it as GNU Chess +does. The command toggles "random" mode (that is, it sets random = +!random). In random mode, the engine adds a small random value to its +evaluation function to vary its play. The "new" command sets random +mode off. +<p> + +<dt><strong>force</strong> +<dd>Set the engine to play neither color ("force mode"). Stop clocks. +The engine should check that moves received in force mode are legal +and made in the proper turn, but should not think, ponder, or make +moves of its own. +<p> + +<dt><strong>white</strong> +<dd>Set White on move. Set the engine to play Black. Stop clocks. +<p> + +<dt><strong>black</strong> +<dd>Set Black on move. Set the engine to play White. Stop clocks. +<p> + +<dt><strong>level MPS BASE INC</strong> +<dd>Set time controls. See the <a href="#11">Time Control</a> section below. +<p> + +<dt><strong>st TIME</strong> +<dd>Set time controls. See the <a href="#11">Time Control</a> section +below. The commands "level" and "st" are not used together. +<p> + +<dt><strong>sd DEPTH</strong> +<dd>The engine should limit its thinking to DEPTH ply. +<p> + +<dt><strong>time N</strong> +<dd>Set a clock that always belongs to the engine. N is a number in + centiseconds (units of 1/100 second). Even if the engine changes to + playing the opposite color, this clock remains with the engine. +<p> + +<dt><strong>otim N</strong> + +<dd>Set a clock that always belongs to the opponent. N is a number in +centiseconds (units of 1/100 second). Even if the opponent changes to +playing the opposite color, this clock remains with the opponent. +<p> +If needed for purposes of board display in force mode (where the +engine is not participating in the game) the time clock should be +associated with the last color that the engine was set to play, the +otim clock with the opposite color. +</p> + +<p> +If you can't handle the time and otim commands, you can ignore them +(that is, treat them as no-ops); or better, send back "Error (unknown +command): time" the first time you see "time", and xboard will realize +you don't implement the command. +</p> + +<dt><strong>go</strong> + +<dd>Leave force mode and set the engine to play the color that is on +move. Associate the engine's clock with the color that is on move, +the opponent's clock with the opposite color. Start the engine's +clock. Start thinking and eventually make a move. +<p> + +<dt><strong>MOVE</strong> +<dd>See below for the syntax of moves. If the move is illegal, print +an error message; see the section "<a href="#9">Commands from the engine to +xboard</a>". If the move is legal and in turn, make it. If not in force +mode, stop the opponent's clock, start the engine's clock, start +thinking, and eventually make a move. +<p> +When xboard sends your engine a move, it always sends coordinate +algebraic notation. There is no command name; the notation is just +sent as a line by itself. Examples: +<p> +<table> +<tr align="left"><td>Normal moves:<td>e2e4 +<tr align="left"><td>Pawn promotion:<td>e7e8q +<tr align="left"><td>Castling:<td>e1g1, e1c1, e8g8, e8c8 +<tr align="left"><td>Bughouse drop:<td>P@h3 +<tr align="left"><td>ICS Wild 0/1 castling:<td>d1f1, d1b1, d8f8, d8b8 +<tr align="left"><td>FischerRandom castling:<td>o-o, o-o-o (future) +</table> + +<p> +If your engine can't handle this kind of output, change the routine +SendMoveToProgram in backend.c to send the kind of notation you need. +If you define SAN_TO_PROGRAM, your engine will be sent Standard +Algebraic Notation (as defined by the PGN standard); for example, e4, +Nf3, exd5, Bxf7+, Qxf7#, e8=Q, O-O, or P@h3. (The P@h3 notation is a +nonstandard extension to SAN.) In the future, I may make +SAN_TO_PROGRAM a runtime option if there is demand for it. +</p> + +<p> +xboard doesn't reliably detect illegal moves, because it does not keep +track of castling unavailablity due to king or rook moves, or en +passant availability. If xboard sends an illegal move, send back an +error message so that xboard can retract it and inform the user; see +the section "<a href="#9">Commands from the engine to xboard</a>". +</p> + +<dt><strong>?</strong> +<dd>Move now. If your engine is thinking, it should move immediately; + otherwise, the command should be ignored (treated as a no-op). It + is permissible for your engine to always ignore the ? command. The + only bad consequence is that xboard's Move Now menu command will do + nothing. +<p> +It is also permissible for your engine to move immediately if it gets +any command while thinking, as long as it processes the command right +after moving, but it's preferable if you don't do this. For example, +xboard may send post, nopost, easy, hard, force, or quit while the +engine is on move. +</p> + +<dt><strong>draw</strong> +<dd>The engine's opponent offers the engine a draw. To accept the +draw, send "offer draw". To decline, ignore the offer (that is, send +nothing). If you're playing on ICS, it's possible for the draw offer +to have been withdrawn by the time you accept it, so don't assume the +game is over because you accept a draw offer. Continue playing until +xboard tells you the game is over. See also "offer draw" below. +<p> + +<dt><strong>result RESULT {COMMENT}</strong> +<dd>After the end of each game, xboard will send you a result command. +You can use this command to trigger learning. RESULT is either 1-0, +0-1, 1/2-1/2, or *, indicating whether white won, black won, the game +was a draw, or the game was unfinished. The COMMENT string is purely +a human-readable comment; its content is unspecified and subject to +change. In ICS mode, it is passed through from ICS uninterpreted. +Example: <pre>result 1-0 {White mates}</pre> +<p> +Here are some notes on interpreting the "result" command. Some apply +only to playing on ICS ("Zippy" mode). +</p> + +<p> +If you won but did not just play a mate, your opponent must have +resigned or forfeited. If you lost but were not just mated, you +probably forfeited on time, or perhaps the operator resigned manually. +If there was a draw for some nonobvious reason, perhaps your opponent +called your flag when he had insufficient mating material (or vice +versa), or perhaps the operator agreed to a draw manually. +</p> + +<p> +You will get a result command even if you already know the game ended +-- for example, after you just checkmated your opponent. In fact, if +you send the "RESULT {COMMENT}" command (discussed below), you will +simply get the same thing fed back to you with "result" tacked in +front. You might not always get a "result *" command, however. In +particular, you won't get one in local chess engine mode when the user +stops playing by selecting Reset, Edit Game, Exit or the like. +</p> + +<dt><strong>edit</strong> +<dd>The edit command puts the chess engine into a special mode, where +it accepts the following subcommands: +<table> +<tr align="left"><th>c<td>change current piece color, initially white +<tr align="left"><th>Pa4 (for example)<td>place pawn of current color on a4 +<tr align="left"><th>xa4 (for example)<td>empty the square a4 (not used by xboard) +<tr align="left"><th>#<td>clear board +<tr align="left"><th>.<td>leave edit mode +</table> + +<p>The edit command does not change the side to move. To set up a +black-on-move position, xboard uses the following command sequence: +</p> +<pre> + new + force + a2a3 + edit + <edit commands> + . +</pre> + +<p> +This sequence is used for compatibility with engines that do not +interpret the "black" command according to the specification above; +see "<a href="#13">Idioms</a>" below. +</p> + +<p> +After an edit command is complete, if a king and a rook are on their +home squares, castling is assumed to be available to them. En passant +capture is assumed to be illegal on the current move regardless of the +positions of the pawns. The clock for the 50 move rule starts at +zero, and for purposes of the draw by repetition rule, no prior +positions are deemed to have occurred. +</p> + +<dt><strong>hint</strong> +<dd>If the user asks for a hint, xboard sends your engine the command +"hint". Your engine should respond with "Hint: xxx", where xxx is a +suggested move. If there is no move to suggest, you can ignore the +hint command (that is, treat it as a no-op). +<p> + +<dt><strong>bk</strong> +<dd>If the user selects "Book" from the xboard menu, xboard will send +your engine the command "bk". You can send any text you like as the +response, as long as each line begins with a blank space or tab (\t) +character, and you send an empty line at the end. The text pops up in +a modal information dialog. +<p> + +<dt><strong>undo</strong> +<dd>If the user asks to back up one move, xboard will send you the +"undo" command. xboard will not send this command without putting you +in "force" mode first, so you don't have to worry about what should +happen if the user asks to undo a move your engine made. (GNU Chess +actually switches to playing the opposite color in this case.) +<p> + +<dt><strong>remove</strong> +<dd>If the user asks to retract a move, xboard will send you the +"remove" command. It sends this command only when the user is on +move. Your engine should undo the last two moves (one for each +player) and continue playing the same color. +<p> + +<dt><strong>hard</strong> +<dd>Turn on pondering (thinking on the opponent's time, also known as +"permanent brain"). xboard will not make any assumption about what +your default is for pondering or whether "new" affects this setting. +<p> + +<dt><strong>easy</strong> +<dd>Turn off pondering. +<p> + +<dt><strong>post</strong> +<dd>Turn on thinking/pondering output. +See <a href="#10">Thinking Output</a> section. +<p> + +<dt><strong>nopost</strong> +<dd>Turn off thinking/pondering output. +<p> + +<dt><strong>analyze</strong> +<dd>Enter analyze mode. See <a href="#12">Analyze Mode</a> section. +</dl> + +<h3>Here are some special commands for Zippy mode:</h3> + +<dl> +<dt><strong>name X</strong> +<dd>In ICS mode, xboard obtains the name of its opponent from ICS when +a game starts and saves it for use in the PGN tags. In Zippy mode, it +also passes the opponent's name on to the chess engine with the name +command. Example: <pre>name mann</pre> + +<dt><strong>rating</strong> +<dd>In ICS mode, xboard obtains the ICS opponent's rating from the +"Creating:" message that appears before each game. (This message may +not appear on servers using outdated versions of the FICS code.) In +Zippy mode, it sends these ratings on to the chess engine using the +"rating" command. The chess engine's own rating comes first, and if +either opponent is not rated, his rating is given as 0. Example: +<pre>rating 2600 1500</pre> + +<dt><strong>computer</strong> +<dd>The opponent is on the ICS computer list. +</dl> + +<h3>Bughouse commands:</h3> + +<p> +xboard now supports bughouse engines when in Zippy mode. See +<a href="http://www.tim-mann.org/xboard/zippy.README" +>zippy.README</a> for information on Zippy mode and how to turn on the +bughouse support. The bughouse move format is given above. xboard +sends the following additional commands to the engine when in bughouse +mode. Commands to inform your engine of the partner's game state may +be added in the future. +</p> + +<dl> +<dt><strong>partner <player></strong> +<dd><player> is now your partner for future games. Example: <pre>partner mann</pre> +<p> + +<dt><strong>partner</strong> +<dd>Meaning: You no longer have a partner. +<p> + +<dt><strong>ptell <text></strong> +<dd>Your partner told you <text>, either with a ptell or an ordinary tell. +<p> + +<dt><strong>holding [<white>] [<black>]</strong> +<dd>White currently holds <white>; black currently holds <black>. + Example: <pre>holding [PPPRQ] []</pre> + +<dt><strong>holding [<white>] [<black>] <color><piece></strong> +<dd>White currently holds <white>; black currently holds <black>, after + <color> acquired <piece>. Example: <pre>holding [PPPRQ] [R] BR</pre> +</dl> + +<h2><a name="9">9. Commands from the engine to xboard</a></h2> + +<dl> +<dt><strong>Illegal move: MOVE</strong> +<dt><strong>Illegal move (REASON): MOVE</strong> +<dd>If your engine receives a MOVE command that is recognizably a move +but is not legal in the current position, your engine must print an +error message in one of the above formats so that xboard can pass the +error on to the user and retract the move. The (REASON) is entirely +optional. Examples: + +<pre> + Illegal move: e2e4 + Illegal move (in check): Nf3 + Illegal move (moving into check): e1g1 +</pre> +<p> +Generally, xboard will never send an ambiguous move, so it does not +matter whether you respond to such a move with an Illegal move message +or an Error message. +</p> + +<dt><strong>Error (ERRORTYPE): COMMAND</strong> +<dd>If your engine receives a command it does not understand or does +not implement, it should print an error message in the above format so +that xboard can parse it. Examples: +<pre> + Error (ambiguous move): Nf3 + Error (unknown command): analyze + Error (command not legal now): undo + Error (too many parameters): level 1 2 3 4 5 6 7 +</pre> + +<p> +Note: versions of xboard prior to 3.6.11beta do not parse the "Error" +format. To ease the transition, it is acceptable to use the "Illegal +move" format for all errors, even if the command given was not a +move. +</p> + +<dt><strong>move MOVE</strong> +<dd>Your engine is making the move MOVE. Do not echo moves from + xboard with this command; send only new moves made by the engine. + +<p> +Note: versions of xboard prior to 3.6.11beta do not parse the above +format, so you may want to use the old "NUMBER ... MOVE" format +temporarily. See the section "<a href="#13">Idioms and backward +compatibility features</a>" below. +</p> + +<p> +For the actual move text from your chess engine (in place of MOVE +above), xboard will accept any kind of unambiguous algebraic format, +including coordinate notation, SAN, and some slight variants of SAN. +You don't have to send the pure coordinate notation that xboard sends +to your engine; xboard parses the output with its general-purpose +move parser, which was built to extract human-typed game scores from +netnews messages. For example, the following will all work: +</p> +<pre> + e2e4 + e4 + Nf3 + ed + exd + exd5 + Nxd5 + Nfd3 + e8q + e8Q + e8=q + e8(Q) + e7e8q + o-o + O-O + 0-0 +</pre> + +<p> +and many more. +</p> + +<dt><strong>RESULT {COMMENT}</strong> +<dd>When your engine detects that the game has ended by rule +(checkmate, stalemate, triple repetition, the 50 move rule, or +insufficient material), your engine must output a line of the form +"RESULT {comment}" (without the quotes), where RESULT is a PGN result +code (1-0, 0-1, or 1/2-1/2), and comment is the reason. Examples: +<pre> + 0-1 {Black mates} + 1-0 {White mates} + 1/2-1/2 {Draw by repetition} + 1/2-1/2 {Stalemate} +</pre> + +<p> +xboard relays the result to the user, the ICS, the other engine in Two +Machines mode, and the PGN save file as required. +</p> + +<dt><strong>resign</strong> +<dd>If your engine wants to resign, it can send the command "resign". +Alternatively, it can use the "RESULT {comment}" command if the string +"resign" is included in the comment; for example "0-1 {White +resigns}". xboard relays the resignation to the user, the ICS, the +other engine in Two Machines mode, and the PGN save file as required. +<p> + +<dt><strong>offer draw</strong> +<dd>If your engine wants to offer a draw by agreement (as opposed to +claiming a draw by rule), it can send the command "offer draw". +xboard relays the offer to the user, the ICS, the other engine in Two +Machines mode, and the PGN save file as required. In Machine White, +Machine Black, or Two Machines mode, the offer is considered valid +until your engine has made two more moves. +<p> + +<dt><strong>telluser MESSAGE</strong> +<dd>xboard pops up a modal information dialog containing the message. +MESSAGE consists of any characters, including whitespace, to the end +of the line. +<p> + +<dt><strong>tellusererror MESSAGE</strong> +<dd>xboard pops up a non-modal error dialog containing the message. +MESSAGE consists of any characters, including whitespace, to the end +of the line. +<p> + +<dt><strong>askuser REPTAG MESSAGE</strong> +<dd>Here REPTAG is a string containing no whitespace, and MESSAGE +consists of any characters, including whitespace, to the end of the +line. xboard pops up a modal question dialog that says MESSAGE and +has a typein box. If the user types in "bar", xboard sends "REPTAG +bar" to the engine. The user can cancel the dialog and send nothing. +<p> + +<dt><strong>tellics MESSAGE</strong> +<dd>In Zippy mode, xboard sends "MESSAGE\n" to ICS. MESSAGE consists +of any characters, including whitespace, to the end of the line. + +</dl> + +<h2><a name="10">10. Thinking Output</a></h2> + +<p> +If the user asks your engine to "show thinking", xboard sends your +engine the "post" command. It sends "nopost" to turn thinking off. +In post mode, your engine sends output lines to show the progress of +its thinking. The engine can send as many or few of these lines as it +wants to, whenever it wants to. Typically they would be sent when the +PV (principal variation) changes or the depth changes. The thinking +output should be in the following format: +</p> + +<pre>ply score time nodes pv</pre> + +Where: +<table> +<tr align="left"><th>ply<td>Integer giving current search depth. +<tr align="left"><th>score<td>Integer giving current evaluation in centipawns. +<tr align="left"><th>time<td>Current search time in centiseconds (ex: +1028 = 10.28 seconds). + +<tr align="left"><th>nodes<td>Nodes searched. +<tr align="left"><th>pv<td>Freeform text giving current "best" line. +You can continue the pv onto another line if you start each +continuation line with at least four space characters. +</table> + +<p> +Example: +</p> + +<pre> 9 156 1084 48000 Nf3 Nc6 Nc3 Nf6</pre> + +<p> +Meaning: +</p> + +9 ply, score=1.56, time = 10.84 seconds, nodes=48000, +PV = "Nf3 Nc6 Nc3 Nf6" + +<p> +Longer example from actual Crafty output: +</p> +<pre> + 4 109 14 1435 1. e4 d5 2. Qf3 dxe4 3. Qxe4 Nc6 + 4 116 23 2252 1. Nf3 Nc6 2. e4 e6 + 4 116 27 2589 1. Nf3 Nc6 2. e4 e6 + 5 141 44 4539 1. Nf3 Nc6 2. O-O e5 3. e4 + 5 141 54 5568 1. Nf3 Nc6 2. O-O e5 3. e4 +</pre> + +<p> +You can use the PV to show other things; for instance, while in book, +Crafty shows the observed frequency of different reply moves in its +book. In situations like this where your engine is not really +searching, start the PV with a '(' character: +</p> + +<pre> + 0 0 0 0 (e4 64%, d4 24%) +</pre> + +<p> +GNU Chess output is very slightly different. The ply number is +followed by an extra nonblank character, and the time is in seconds, +not hundredths of seconds. For compatibility, xboard accepts the +extra character and takes it as a flag indicating the different time +units. Example: +</p> + +<pre> + 2. 14 0 38 d1d2 e8e7 + 3+ 78 0 65 d1d2 e8e7 d2d3 + 3& 14 0 89 d1d2 e8e7 d2d3 + 3& 76 0 191 d1e2 e8e7 e2e3 + 3. 76 0 215 d1e2 e8e7 e2e3 + 4& 15 0 366 d1e2 e8e7 e2e3 e7e6 + 4. 15 0 515 d1e2 e8e7 e2e3 e7e6 + 5+ 74 0 702 d1e2 f7f5 e2e3 e8e7 e3f4 + 5& 71 0 1085 d1e2 e8e7 e2e3 e7e6 e3f4 + 5. 71 0 1669 d1e2 e8e7 e2e3 e7e6 e3f4 + 6& 48 0 3035 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 + 6. 48 0 3720 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 + 7& 48 0 6381 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 + 7. 48 0 10056 d1e2 e8e7 e2e3 e7e6 e3e4 f7f5 e4d4 + 8& 66 1 20536 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5 + 8. 66 1 24387 d1e2 e8e7 e2e3 e7e6 e3d4 g7g5 a2a4 f7f5 + 9& 62 2 38886 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4 + d4e4 + 9. 62 4 72578 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 a2a4 h5h4 + d4e4 +10& 34 7 135944 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4 + d4e4 f7f5 e4f4 +10. 34 9 173474 d1e2 e8e7 e2e3 e7e6 e3d4 h7h5 c2c4 h5h4 + d4e4 f7f5 e4f4 +</pre> + +<p>If your engine is pondering (thinking on its opponent's time) in post +mode, it can show its thinking then too. In this case your engine may +omit the hint move (the move it is assuming its opponent will make) +from the thinking lines <em>if and only if</em> it sends xboard the move in +the usual "Hint: xxx" format before sending the first line. +</p> + +<h2><a name="11">11. Time control</a></h2> + +<p> +xboard supports three styles of time control: conventional chess clocks, +the ICS-style incremental clock, and an exact number of seconds per move. +</p> + +<p>In conventional clock mode, every time control period is the same. +That is, if the time control is 40 moves in 5 minutes, then after each +side has made 40 moves, they each get an additional 5 minutes, and so +on, ad infinitum. At some future time it would be nice to support a +series of distinct time controls. This is very low on my personal +priority list, but code donations to the xboard project are accepted, +so feel free to take a swing at it. I suggest you talk to me first, +though. +</p> + +<p> +The command to set a conventional time control looks like this: +</p> + +<pre> + level 40 5 0 + level 40 0:30 0 +</pre> + +<p> +The 40 means that there are 40 moves per time control. The 5 means +there are 5 minutes in the control. In the second example, the 0:30 +means there are 30 seconds. The final 0 means that we are in +conventional clock mode. +</p> + +<p> +The command to set an incremental time control looks like this: +</p> + +<pre> + level 0 2 12 +</pre> + +<p> +Here the 0 means "play the whole game in this time control period", +the 2 means "base=2 minutes", and the 12 means "inc=12 seconds". As +in conventional clock mode, the second argument to level can be in +minutes and seconds. +</p> + +<p> +At the start of the game, each player's clock is set to base minutes. +Immediately after a player makes a move, inc seconds are added to his +clock. A player's clock counts down while it is his turn. Your flag +can be called whenever your clock is zero or negative. (Your clock +can go negative and then become positive again because of the +increment.) +</p> + +<p> +A special ICS rule: if you ask for a game with base=0, the clocks +really start at 10 seconds instead of 0. xboard itself does not know +about this rule currently, so it may pass the 0 on to the engine +instead of changing it to 0:10. +</p> + +<p> +ICS also has time odds games. With time odds, each player has his own +(base, inc) pair, but otherwise things work the same as in normal +games. The Zippy xboard accepts time odds games but ignores the fact +that the opponent's parameters are different; this is perhaps not +quite the right thing to do, but gnuchess doesn't understand time +odds. Time odds games are always unrated. +</p> + +<p>The command to set an exact number of seconds per move looks like this: +</p> + +<pre> + st 30 +</pre> + +<p> +This means that each move must be made in 30 seconds. Time not used +on one move does not accumulate for use on later moves. +</p> + +<h2><a name="12">12. Analyze Mode</a></h2> + +<p>xboard supports analyzing fresh games, edited positions, and games +from files. However, all of these look the same from the chess +engine's perspective. Basically, the engine just has to respond to the +"analyze" command. If your engine does not support analyze mode, it +should print the error message "Error (unknown command): analyze" in +response to the "analyze" command. +</p> + +<p> +To enter analyze mode, xboard sends the command sequence "post", +"white" or "black", "analyze". Analyze mode in your engine should be +similar to force mode, except that your engine thinks about what move +it would make next if it were on move. Your engine should accept the +following commands while in analyze mode: +</p> + +<ul> +<li>Any legal move, as in force mode +<li>"undo" +<li>"new" (reset position to start of game but stay in analyze mode) +<li>"edit" (exiting edit mode returns to analyze mode) +<li>"exit" (leave analyze mode) +<li>"." (optional, see below) +</ul> + +<p> +If the user selects "Periodic Updates", xboard will send the string +".\n" to the chess engine periodically during analyze mode, unless the +last PV received began with a '(' character. +</p> + +<p> +The chess engine should respond to ".\n" with a line like this: +</p> + +<pre> +stat01: time nodes ply mvleft mvtot +</pre> + +Where: +<table> +<tr align="left"><th>time<td>Elapsed search time in centiseconds (ie: 567 = 5.67 seconds). +<tr align="left"><th>nodes<td>Nodes searched so far. +<tr align="left"><th>ply<td>Search depth so far. +<tr align="left"><th>mvleft<td>Number of moves left to consider at this depth. +<tr align="left"><th>mvtot<td>Total number of moves to consider. +</table> + +<p> +Example: +</p> +<pre> + stat01: 1234 30000 7 5 30 +</pre> + +<p> +Meaning: +</p> + +<p>After 12.34 seconds, I've searched 7 ply/30000 nodes, there are a + total of 30 legal moves, and I have 5 more moves to search + before going to depth 8.</p> + +<p> +Implementation of the "." command is OPTIONAL. If the engine does not +respond to the "." command with a "stat01..." line, xboard will stop +sending "." commands. If the engine does not implement this command, +the analysis window will use a shortened format to display the engine +info. +</p> + +<p> +To give the user some extra information, the chess engine can output +the strings "++\n" and "--\n", to indicate that the current search is +failing high or low, respectively. You don't have to send anything +else to say "Okay, I'm not failing high/low anymore." xboard will +figure this out itself. +</p> + +<h2><a name="13">13. Idioms and backward compatibility features</a></h2> + +<p> +Some engines have variant interpretations of the force/go/white/black, +time/otim, and hard/easy command sets. New engines should not use +these interpretations, but in order to accommodate existing engines, +xboard is currently very conservative about how it uses these +commands. Only the following idioms are currently used. +</p> + +<dl> + +<dt><strong>white</strong> +<dt><strong>go</strong> +<dd>Sent when the engine is in force mode or playing Black but should +switch to playing White. This sequence is sent only when White is +already on move. +<p> + +<dt><strong>black</strong> +<dt><strong>go</strong> +<dd>Sent when the engine is in force mode or playing White but should +switch to playing Black. This sequence is sent only when Black is +already on move. +<p> + +<dt><strong>time N</strong> +<dt><strong>otim N</strong> +<dt><strong>MOVE</strong> +<dd>Sent when the opponent makes a move and the engine is already +playing the opposite color. +<p> + +<dt><strong>white</strong> +<dt><strong>time N</strong> +<dt><strong>otim N</strong> +<dt><strong>black</strong> +<dt><strong>go</strong> +<dd>Sent when Black is on move, the engine is in force mode or playing +White, and the engine's clock needs to be updated before it starts +playing. The initial "white" is a kludge to accommodate GNU Chess +4.0.77's variant interpretation of these commands. It may be removed +in the future, especially if it causes problems for other engines. +<p> + +<dt><strong>black</strong> +<dt><strong>time N</strong> +<dt><strong>otim N</strong> +<dt><strong>white</strong> +<dt><strong>go</strong> +<dd>Sent when White is on move, the engine is in force mode or playing +Black, and the engine's clock needs to be updated before it starts +playing. See previous idiom. +<p> + +<dt><strong>hard</strong> +<dt><strong>easy</strong> +<dd>Sent in sequence to turn off pondering if xboard is not sure +whether it is on. When xboard is sure, it will send "hard" or "easy" +alone. xboard does this because "easy" is a toggle in GNU Chess but +"hard" is an absolute on. + +</dl> + +<p> +To support older engines, certain additional commands from the engine +to xboard are also recognized. (These are commands by themselves, not +values to be placed in the comment field of the PGN result code.) +These forms are not recommended for new engines; use the PGN result +code commands or the resign command instead: +</p> + +<table> +<tr align="left"><th>Command <th>Interpreted as +<tr align="left"><td>White resigns <td>0-1 {White resigns} +<tr align="left"><td>Black resigns <td>1-0 {Black resigns} +<tr align="left"><td>White <td>1-0 {White mates} +<tr align="left"><td>Black <td>0-1 {Black mates} +<tr align="left"><td>Draw <td>1/2-1/2 {Draw} +<tr align="left"><td>computer mates <td>1-0 {White mates} or 0-1 {Black mates} +<tr align="left"><td>opponent mates <td>1-0 {White mates} or 0-1 {Black mates} +<tr align="left"><td>computer resigns <td>0-1 {White resigns} or 1-0 {Black resigns} +<tr align="left"><td>game is a draw <td>1/2-1/2 {Draw} +<tr align="left"><td>checkmate <td>1-0 {White mates} or 0-1 {Black mates} +</table> + +<p> +Commands in the above table are recognized if they begin a line and +arbitrary characters follow, so (for example) "White mates" will be +recognized as "White", and "game is a draw by the 50 move rule" will +be recognized as "game is a draw". All the commands are +case-sensitive. +</p> + +<p> +An alternative move syntax is also recognized: +</p> + +<table> +<tr align="left"><th>Command <th>Interpreted as +<tr align="left"><td>NUMBER ... MOVE <td>move MOVE +</table> + +<p> +Here NUMBER means any string of decimal digits, optionally ending in a +period. MOVE is any string containing no whitespace. In this command +format, xboard requires the "..." even if your engine is playing +White. A command of the form NUMBER MOVE will be ignored. This odd +treatment of the commands is needed for compatibility with gnuchessx. +The original reasons for it are lost in the mists of time, but I +suspect it was originally a bug in the earliest versions of xboard, +before I started working on it, which someone "fixed" in the wrong +way, by creating a special version of gnuchess (gnuchessx) instead of +changing xboard. +</p> + +<p> +Any line that contains the words "offer" and "draw" is recognized as +"offer draw". +</p> + +<p> +The "Illegal move" message is recognized even if spelled "illegal +move" and even if the colon (":") is omitted. This accommodates GNU +Chess 4.0.77, which prints messages like "Illegal move (no matching +move)e2e4", and old versions of Crafty, which print just "illegal move". +</p> + +<p> +In Zippy mode, for compatibility with existing versions of Crafty, +xboard passes through to ICS any line that begins "kibitz", "whisper", +"tell", or "draw". Do not use this feature in new code. +</p> + +<p> +Before the "sd DEPTH" command, xboard also sends the command +"depth\nDEPTH", for the benefit of GNU Chess. Note the newline in the +middle of this command. Ugh. +</p> + +<p> +For the benefit of GNU Chess, if an "st TIME"-style time control is +being used, TIME is also given to the engine as a command-line +argument when it is started. Ugh. +</p> + +<hr noshade size="2"> +<address>converted to HTML by <a href="http://www.jakob.at/steffen/">Steffen A. Jakob</a></address> +</body> +</html> |
