From 10acef9e6f2d1f56a39c7f4b9ccf4b4be6f8bed7 Mon Sep 17 00:00:00 2001 From: Scott Gasch Date: Wed, 1 Jun 2016 19:04:57 -0700 Subject: A bunch of chess-related papers. --- programs/ComputerEloList | 197 + programs/FewBits | 252 + programs/PCratings | 30 + programs/SSDF-RatingList | 994 ++++ programs/engine-intf.html | 1895 +++++++ programs/harvar93.txt | 519 ++ programs/minimax.bib | 1338 +++++ programs/minimax.dvi | Bin 0 -> 32832 bytes programs/pentopt.htm | 6723 ++++++++++++++++++++++++ programs/testsuites | 2 + programs/uniacke.ps | 12175 ++++++++++++++++++++++++++++++++++++++++++++ programs/xboard.html | 1300 +++++ 12 files changed, 25425 insertions(+) create mode 100644 programs/ComputerEloList create mode 100644 programs/FewBits create mode 100644 programs/PCratings create mode 100644 programs/SSDF-RatingList create mode 100644 programs/engine-intf.html create mode 100644 programs/harvar93.txt create mode 100644 programs/minimax.bib create mode 100644 programs/minimax.dvi create mode 100644 programs/pentopt.htm create mode 100644 programs/testsuites create mode 100644 programs/uniacke.ps create mode 100644 programs/xboard.html (limited to 'programs') 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: TDR@PROVAX.intel.com (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: +- pigeons@JSP.UMontreal.CA (Steven Pigeon) +- jn@inf.ethz.ch (J Nievergelt) +- chess@uni-paderborn.de (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: TDR@PROVAX.intel.com (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: jn@inf.ethz.ch (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: ralf@ark.abg.sub.org (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 @@ + + +Chess Engine Communication Protocol + + + +
+

Chess Engine Communication Protocol

+

Tim Mann

+

+$Id: engine-intf.html,v 2.1 2003/10/27 19:21:00 mann Exp $
+Version 2; implemented in xboard/WinBoard 4.2.1 and later.
+Changes since version 1 are indicated in red. +


+ + + +
+ +

1. Introduction

+ +

+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. +

+ +

+There are two reasons I can imagine someone wanting to do this: +

+
    +
  1. You have, or are developing, a chess engine but you don't want to +write your own graphical interface. +
  2. You have, or are developing,a chess engine, and you want to +interface it to the Internet Chess Server. +
+ +

+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 zippy.README +in the xboard or WinBoard distribution for more information. + +

+ +

+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. +

+ +

+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 http://groups.yahoo.com/group/chess-engines, or you can read the +list there without joining. The list is filtered to prevent spam. +

+ +

2. Connection

+ +

+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 section 6 below. +

+ +

+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 +5 and 6 below for additional details. +

+ +

3. Debugging

+ +

+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. +

+ +

+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. +

+ +

+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. +

+ +

4. How it got this way

+ +

+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. +

+ +

+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. +

+ +

+ +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. + + + +

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. +

+ + +

5. WinBoard requires Win32 engines

+ +

+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 http://sources.redhat.com/cygwin/. 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 sample +code that should help you get started. +

+ +

6. Hints on input/output

+ +

+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 fflush.) 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. +

+ +

+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. +

+ +

+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 +setbuf(stdout, NULL). A more laborious and error-prone +method is to carefully call fflush(stdout) after every line +you output; I don't recommend this. In C++, you can try +cout.setf(ios::unitbuf), which is documented in current +editions of "The C++ Programming Language," but not older ones. +Another C++ method that might work is +cout.rdbuf()->setbuf(NULL, 0). Alternatively, you can +carefully call cout.flush() after every line you output; +again, I don't recommend this. +

+ +

+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 write(1, ...) -- see the man page for write(2). +On Win32, you can use either the Unix-like _write(1, ...) or Win32 +native routines like WriteFile. +

+ +

+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 either characters in the buffer +or characters available from the underlying file descriptor. +

+ +

+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 read(0, ...) to read from standard input, and +use select() 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 _read(0, ...) or the native +Win32 ReadFile() 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 PeekNamedPipe to poll (even when the pipe is unnamed). +For consoles, +you can use GetNumberOfConsoleInputEvents. For sockets only, you can +use select(). It might be possible to use +WaitForSingleObject 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. +

+ +

+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 +setbuf(stdin, NULL). However, I have never tried this. Also, there +could be problems if you use scanf(), at least with certain patterns, +because scanf() 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 cin.rdbuf()->setbuf(NULL, 0), but again, I have never tried +this. +

+ +

+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 +cin.rdbuf()->in_avail(). 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. +

+ +

+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. +

+ +

7. Signals

+ +

Engines that run on Unix need to be concerned with two Unix +signals: SIGTERM and SIGINT. 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. + +Beginning with version 2, you can now turn off the use of +either or both +signals. See the "feature" command in section 9 below. + +

+ +

First, when an engine is sent the "quit" command, it is also given +a SIGTERM 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 +signal(SIGTERM, SIG_IGN) at the start of your program, +or disable it with the "feature" command.

+ +

Second, xboard will send an interrupt signal (SIGINT) 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. +

+ +

+The SIGINTs 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 SIGINT by having your engine call +signal(SIGINT, SIG_IGN), or disable it with the "feature" +command.

+ +

+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 SIGINT 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 SIGINT before the first such command only. +Another SIGINT is not sent until another move is made, even if xboard +issues more commands. This behavior is necessary for GNU Chess 4. The +first SIGINT stops it from pondering until the next move, but on some +systems, GNU Chess 4 will die if it receives a SIGINT when not +actually thinking or pondering. +

+ +

+There are two reasons why WinBoard does not send the Win32 equivalent +of SIGINT (which is called CTRL_C_EVENT) 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 CTRL_C_EVENT. +

+ +

8. Commands from xboard to the engine

+ +

+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. +

+ +

+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. +

+ +

+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 + +either with the "feature" command (beginning in protocol version +2; see below) or + +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. +

+ +
+
xboard +
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. +

+ +

protover N +
+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. + +

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. + +

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. + +

+ +

accepted +
rejected +
+These commands may be sent to your engine in reply to the "feature" +command; see its documentation below. + +

+ +

new +
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. +

+ +

variant VARNAME +
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: + + +
wildcastleShuffle chess where king can castle from d file +
nocastleShuffle chess with no castling at all +
fischerandomFischer Random (not supported yet) +
bughouseBughouse, ICC/FICS rules +
crazyhouseCrazyhouse, ICC/FICS rules +
losersWin by losing all pieces or getting mated (ICC) +
suicideWin by losing all pieces including king, +or by having fewer pieces when one player has no legal moves (FICS) +
giveaway +Win by losing all pieces including king, +or by having no legal moves (ICC) +
twokingsWeird ICC wild 9 +
kriegspielKriegspiel (engines not supported) +
atomicAtomic +
3checkWin by giving check 3 times +
unknownUnknown variant (not supported) +
+

+ +

quit +
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 Signals above. +

+ +

random +
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. +

+ +

force +
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. +

+ +

go +
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. +

+ +

playother +
+ +(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 not 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. + +

+ +

white +
+ +(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.) + +Set White on move. Set the engine to play Black. Stop clocks. +

+ +

black +
+ +(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.) + +Set Black on move. Set the engine to play White. Stop clocks. +

+ +

level MPS BASE INC +
Set time controls. See the Time Control section below. +

+ +

st TIME +
Set time controls. See the Time Control section +below. The commands "level" and "st" are not used together. +

+ +

sd DEPTH +
The engine should limit its thinking to DEPTH ply. +

+ +

time N +
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. +

+ +

otim N + +
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. +

+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. +

+ +

+ +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. + +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". +

+ +
MOVE +
See below for the syntax of moves. If the move is illegal, print +an error message; see the section "Commands from the engine to +xboard". 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. +

+When xboard sends your engine a move, it normally sends coordinate +algebraic notation. Examples: +

+ +
Normal moves:e2e4 +
Pawn promotion:e7e8q +
Castling:e1g1, e1c1, e8g8, e8c8 +
Bughouse/crazyhouse drop:P@h3 +
ICS Wild 0/1 castling:d1f1, d1b1, d8f8, d8b8 +
FischerRandom castling:O-O, O-O-O (oh, not zero) +
+ +

+ +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. + +

+ +

+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 "Commands from the engine to xboard". +

+ +
usermove MOVE +
+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". + +

+ +
? +
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. +

+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, + +or other commands + +while the engine is on move. +

+ +
ping N +
+ +In this command, N is a decimal number. When you receive the command, +reply by sending the string pong N, 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. + +

+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. +

+
+ +
draw +
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. +

+ +

result RESULT {COMMENT} +
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:
result 1-0 {White mates}
+

+Here are some notes on interpreting the "result" command. Some apply +only to playing on ICS ("Zippy" mode). +

+ +

+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. +

+ +

+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. +

+ +
setboard FEN +
+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. + +

Illegal positions: 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.

+
+

+ +

edit +
+ +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. + +The edit command puts the chess engine into a special mode, where +it accepts the following subcommands: + +
cchange current piece color, initially white +
Pa4 (for example)place pawn of current color on a4 +
xa4 (for example)empty the square a4 (not used by xboard) +
#clear board +
.leave edit mode +
+ +See the Idioms section below for additional subcommands used in +ChessBase's implementation of the protocol. + + +

The edit command does not change the side to move. To set up a +black-on-move position, xboard uses the following command sequence: +

+
+    new
+    force
+    a2a3
+    edit
+    <edit commands>
+    .
+
+ +

+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. +

+ +

+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. +

+ +
hint +
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). +

+ +

bk +
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. +

+ +

undo +
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.) +

+ +

remove +
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. +

+ +

hard +
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. +

+ +

easy +
Turn off pondering. +

+ +

post +
Turn on thinking/pondering output. +See Thinking Output section. +

+ +

nopost +
Turn off thinking/pondering output. +

+ +

analyze +
Enter analyze mode. See Analyze Mode section. +

+ +

name X
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. + +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. + +

+ +

rating +
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. + +In the future this command may also be used in other modes, if ratings +are known. + +Example:
rating 2600 1500
+

+ +

ics HOSTNAME +
+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" + +

+ +

computer +
The opponent is also a computer chess engine. Some engines alter +their playing style when they receive this command. +

+ +

pause +
resume +
(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. + +
+ +

Bughouse commands:

+ +

+xboard now supports bughouse engines when in Zippy mode. See +zippy.README 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. +

+ +
+
partner <player> +
<player> is now your partner for future games. Example:
partner mann
+

+ +

partner +
Meaning: You no longer have a partner. +

+ +

ptell <text> +
Your partner told you <text>, either with a ptell or an ordinary tell. +

+ +

holding [<white>] [<black>] +
White currently holds <white>; black currently holds <black>. + Example:
holding [PPPRQ] []
+ +
holding [<white>] [<black>] <color><piece> +
White currently holds <white>; black currently holds <black>, after + <color> acquired <piece>. Example:
holding [PPPRQ] [R] BR
+
+ +

9. Commands from the engine to xboard

+ +

+ +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. + +

+ +
+
+feature FEATURE1=VALUE1 FEATURE2=VALUE2 ... + + +
+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, feature myname="Miracle Chess +0.9"), 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. + +

+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. +

+ +

+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. +

+ +

+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. +

+ +

+Here are the features that are currently defined. +

+
+ +
+
+ping (boolean, default 0, recommended 1) + +
+If ping=1, xboard may use the protocol's new "ping" command; +if ping=0, xboard will not use the command. + + +
+setboard (boolean, default 0, recommended 1) + +
+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. + + +
+playother (boolean, default 0, recommended 1) + +
+If playother=1, xboard will use the protocol's new "playother" command +when appropriate; if playother=0, it will not use the command. + + +
+san (boolean, default 0) + +
+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 +section 8 above for more details of both kinds of notation. + + +
+usermove (boolean, default 0) + +
+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. + + +
+time (boolean, default 1, recommended 1) + +
+If time=1, xboard will send the "time" and "otim" commands to +update the engine's clocks; if time=0, it will not. + + +
+draw (boolean, default 1, recommended 1) + +
+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. + + +
+sigint (boolean, default 1) + +
+If sigint=1, xboard may send SIGINT (the interrupt signal) to +the engine as section 7 above; if sigint=0, it will +not. + + +
+sigterm (boolean, default 1) + +
+If sigterm=1, xboard may send SIGTERM (the termination signal) to +the engine as section 7 above; if sigterm=0, it will +not. + + +
+reuse (boolean, default 1, recommended 1) + +
+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. + + +
+analyze (boolean, default 1, recommended 1) + +
+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. + + +
+myname (string, default determined from engine filename) + +
+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. + + +
+variants (string, see text below) + +
+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 section 8 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. + + +
+colors (boolean, default 1, recommended 0) + +
+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 "Idioms" section +below for details. If colors=0, xboard does not use the "white" and +"black" commands at all. + + +
+ics (boolean, default 0) + +
+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. + + +
+name (boolean, see text below) + +
+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. + + +
+pause (boolean, default 0) + +
+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. + + +
+done (integer, no default) + +
+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. + +
+

+ +

Illegal move: MOVE +
Illegal move (REASON): MOVE +
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: + +
+  Illegal move: e2e4
+  Illegal move (in check): Nf3
+  Illegal move (moving into check): e1g1
+
+

+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. +

+ +
Error (ERRORTYPE): COMMAND +
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: +
+  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
+
+ +
move MOVE +
Your engine is making the move MOVE. Do not echo moves from +xboard with this command; send only new moves made by the engine. + + +

For the actual move text from your chess engine (in place of MOVE +above), your move should be either +

    +
  • in coordinate notation (e.g., +e2e4, e7e8q) with castling indicated by the King's two-square move (e.g., +e1g1), or +
  • 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. +
+xboard itself also accepts some variants of SAN, but for compatibility +with non-xboard interfaces, it is best not to rely on this behavior. +

+ +

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. +

+
+ +
RESULT {COMMENT}
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: +
+  0-1 {Black mates}
+  1-0 {White mates}
+  1/2-1/2 {Draw by repetition}
+  1/2-1/2 {Stalemate}
+
+ +

+xboard relays the result to the user, the ICS, the other engine in Two +Machines mode, and the PGN save file as required. +

+ +
resign +
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. +

+ +

offer draw +
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. +

+ +

tellopponent MESSAGE +
+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. +

+ +

tellothers MESSAGE +
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. +

+ +

tellall MESSAGE +
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. + +

+ +

telluser MESSAGE +
xboard pops up an information dialog containing the message. +MESSAGE consists of any characters, including whitespace, to the end +of the line. +

+ +

tellusererror MESSAGE +
xboard pops up an error dialog containing the message. +MESSAGE consists of any characters, including whitespace, to the end +of the line. +

+ +

askuser REPTAG MESSAGE +
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. +

+ +

tellics MESSAGE +
In Zippy mode, xboard sends "MESSAGE\n" to ICS. MESSAGE consists +of any characters, including whitespace, to the end of the line. +

+ +

tellicsnoalias MESSAGE +
+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. + +
+

+ +

10. Thinking Output

+ +

+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: +

+ +
ply score time nodes pv
+ +Where: + +
plyInteger giving current search depth. +
scoreInteger giving current evaluation in centipawns. +
timeCurrent search time in centiseconds (ex: +1028 = 10.28 seconds). + +
nodesNodes searched. +
pvFreeform 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. +
+ +

+Example: +

+ +
  9 156 1084 48000 Nf3 Nc6 Nc3 Nf6
+ +

+Meaning: +

+ +9 ply, score=1.56, time = 10.84 seconds, nodes=48000, +PV = "Nf3 Nc6 Nc3 Nf6" + +

+Longer example from actual Crafty output: +

+
+  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
+
+ +

+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: +

+ +
+  0      0       0      0  (e4 64%, d4 24%)
+
+ +

+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: +

+ +
+ 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 
+
+ +

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 if and only if it sends xboard the move in +the usual "Hint: xxx" format before sending the first line. +

+ +

11. Time control

+ +

+xboard supports three styles of time control: conventional chess clocks, +the ICS-style incremental clock, and an exact number of seconds per move. +

+ +

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. +

+ +

+The command to set a conventional time control looks like this: +

+ +
+  level 40 5 0
+  level 40 0:30 0
+
+ +

+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. +

+ +

+The command to set an incremental time control looks like this: +

+ +
+  level 0 2 12
+
+ +

+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. +

+ +

+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.) +

+ +

+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. +

+ +

+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. +

+ +

+The command to set an exact number of seconds per move looks like this: +

+ +
+  st 30
+
+ +

+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. +

+ +

12. Analyze Mode

+ +

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. + +Beginning in protocol version 2, +if your engine does not support analyze mode, it should use +the feature command to set analyze=0. + +The older method of +printing the error message "Error (unknown command): analyze" in +response to the "analyze" command will also work, however. +

+ +

+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: +

+ + + +

+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. +

+ +

+The chess engine should respond to ".\n" with a line like this: +

+ +
+stat01: time nodes ply mvleft mvtot mvname
+
+ +Where: + +
timeElapsed search time in centiseconds (ie: 567 = 5.67 seconds). +
nodesNodes searched so far. +
plySearch depth so far. +
mvleftNumber of moves left to consider at this depth. +
mvtotTotal number of moves to consider. +
mvname +Move currently being considered (SAN or coordinate notation). Optional; +added in protocol version 2. +
+ +

+Examples: +

+
+  stat01: 1234 30000 7 5 30
+  stat01: 1234 30000 7 5 30 Nf3
+
+ +

+Meaning: +

+ +

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.

+ +

+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. +

+ +

+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. +

+ +

13. Idioms and backward compatibility features

+ +

+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. +

+ +
+ +
time N +
otim N +
MOVE +
Sent when the opponent makes a move and the engine is already +playing the opposite color. +

+ +

white +
go +
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. + +If you set the feature colors=0, "white" is not sent. + +

+ +

black +
go +
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. + +If you set the feature colors=0, "black" is not sent. + +

+ +

white +
time N +
otim N +
black +
go +
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. + +If you set the feature colors=0, "white" and "black" are not sent. + +

+ +

black +
time N +
otim N +
white +
go +
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. + +If you set the feature colors=0, "black" and "white" are not sent. + +

+ +

hard +
easy +
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. + +
+ +

+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. +

+ + +
Command Interpreted as +
White resigns 0-1 {White resigns} +
Black resigns 1-0 {Black resigns} +
White 1-0 {White mates} +
Black 0-1 {Black mates} +
Draw 1/2-1/2 {Draw} +
computer mates 1-0 {White mates} or 0-1 {Black mates} +
opponent mates 1-0 {White mates} or 0-1 {Black mates} +
computer resigns 0-1 {White resigns} or 1-0 {Black resigns} +
game is a draw 1/2-1/2 {Draw} +
checkmate 1-0 {White mates} or 0-1 {Black mates} +
+ +

+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. +

+ +

+An alternative move syntax is also recognized: +

+ + +
Command Interpreted as +
NUMBER ... MOVE move MOVE +
+ +

+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. +

+ +

+Any line that contains the words "offer" and "draw" is recognized as +"offer draw". +

+ +

+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". +

+ +

+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. +

+ +

+ +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. + +

+ +

+ +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. + +

+ + +

+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: +

+ +
+unknown host
+No remote directory
+not found
+No such file
+can't alloc
+Permission denied
+
+
+ +

+ +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 fritz, reset, and +ponder, and the edit subcommands +castle and ep. 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 web page for documentation. + +

+ +

+ +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. + +

+ +
+
converted to HTML by Steffen A. Jakob
+ + 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: diderich@dma.epfl.ch +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 + diderich@dma.epfl.ch.AVAILABLE 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 , + Bruno Charlier + Van-Dat Cung , + Rainer Feldmann , + Marc Gengler , + Rattikorn Hewett , + Toshihide Ibaraki , + L. V. Kale , + Richard E. Korf , + Bradley C. Kuszmauk , + T. A. Marsland , + Judea Pearl , + Wim Pijls , + Udo Sprute +----------------------------------------------------------------------------- +"} + +@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 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 new file mode 100644 index 0000000..9b00755 Binary files /dev/null and b/programs/minimax.dvi differ 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 @@ + + +How to optimize for the Pentium family of microprocessors + + + + +

How to optimize for the Pentium
+family of microprocessors

+

+Copyright © 1996, 2000 by Agner Fog. Last modified 2000-07-03. +

+

 

+ +

Contents

+
    +
  1. Introduction +
  2. Literature +
  3. Calling assembly functions from high level language +
  4. Debugging and verifying +
  5. Memory model +
  6. Alignment +
  7. Cache +
  8. First time versus repeated execution +
  9. Address generation interlock (PPlain and PMMX) +
  10. Pairing integer instructions (PPlain and PMMX) +
    1. Perfect pairing +
    2. Imperfect pairing +
    +
  11. Splitting complex instructions into simpler ones (PPlain and PMMX) +
  12. Prefixes (PPlain and PMMX) +
  13. Overview of PPro, PII and PIII pipeline +
  14. Instruction decoding (PPro, PII and PIII) +
  15. Instruction fetch (PPro, PII and PIII) +
  16. Register renaming (PPro, PII and PIII) +
    1. Eliminating dependencies +
    2. Register read stalls
    +
  17. Out of order execution (PPro, PII and PIII) +
  18. Retirement (PPro, PII and PIII) +
  19. Partial stalls (PPro, PII and PIII) +
    1. Partial register stalls +
    2. Partial flags stalls +
    3. Flags stalls after shifts and rotates +
    4. Partial memory stalls
    +
  20. Dependency chains (PPro, PII and PIII) +
  21. Searching for bottlenecks (PPro, PII and PIII) +
  22. Jumps and branches (all processors) +
    1. Branch prediction in PPlain +
    2. Branch prediction in PMMX, PPro, PII and PIII +
    3. Avoiding jumps (all processors) +
    4. Avoiding conditional jumps by using flags (all processors) +
    5. Replacing conditional jumps by conditional moves (PPro, PII and PIII)
    +
  23. Reducing code size (all processors) +
  24. Scheduling floating point code (PPlain and PMMX) +
  25. Loop optimization (all processors) +
    1. Loops in PPlain and PMMX +
    2. Loops in PPro, PII and PIII
    +
  26. Problematic Instructions +
    1. XCHG (all processors) +
    2. Rotates through carry (all processors) +
    3. String instructions (all processors) +
    4. Bit test (all processors) +
    5. Integer multiplication (all processors) +
    6. WAIT instruction (all processors) +
    7. FCOM + FSTSW AX (all processors) +
    8. FPREM (all processors) +
    9. FRNDINT (all processors) +
    10. FSCALE and exponential function (all processors) +
    11. FPTAN (all processors) +
    12. FSQRT (PIII) +
    13. MOV [MEM], ACCUM (PPlain and PMMX) +
    14. TEST instruction (PPlain and PMMX) +
    15. Bit scan (PPlain and PMMX) +
    16. FLDCW (PPro, PII and PIII) +
    +
  27. Special topics +
    1. LEA instruction (all processors) +
    2. Division (all processors) +
    3. Freeing floating point registers (all processors) +
    4. Transitions between floating point and MMX instructions PMMX, PII and PIII) +
    5. Converting from floating point to integer (All processors) +
    6. Using integer instructions to do floating point operations (All processors) +
    7. Using floating point instructions to do integer operations (PPlain and PMMX) +
    8. Moving blocks of data (All processors) +
    9. Self-modifying code (All processors) +
    10. Detecting processor type (All processors) +
    +
  28. List of instruction timings for PPlain and PMMX +
    1. Integer instructions +
    2. Floating point instructions +
    3. MMX instructions (PMMX)
    +
  29. List of instruction timings and micro-op breakdown for PPro, PII and PIII +
    1. Integer instructions +
    2. Floating point instructions +
    3. MMX instructions (PII and PIII) +
    4. XMM instructions (PIII) +
    +
  30. Testing speed +
  31. Comparison of the different microprocessors +
+ +

 

+

1. Introduction

+

This manual describes in detail how to write optimized assembly language +code, with particular focus on the Pentium® family of microprocessors. +

+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. +

+The following versions of Pentium processors are discussed in this manual:

+ + + + + + + +
abbreviationname
PPlainplain old Pentium (without MMX)
PMMXPentium with MMX
PProPentium Pro
PIIPentium II (including Celeron and Xeon)
PIIIPentium III (including variants)
+

+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). +

+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. +

+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. +

+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. +

+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. +

+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! +

+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. +

+Some high level language compilers offer relatively good optimization for specific +processors, but further optimization by hand can usually make it much better. +

+Please don't send your programming questions to me. I am not gonna do your homework +for you! +

+Good luck with your hunt for nanoseconds! +

+

2. Literature

+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). +

+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: +developer.intel.com or follow the +links from www.agner.org/assem +

+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 www.adobe.com +

+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. +

+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. +

+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 www.agner.org/assem +

+

3. Calling assembly functions from high level language

+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. +

+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 extern "C" +and _cdecl. The assembly code must then have the function name prefixed by an +underscore (_) and be assembled with case sensitivity on externals (option -mx). +

+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 extern "C" and _cdecl 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: +

  ; 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
+

+The way of transferring parameters depends on the calling convention:

+ + + + + + + +
 calling convention  parameter order on stack  parameters removed by 
 _cdecl  first par. at low address  + caller 
 _stdcall  + first par. at low address  subroutine 
 _fastcall  compiler specific  + subroutine 
 _pascal  first par. at high address  + subroutine 
+

+Register usage in 16 bit mode DOS or Windows, C or C++:
+16-bit return value in AX, 32-bit return value in DX:AX, +floating point return value in ST(0). Registers AX, BX, CX, +DX, ES and arithmetic flags may be changed by the procedure; all other +registers must be saved and restored. A procedure can rely on SI, DI, BP, DS +and SS being unchanged across a call to another procedure. +

+Register usage in 32 bit Windows, C++ and other programming languages:
+Integer return value in EAX, floating point return value in ST(0). +Registers EAX, ECX, EDX (not EBX) may be changed by the procedure; all other +registers must be saved and restored. Segment registers cannot be changed, not even +temporarily. CS, DS, ES, and SS all point to the flat segment group. FS is used by the +operating system. GS 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 ST(0) if it is used for return value. MMX registers may be +changed by the procedure and if so cleared by EMMS 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 +EBX, ESI, EDI, EBP and all segment registers being unchanged across +a call to another procedure. +

+ +

4. Debugging and verifying

+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. +

+When your high level language subroutine works with your test program then you are ready +to translate the code to assembly language. +

+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). +

+Test the speed of the most critical part of your program with the method described in +chapter 30 or with a test program. If the code is significantly slower than expected, then the +most probable causes are: cache misses (chapter 7), misaligned +operands (chapter 6), first +time penalty (chapter 8), branch mispredictions +(chapter 22), instruction fetch problems +(chapter 15), register read stalls (16), + or long dependency chains (chapter 20). +

+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. +

+

5. Memory model

+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. +

+

6. Alignment

+All data in RAM should be aligned to addresses divisible by 2, 4, 8, or 16 according to this +scheme: + + + + + + + + + + + + + + + + + + +
+  +alignment
 operand size  PPlain and PMMX  PPro, PII and PIII 
 1 (byte) 11
 2 (word) 22
 4 (dword) 44
 6 (fword) 48
 8 (qword) 88
 10 (tbyte) 816
 16 (oword) n.a.16
+

+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. +

+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. +

+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: +

_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
+

+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 15. +

+

7. Cache

+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. +

+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. +

+If the size of an array or other data structure is a multiple of 32 bytes, then you should +preferably align it by 32. +

+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. +

+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. +

+Let me illustrate this by the following piece of code, where ESI holds an address divisible by +32: + +

AGAIN:  MOV  EAX, [ESI]
+        MOV  EBX, [ESI + 13*4096 +  4]
+        MOV  ECX, [ESI + 20*4096 + 28]
+        DEC  EDX
+        JNZ  AGAIN
+

+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 ECX 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 EAX, and +fills it with the data from [ESI+20*4096] to +[ESI+20*4096+31] and reads ECX. +Next, when reading EAX, you find that the cache +line that held the value for EAX has now been discarded, so you +take the least recently used +line, which is the one holding the EBX 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: +

        MOV  ECX, [ESI + 20*4096 + 32]
+

+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). +

+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. +

+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. +

+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). +

+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 www.intelligentfirm.com. +

+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. +

+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"). +

+Other ways of speeding up memory reads and writes are discussed in chapter +27.8 below. +

+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. +

+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. +

+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. +

+Storing temporary data in registers is of course even more efficient. Since registers is a +scarce ressource you may want to use [ESP] rather than [EBP] for addressing data on the +stack, in order to free EBP for other purposes. Just don't forget that the value of ESP +changes every time you do a PUSH or POP. +(You cannot use ESP under 16-bit Windows +because the timer interrupt will modify the high word of ESP at unpredictable places in your +code.) +

+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. +

+

8. First time versus repeated execution

+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: +

    +
  1. Loading the code from RAM into the cache takes longer time than executing it. +
  2. 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. +
  3. 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 22. +
  4. 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. +

+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. +

+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. +

+If you have very many jumps, calls, and branches inside a loop, then you may get the +penalty of branch target buffer misses repeatedly. +

+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. +

+

9. Address generation interlock (PPlain and PMMX)

+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:
+ADD EBX,4 / MOV EAX,[EBX] ; AGI stall
+The stall in this example can be removed by putting some other instructions in between +ADD EBX,4 and MOV EAX,[EBX] or by rewriting the code to: +MOV EAX,[EBX+4] / ADD EBX,4 +

+You can also get an AGI stall with instructions which use ESP implicitly +for addressing, such +as PUSH, POP, CALL, and RET, if ESP has been +changed in the preceding clock cycle by +instructions such as MOV, ADD, or SUB. +The PPlain and PMMX have special circuitry to +predict the value of ESP after a stack operation so that you do not +get an AGI delay after +changing ESP with PUSH, POP, or CALL. +You can get an AGI stall after RET only if it has an +immediate operand to add to ESP. +

+Examples: +

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
+

+The LEA 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: +

INC ESI / LEA EAX,[EBX+4*ESI]  ; AGI stall
+

+PPro, PII and PIII have no AGI stalls for memory reads and LEA, 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.

+

10. Pairing integer instructions (PPlain and PMMX)

+

10.1 Perfect pairing

+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. +

+The following instructions are pairable in either pipe: +

  • MOV register, memory, or immediate into register or memory +
  • PUSH register or immediate, POP register +
  • LEA, NOP +
  • INC, DEC, ADD, SUB, CMP, AND, OR, XOR, +
  • and some forms of TEST (see chapter 26.14) +

+The following instructions are pairable in the U-pipe only: +

  • ADC, SBB +
  • SHR, SAR, SHL, SAL with immediate count +
  • ROR, ROL, RCR, RCL with an immediate count of 1 +

+The following instructions can execute in either pipe but are only pairable +when in the V-pipe: +

  • near call +
  • short and near jump +
  • short and near conditional jump. +

+All other integer instructions can execute in the U-pipe only, and are not pairable. +

+Two consecutive instructions will pair when the following conditions are met: +

+1. The first instruction is pairable in the U-pipe and the second +instruction is pairable in the V-pipe. +

+2. The second instruction does not read or write a register which the first +instruction writes to.
+Examples: +

    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
+

+3. In rule 2 partial registers are treated as full registers. Example: +

    MOV AL, BL  /  MOV AH, 0

+writes to different parts of the same register, do not pair +

+4. Two instructions which both write to parts of the flags register can pair despite rule 2 and +3. Example: +

    SHR EAX, 4 / INC EBX            ; pair OK
+

+5. An instruction which writes to the flags can pair with a conditional jump despite rule 2. +Example: +

    CMP EAX, 2 / JA LabelBigger     ; pair OK
+

+6. The following instruction combinations can pair despite the fact that they both modify the +stack pointer: +

    PUSH + PUSH,  PUSH + CALL,  POP + POP
+

+7. There are restrictions on the pairing of instructions with prefix. +There are several types of prefixes: +

    +
  • instructions addressing a non-default segment have a segment prefix. +
  • instructions using 16 bit data in 32 bit mode, or 32 bit data in 16 bit mode have an +operand size prefix. +
  • instructions using 32 bit base or index registers in 16 bit mode have an address size +prefix. +
  • repeated string instructions have a repeat prefix. +
  • locked instructions have a LOCK prefix. +
  • many instructions which were not implemented on the 8086 processor have a two byte +opcode where the first byte is 0FH. The 0FH byte behaves +as a prefix on the PPlain, but +not on the other versions. The most common instructions with 0FH +prefix are: MOVZX, +MOVSX, PUSH FS, POP FS, PUSH GS, POP GS, LFS, LGS, LSS, SETcc, BT, +BTC, BTR, BTS, BSF, BSR, SHLD, SHRD, and IMUL with two operands and no +immediate operand. +
+

+On the PPlain, a prefixed instruction can only execute in the U-pipe, except for conditional +near jumps. +

+On the PMMX, instructions with operand size, address size, or 0FH +prefix can execute in +either pipe, whereas instructions with segment, repeat, or lock prefix can +only execute in the U-pipe. +

+8. 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: +

    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

+ (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 12.) +

+9. Both instructions must be preloaded and decoded. This is explained in +chapter 8. +

+10. There are special pairing rules for MMX instructions on the PMMX: +

    +
  • MMX shift, pack or unpack instructions can execute in either pipe but cannot pair with +other MMX shift, pack or unpack instructions. +
  • 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 24). +
  • an MMX instruction which accesses memory or integer registers can execute only in the +U-pipe and cannot pair with a non-MMX instruction. +
+

+ +

10.2 Imperfect pairing

+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. +

+Imperfect pairing will happen in the following cases: +

+1. If the second instructions suffers an AGI stall (see chapter 9). +

+2. Two instructions cannot access the same DWORD of memory simultaneously. +The following examples assume that ESI is divisible by 4:
+ MOV AL, [ESI] / MOV BL, [ESI+1]
+The two operands are within the same DWORD, so they cannot execute +simultaneously. The pair takes 2 clock cycles.
+ MOV AL, [ESI+3] / MOV BL, [ESI+4]
+Here the two operands are on each side of a DWORD boundary, so they +pair perfectly, and take only one clock cycle. +

+3. 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: +

   MOV [ESI], EAX / MOV [ESI+32000], EBX ;  imperfect pairing
+   MOV [ESI], EAX / MOV [ESI+32004], EBX ;  perfect pairing
+

+Pairable integer instructions which do not access memory take one clock cycle to +execute, except for mispredicted jumps. MOV 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. +

+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). +

+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). +

+4. If a read/modify/write instruction is paired with a read/modify or read/modify/write +instruction, then they will pair imperfectly. + +

+The number of clock cycles used is given in the following table: + + + + + + + + + + + + + + + + + +
+First instructionSecond instruction
  MOV or register only  + read/modify  read/modify/write 
 MOV or register only  1  2  3 
 read/modify  2  2  3 
 read/modify/write  3  4  5 
+ +

Example:
ADD [mem1], EAX / ADD EBX, [mem2] ; 4 clock cycles
ADD EBX, [mem2] / ADD [mem1], EAX ; 3 clock cycles
+

+5. 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. +

+6. A pairable floating point instruction followed by FXCH + will make imperfect pairing if the +next instruction is not a floating point instruction. +

+

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. +

+Imperfect pairing can often be avoided by reordering your instructions. +Example: +
+

L1:     MOV     EAX,[ESI]
+        MOV     EBX,[ESI]
+        INC     ECX

+ +Here the two MOV 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 INC ECX pairs with one of the +MOV instructions. + +

L2:     MOV     EAX,OFFSET A
+        XOR     EBX,EBX
+        INC     EBX
+        MOV     ECX,[EAX]
+        JMP     L1

+ +The pair INC EBX / MOV ECX,[EAX] is imperfect because the latter +instruction has an +AGI stall. The sequence takes 4 clocks. If you insert a NOP or any other instruction so that +MOV ECX,[EAX] pairs with JMP L1 instead, then the sequence takes only 3 clocks. +

+ +The next example is in 16 bit mode, assuming that SP is divisible by 4: + +

L3:     PUSH    AX
+        PUSH    BX
+        PUSH    CX
+        PUSH    DX
+        CALL    FUNC

+ +Here the PUSH instructions form two imperfect pairs, because both operands in each pair go +into the same dword of memory. PUSH BX could possibly pair perfectly +with PUSH CX +(because they go on each side of a DWORD boundary) but it doesn't because it has already +been paired with PUSH AX. The sequence therefore takes 5 clocks. If you insert a NOP or +any other instruction so that PUSH BX pairs with PUSH CX, +and PUSH DX with CALL FUNC, +then the sequence will take only 3 clocks. Another way to solve the problem is to make sure +that SP is not divisible by 4. Knowing whether SP 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. + +

+ +

11. Splitting complex instructions into simpler ones (PPlain and PMMX)

+You may split up read/modify and read/modify/write instructions to improve pairing. +Example:
+ ADD [mem1],EAX / ADD [mem2],EBX ; 5 clock cycles
+This code may be split up into a sequence which takes only 3 clock cycles: +

    MOV ECX,[mem1] / MOV EDX,[mem2] / ADD ECX,EAX / ADD EDX,EBX
+    MOV [mem1],ECX / MOV [mem2],EDX

+ +Likewise you may split up non-pairable instructions into pairable instructions: +

    PUSH [mem1]
+    PUSH [mem2]  ; non-pairable

+Split up into: +

    MOV EAX,[mem1]
+    MOV EBX,[mem2]
+    PUSH EAX
+    PUSH EBX     ; everything pairs

+ +Other examples of non-pairable instructions which may be split up into simpler pairable +instructions:
+CDQ split into: MOV EDX,EAX / SAR EDX,31
+NOT EAX change to XOR EAX,-1
+NEG EAX split into XOR EAX,-1 / INC EAX
+MOVZX EAX,BYTE PTR [mem] split into XOR EAX,EAX / MOV AL,BYTE PTR [mem]
+JECXZ split into TEST ECX,ECX / JZ
+LOOP split into DEC ECX / JNZ
+XLAT change to MOV AL,[EBX+EAX] +

+If splitting instructions doesn't improve speed, then you may keep the complex or +nonpairable instructions in order to reduce code size. +

+Splitting instructions is not needed on the PPro, PII and PIII, except when the split instructions +generate fewer uops. +

+

12. Prefixes (PPlain and PMMX)

+An instruction with one or more prefixes may not be able to execute in the V-pipe (se +chapter 10, sect. 7), and it may take more than one clock cycle to decode. +

+On the PPlain, the decoding delay is one clock cycle for each prefix except for the 0FH +prefix of conditional near jumps. +

+The PMMX has no decoding delay for 0FH 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. +

+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. +

+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. +

+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. +

+Examples:
+ CLD / REP MOVSD
+The CLD instruction takes two clock cycles and can therefore overshadow the decoding +delay of the REP prefix. The code would take one clock cycle more if the CLD instruction was +placed far from the REP MOVSD. +
+ CMP DWORD PTR [EBX],0 / MOV EAX,0 / SETNZ AL
+The CMP instruction takes two clock cycles here because it is a read/modify instruction. The +0FH prefix of the SETNZ instruction is decoded during the second clock cycle of the CMP +instruction, so that the decoding delay is hidden on the PPlain (The PMMX has no +decoding delay for the 0FH). +

+Prefix penalties in PPro, PII and PIII are described in chapter 14. +

+

13. Overview of PPro, PII and PIII pipeline

+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. +

+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). +

+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. +

+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 ADD EAX,[MEM] 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. +

+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. +

+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 EAX, EBX, etc. The purpose of the RAT is to tell the uops which temporary +registers to use, and to allow register renaming (see later). +

+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. +

+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. +

+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. +

+In the following chapters, I will describe in detail how to optimize the throughput of each step +in the pipeline. +

+

14. Instruction decoding (PPro, PII and PIII)

+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. +

+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. +

+To summarize the rules for decoding two or three instructions in the same clock cycle: +

    +
  • The first instruction (D0) generates no more than 4 uops, +
  • The second and third instructions generate no more than 1 uop each, +
  • The second and third instructions are no more than 8 bytes long each, +
  • The instructions must be contained within the same 16 bytes ifetch block (see next +chapter). +

+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. +

+An instruction that generates more than 4 uops takes two or more clock cycles to decode, +and no other instructions can decode in parallel. +

+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. +

+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: +

MOV     EBX, [MEM1]     ; 1 uop  (D0)
+INC     EBX             ; 1 uop  (D1)
+ADD     EAX, [MEM2]     ; 2 uops (D0)
+ADD     [MEM3], EAX     ; 4 uops (D0)

+This takes 3 clock cycles to decode. You can save one clock cycle by reordering the +instructions into two decode groups: +

ADD     EAX, [MEM2]     ; 2 uops (D0)
+MOV     EBX, [MEM1]     ; 1 uop  (D1)
+INC     EBX             ; 1 uop  (D2)
+ADD     [MEM3], EAX     ; 4 uops (D0)

+ +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. +

+You can see how many uops each instruction generates in the tables in chapter 29. +

+Instruction prefixes can also incur penalties in the decoders. Instructions can have several +kinds of prefixes: +

    +
  • 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 FNSTSW AX). 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: +
       ADD BX, 9      ; no penalty because immediate operand is 8 bits
    +   MOV WORD PTR [MEM16], 9  ; penalty because operand is 16 bits 
    +The last instruction should be changed to: +
       MOV EAX, 9
    +   MOV WORD PTR [MEM16], AX  ; no penalty because no immediate
    +
  • 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. +
  • 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. +
  • Repeat prefixes and lock prefixes give no penalty in the decoders. +
  • There is always a penalty if you have more than one prefix. This penalty is usually one +clock per prefix. +
+

+

15. Instruction fetch (PPro, PII and PIII)

+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. +

+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 22 about jump prediction). +

+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 table:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Number of
decode groups
in ifetch-block
containing jump
16-byte
boundary in this
ifetch-block
16-byte
boundary in first
instruction after
jump


decoder delay
alignment of first
ifetch after jump
1000by 16
1011to instruction
1101by 16
1112to instruction
2000to instruction
2010to instruction
2100by 16
2111to instruction
3 or more000to instruction
3 or more010to instruction
3 or more100to instruction
3 or more110to instruction
+

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. +

+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. +

+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: +

    +
  • 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. + +
  • 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. + +
  • The first ifetch block after a branch misprediction begins at a 16-byte boundary. As +explained in chapter 22.2, 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. + +
  • 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 CPUID, IN, and OUT. +
+

+ +I am sure you want an example now: + +

+ 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
+

+Let's assume that the first ifetch block begins at address 1000h and ends at 1010h. This is +before the end of the MOV [MEM],0 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 LL +label at 1005h, and end at +1015h. This is before the end of the LEA instruction, so the next ifetch block will go from +1011h to 1021h, and the last one from 1021h covering the rest. Now the LEA instruction +and the DEC 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 + (DEC ECX / JNZ LL) 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. +

+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. +

+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. +

+If you insert an ALIGN 16 directive before the loop entry then the assembler will put in +NOP's and other filler instructions up to the nearest 16 byte boundary. Most assemblers use +the instruction XCHG EBX,EBX as a 2-byte filler (the so called 2-byte NOP). Whoever got +this idea, it's a bad one because this instruction takes more time than two NOP'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 16.2) +For example, if you are using register EBP for addressing but seldom +write to it, then you may use MOV EBP,EBP or ADD EBP, 0 as +filler in order to reduce the possibilities of register read stalls. +If you have nothing useful to do, you may use FXCH ST(0) as a good filler +because it doesn't put any load on the execution ports, provided that ST(0) +contains a valid floating point value. +

+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. +

+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, DEC ECX is one byte long, SUB ECX,1 is 3 bytes, and you can code a 6 bytes +version with a long immediate operand using this trick: +

         SUB ECX, 9999
+         ORG $-4
+         DD 1

+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 DS: +segment prefix (DB 3Eh). +The microprocessors generally accept redundant and meaningless prefixes (except +LOCK) 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 DEC ECX instruction to be +2 bytes long, write: +

         DB  3Eh
+         DEC ECX

+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. +

+With these methods it will usually be possible to put the ifetch boundaries where you want +them, although it can be a tedious puzzle. +

+

16. Register renaming (PPro, PII and PIII)

+

16.1 Eliminating dependencies

+Register renaming is an advanced technique used by these microprocessors to remove +dependencies between different parts of the code. Example: +

         MOV EAX, [MEM1]
+         IMUL EAX, 6
+         MOV [MEM2], EAX
+         MOV EAX, [MEM3]
+         INC EAX
+         MOV [MEM4], EAX

+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 EAX 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 EAX every time you write to it. Thereby the +MOV EAX,[MEM3] instruction becomes independent of the preceding instructions. +With out-of-order execution it is likely to finish the move to [MEM4] before the slow +IMUL instruction is finished. +

+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 +INC EAX 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. +

+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. +

+A common way of setting a register to zero is XOR EAX,EAX or +SUB EAX,EAX. 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 + MOV EAX,0. +

+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. +

+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. +

+

16.2 Register read stalls

+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: +

         MOV [EDI + ESI], EAX
+         MOV EBX, [ESP + EBP]

+The first instruction generates two uops: one that reads EAX +and one that reads EDI and +ESI. The second instruction generates one uop that reads +ESP and EBP. EBX 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. +

+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: +

         MOV [EDI + ESI], EDI
+         MOV EBX, [EDI + EDI]

+then you will need only two register reads (EDI and ESI) and the triplet will not be delayed. +

+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. +

+Example: +

         MOV EAX, EBX
+         SUB ECX, EAX
+         INC EBX
+         MOV EDX, [EAX]
+         ADD ESI, EBX
+         ADD EDI, ECX

+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 EBX, ECX, and EAX. But since we are writing to +EAX before reading it, the read is free and we get no stall. The next three uops read EAX, +ESI, EBX, EDI, and ECX. Since both EAX, EBX and ECX have been modified in the +preceding triplet and not yet written back then they can be read for free, so that only ESI +and EDI count, and we get no stall in the second triplet either. If the +SUB ECX,EAX +instruction in the first triplet is changed to CMP ECX,EAX then ECX is not written to and we +will get a stall in the second triplet for reading ESI, EDI and ECX. Similarly, if the INC +EBX instruction in the first triplet is changed to NOP or something else then we will get a stall +in the second triplet for reading ESI, EBX and EDI. +

+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. +

+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 ADDSS and MOVHLPS. +Segment registers and the instruction pointer do not count. +For example, in SETZ AL you count the flags +register but not AL. ADD EBX,ECX counts both EBX and ECX, but not the flags because +they are written to only. PUSH EAX reads EAX and the +stack pointer and then writes to the stack pointer. +

+The FXCH 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 FXCH instruction behaves +like 1 uop that neither reads nor writes any registers with regard to the rules for register read +stalls. +

+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. +

+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. +

+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. +

+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. +

+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: +

  • keep uops that read the same register close together so that they are likely to go into the +same triplet. +
  • keep uops that read different registers spaced so that they cannot go into the same +triplet. +
  • 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. +
  • use absolute addresses instead of pointers in order to reduce the number of register +reads. +
  • 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: +MOV ESP,ESP / ... / MOV EAX,[ESP+8]. +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. +
+

+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. +

+Writes to memory
+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:
+MOV [EDI], EAX
+First uop reads EAX, second uop reads EDI.
+FSTP QWORD PTR [EBX+8*ECX]
+First uop reads ST(0), second uop reads EBX and ECX. +

+Read and modify
+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:
+ADD EAX, [ESI+20]
+First uop reads ESI, second uop reads EAX and writes EAX and flags. +

+Read/modify/write
+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:
+OR [ESI+EDI], EAX
+The first uop reads ESI and EDI, the second uop reads EAX and writes EAX and the +flags, the third uop reads only the temporary result, the fourth uop reads ESI and EDI again. No +matter how these uops go into the RAT you can be sure that the uop that reads EAX goes +together with one of the uops that read ESI and EDI. A register read stall is therefore +inevitable for this instruction unless one of the registers has been modified recently. +

+Push register
+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. +

+Pop register
+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. +

+Call
+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. +

+Return
+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. +

+An example of how to avoid a register read stall is given in example 2.6. +

+

17. Out of order execution (PPro, PII and PIII)

+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. +

+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 IN, OUT and serializing +instructions. +

+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. +

+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 29 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). +

+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. +

+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 +29 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 MOV register,register +or MOV register,immediate instructions with + MOV register,memory in order to move some +of the load from port 0 and 1 to port 2. +

+Most uops take only one clock cycle to execute, but multiplications, divisions, and many +floating point operations take more: +

+Floating point addition and subtraction takes 3 clocks, but the execution unit is fully +pipelined so that it can receive a new FADD or FSUB +in every clock cycle before the +preceding ones are finished (provided, of course, that they are independent). +

+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 +FMUL instruction two clocks after the preceding one, so that the +maximum throughput is one FMUL per two clock cycles. The holes +between the FMUL'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. +

+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. +

+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. +

+You should, of course, avoid instructions that generate many uops. +The LOOP XX +instruction, for example, should be replaced by DEC ECX / JNZ XX. +

+If you have consecutive POP instructions then you may break them up to reduce the +number of uops: +

POP ECX / POP EBX / POP EAX     ; can be changed to:
+MOV ECX,[ESP] / MOV EBX,[ESP+4] / MOV EAX,[ESP] / ADD ESP,12
+The former code generates 6 uops, the latter generates only 4 and decodes faster. +Doing the same with PUSH 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 CALL and RET +instructions will +interfere with prediction in the return stack buffer. Note also that the +ADD ESP instruction can cause an AGI stall in earlier processors. +

+

18. Retirement (PPro, PII and PIII)

+Retirement is a process where the temporary registers used by the uops are copied into the +permanent registers EAX, EBX, etc. +When a uop has been executed it is marked in the ROB as ready to retire. +

+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. +

+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. +

+In case of speculative execution of predicted branches (see chapter 22) 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. +

+The following instructions cannot execute speculatively: memory writes, +IN, OUT, and serializing instructions. +

+

19. Partial stalls (PPro, PII and PIII)

+

19.1 Partial register stalls

+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: +

        MOV AL, BYTE PTR [M8]
+        MOV EBX, EAX            ; partial register stall

+This gives a delay of 5-6 clocks. The reason is that a temporary register has been assigned +to AL (to make it independent of AH). +The execution unit has to wait until the write to AL has +retired before it is possible to combine the value from AL with the +value of the rest of EAX. +The stall can be avoided by changing to code to: +

        MOVZX EBX, BYTE PTR [MEM8]
+        AND EAX, 0FFFFFF00h
+        OR EBX, EAX
+

+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. +

+You should be aware of partial stalls whenever you mix different data sizes (8, 16, and 32 +bits): +

        MOV BH, 0
+        ADD BX, AX              ; stall
+        INC EBX                 ; stall

+ +You don't get a stall when reading a partial register after writing to the full register, or a +bigger part of it: +

        MOV EAX, [MEM32]
+        ADD BL, AL              ; no stall
+        ADD BH, AH              ; no stall
+        MOV CX, AX              ; no stall
+        MOV DX, BX              ; stall

+ +The easiest way to avoid partial register stalls is to always use full registers +and use MOVZX or MOVSX 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 MOVZX EAX,BYTE PTR [M8] looks like this: +

        XOR EAX, EAX
+        MOV AL, BYTE PTR [M8]

+ +The PPro, PII and PIII processors make a special case out of this combination +to avoid a partial +register stall when later reading from EAX. +The trick is that a register is tagged as empty +when it is XOR'ed with itself. The processor remembers that the upper 24 bits of +EAX are zero, so that a partial stall can be avoided. This mechanism +works only on certain combinations: +

        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

+ +Setting a register to zero by subtracting it from itself works the same as the +XOR, but setting it to zero with the MOV instruction +doesn't prevent the stall. +

+You can set the XOR outside a loop: +

        XOR EAX, EAX
+        MOV ECX, 100
+LL:     MOV AL, [ESI]
+        MOV [EDI], EAX          ; no stall
+        INC ESI
+        ADD EDI, 4
+        DEC ECX
+        JNZ LL

+The processor remembers that the upper 24 bits of EAX are zero as +long as you don't get +an interrupt, misprediction, or other serializing event. +

+You should remember to neutralize any partial register you have used before calling a +subroutine that might push the full register: +

        ADD BL, AL
+        MOV [MEM8], BL
+        XOR EBX, EBX            ; neutralize BL
+        CALL _HighLevelFunction

+Most high level language procedures push EBX at the start of the +procedure which would generate a partial register stall in the example above +if you hadn't neutralized BL. +

+Setting a register to zero with the XOR method doesn't break its dependency on earlier +instructions: +

        DIV EBX
+        MOV [MEM], EAX
+        MOV EAX, 0              ; break dependency
+        XOR EAX, EAX            ; prevent partial register stall
+        MOV AL, CL
+        ADD EBX, EAX

+Setting EAX to zero twice here seems redundant, but without +the MOV EAX,0 the last +instructions would have to wait for the slow DIV to finish, and +without XOR EAX,EAX you +would have a partial register stall. +

+The FNSTSW AX instruction is special: in 32 bit mode it behaves as +if writing to the entire EAX. In fact, it does something like this +in 32 bit mode:
+ AND EAX,0FFFF0000h / FNSTSW TEMP / OR EAX,TEMP
+hence, you don't get a partial register stall when reading EAX +after this instruction in 32 bit mode: +

    FNSTSW AX / MOV EBX,EAX         ; stall only if 16 bit mode
+    MOV AX,0  / FNSTSW AX           ; stall only if 32 bit mode
+ +

+

19.2 Partial flags stalls

+The flags register can also cause partial register stalls: +

        CMP EAX, EBX
+        INC ECX
+        JBE XX          ; partial flags stall

+The JBE instruction reads both the carry flag and the zero flag. +Since the INC instruction +changes the zero flag, but not the carry flag, the JBE instruction has to wait for the two +preceding instructions to retire before it can combine the carry flag from the CMP instruction +and the zero flag from the INC instruction. This situation is likely to be a bug rather than an +intended combination of flags. To correct it change INC ECX to ADD ECX,1. + A similar +bug that causes a partial flags stall is SAHF / JL XX. The JL +instruction tests the sign +flag and the overflow flag, but SAHF doesn't change the overflow flag. +To correct it, change +JL XX to JS XX. +

+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: +

        CMP EAX, EBX
+        INC ECX
+        JC  XX          ; partial flags stall

+but not when reading only modified bits: +

        CMP EAX, EBX
+        INC ECX
+        JE  XX          ; no stall

+ +Partial flags stalls are likely to occur on instructions that read many or +all flags bits, i.e. LAHF, PUSHF, PUSHFD. The following instructions cause +partial flags stalls when followed by LAHF or PUSHF(D): +INC, DEC, TEST, bit tests, bit scan, CLC, STC, CMC, CLD, STD, CLI, STI, MUL, +IMUL, and all shifts and rotates. +The following instructions do not cause partial flags stalls: +AND, OR, XOR, ADD, ADC, SUB, SBB, CMP, NEG. +It is strange that TEST and AND behave differently while, by definition, they +do exactly the same thing to the flags. You may use a SETcc + instruction instead of LAHF +or PUSHF(D) for storing the value of a flag in order to avoid a stall. +

+Examples: +

    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

+The penalty for partial flags stalls is approximately 4 clocks. +

+ +

19.3 Flags stalls after shifts and rotates

+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): +

    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

+ +The penalty for these stalls is approximately 4 clocks. +

+ +

19.4 Partial memory stalls

+A partial memory stall is somewhat analogous to a partial register stall. It occurs when you +mix data sizes for the same memory address: +

        MOV BYTE PTR [ESI], AL
+        MOV EBX, DWORD PTR [ESI]        ; partial memory stall

+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 EBX. The penalty is approximately 7-8 clocks. +

+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: +

        MOV DWORD PTR [ESI], EAX
+        MOV BL, BYTE PTR [ESI]          ; no stall
+        MOV BH, BYTE PTR [ESI+1]        ; stall

+You can avoid this stall by changing the last line to MOV BH,AH, +but such a solution is not +possible in a situation like this: +

        FISTP QWORD PTR [EDI]
+        MOV EAX, DWORD PTR [EDI]
+        MOV EDX, DWORD PTR [EDI+4]      ; stall

+ +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: +

        MOV BYTE PTR [ESI], AL
+        MOV EBX, DWORD PTR [ESI+4092]   ; no stall
+        MOV ECX, DWORD PTR [ESI+4096]   ; stall
+

+

20. Dependency chains (PPro, PII and PIII)

+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. +

+Example: +

   MOV EAX, [MEM1]
+   ADD EAX, [MEM2]
+   ADD EAX, [MEM3]
+   ADD EAX, [MEM4]
+   MOV [MEM5], EAX

+In this eaxmple, the ADD 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: +

   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

+Here, the second IMUL instruction can start before the first one is finished. +Since the IMUL instruction has a delay of 4 clocks and is fully pipelined, you +may have up to 4 accumulators. +

+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. +

+Floating point instructions have a longer delay than integer instructions, so +you should definitely break up long dependency chains with floating point +instructions: +

   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]

+You need a lot of FXCH instructions for this, but don't worry: they +are cheap. FXCH +instructions are resolved in the RAT by register renaming so they don't +put any load on the execution ports. An FXCH does count as 1 uop in the RAT, +ROB, and retirement station, though. +

+If the dependency chain is long you may need three accumulators: +

        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]

+ +Avoid storing intermediate data in memory and read them immediately afterwards: +

        MOV [TEMP], EAX
+        MOV EBX, [TEMP]

+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 +MOV EBX,EAX +or put some other instructions in between. +

+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: +

        MOV EAX, [MEM1]
+        ADD EAX, [MEM2]
+        MOV [TEMP], EAX
+        FILD [TEMP]

+If you don't have anything to put in between the write to TEMP and the +read from TEMP, then +you may consider using a floating point register instead of EAX: +

        FILD [MEM1]
+        FIADD [MEM2]

+ +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. +

+

21. Searching for bottlenecks (PPro, PII and PIII)

+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. +

+If you expect code cache misses then you should restructure your code to keep the most +used parts of code together. +

+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 7), and +avoid long dependency chains after a data read cache miss (chapter 20). +

+If you have many divisions then try to reduce them (chapter 27.2) and make sure the +processor has something else to do during the divisions. +

+Dependency chains tend to hamper out-of-order execution (chapter 20). Try to break long +dependency chains, especially if they contain slow instructions such as multiplication, +division, and floating point instructions. +

+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 22.3). +

+If you are mixing different data sizes (8, 16, and 32 bit integers) then look out for partial +stalls. If you use PUSHF or LAHF instructions then look out for partial flags stalls. Avoid +testing flags after shifts or rotates by more than 1 (chapter 19). +

+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 14 and 15), especially in small loops. +

+The limit of two permanent register reads per clock cycle may reduce your throughput to +less than 3 uops per clock cycle (chapter 16.2). 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. +

+A throughput of 3 uops per clock requires that no execution port gets more than one third of +the uops (chapter 17). +

+The retirement station can handle 3 uops per clock, but may be slightly less effective for +taken jumps (chapter 18). + +

+

22. Jumps and branches (all processors)

+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. +

+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. +

+When optimizing code, it is important to minimize the number of misprediction penalties. +This requires a good understanding of how the jump prediction works. +

+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). +

+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. +

+ +

22.1 Branch prediction in PPlain

+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. +

+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: +

+state 0: "strongly not taken"
+state 1: "weakly not taken"
+state 2: "weakly taken"
+state 3: "strongly taken"

+ +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. +

+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. +

+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. +

+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). +

+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: +

        TEST EAX,EAX
+        JZ   A
+        <branch 1>
+        JMP  E
+A:      <branch 2>
+E:
+

+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: +

        TEST EAX,EAX
+        JNZ  A
+        <branch 2>
+        JMP  E
+A:      <branch 1>
+E:

+ +(This is contrary to the recommendations in Intel's manuals and tutorials). +

+There may be reasons to put the most often executed branch first, however: +

    +
  1. Putting seldom executed branches away in the bottom of your code can improve code +cache utilization. +
  2. A branch instruction seldom taken will stay out of the BTB most of the time, possibly +improving BTB utilization. +
  3. The branch instruction will be predicted as not taken if it has been flushed out of the +BTB by other branch instructions. +
  4. The asymmetry in branch prediction only exists on the PPlain. +
+

+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. +

+Likewise, you should preferably organize loops with the testing branch instruction at the +bottom, as in this example: +

        MOV ECX, [N]
+L:      MOV [EDI],EAX
+        ADD EDI,4
+        DEC ECX
+        JNZ L

+If N is high, then the JNZ instruction here will be taken more often than not, and never fall +through twice in succession. +

+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. Assume now that it deviates +from this regular pattern and falls through an extra time. The jump pattern is:

+01010100101010101010101, where 0 means nojump, and 1 means jump.
+       ^
+The extra nojump is indicated with a ^ 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. +

+

22.1.2 BTB is looking ahead (PPlain)

+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: +
    SHR EAX,1
+    MOV EBX,[ESI]
+    CMP EAX,EBX
+    JB  L

+Here SHR pairs with MOV, and CMP pairs with +JB. The BTB entry for JB L is thus +attached to the address of the SHR EAX,1 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. +

+You may remember, that instructions are seldom pairing the first time they are executed +(see chapter 8). If the instructions above are not pairing, then the BTB entry should be +attached to the address of the CMP 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). +

+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. +

+

22.1.3 Consecutive branches (PPlain)

+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. +

+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: +

        SHR EAX,1
+        MOV EBX,[ESI]
+        CMP EAX,EBX
+        JB  L1
+        JMP L2
+
+L1:     MOV EAX,EBX
+        INC EBX

+ +When JB L1 falls through, then you will get a BTB entry for +JMP L2 attached to the +address of CMP EAX,EBX. But what will happen when JB L1 +later is taken? At the time +when the BTB entry for JMP L2 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 MOV EAX,EBX / INC EBX to jump to L2. +The penalty for predicting non-jump +instructions to jump is 3 clock cycles. The BTB entry for JMP L2 will get its state +decremented, because it is applied to something which doesn't jump. If we keep going to +L1, then the BTB entry for JMP L2 will be decremented to state 1 and 0, so that the +problem will disappear until next time JMP L2 is executed. +

+The penalty for predicting the non-jumping instructions to jump only occurs when the jump +to L1 is predicted. In the case that JB L1 is mispredictedly +jumping, then the pipeline gets +flushed and we won't get the false L2 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 +JMP L2 decremented. +

+Suppose, now, that we replace the INC EBX instruction above with another jump +instruction. This third jump instruction will then use the same BTB entry as +JMP L2 with +the possible penalty of predicting a wrong target, (unless it happens to also +have L2 as target). +

+To summarize, consecutive jumps can lead to the following problems: +

    +
  • failure to load a jump target when the pipeline is being flushed by a preceding +mispredicted jump. +
  • a BTB entry being mis-applied to non-jumping instructions and predicting them to jump. +
  • 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. +
  • two jump instructions may share the same BTB entry, leading to the prediction of a +wrong target. +
+

+ +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. +

+It is time for another illustrative example: +

        CALL P
+        TEST EAX,EAX
+        JZ   L2
+L1:     MOV  [EDI],EBX
+        ADD  EDI,4
+        DEC  EAX
+        JNZ  L1
+L2:     CALL 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? +

+First, we may note that the function P is called alternatingly from two different locations. +This means that the target for the return from P will be changing all the time. Consequently, +the return from P will always be mispredicted. +

+Assume, now, that EAX is zero. The jump to L2 will not have its target loaded because the +mispredicted return caused a pipeline flush. Next, the second CALL P will also fail to have +its target loaded because JZ L2 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 JZ L2 is stored at the address of P's return +instruction. This BTB entry will now be mis-applied to whatever comes after the second +CALL P, but that doesn't give a penalty because the pipeline is flushed by the mispredicted +second return. +

+Now, let's see what happens if EAX has a nonzero value the next time: +JZ L2 is always +predicted to fall through because of the flush. The second CALL P +has a BTB entry at the +address of TEST EAX,EAX. This entry will be mis-applied to the +MOV/ADD pair, predicting +it to jump to P. This causes a flush which prevents JNZ L1 +from loading its target. If we +have been here before, then the second CALL P will have another BTB entry at the +address of DEC EAX. On the second and third iteration of the loop, this entry will also be +mis-applied to the MOV/ADD 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 JNZ L1 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, JNZ L1 is mispredicted. The flush would now +prevent CALL P from loading its target, were it not for the fact that the BTB entry for +CALL P has already been destroyed by being mis-applied several times. +

+We can improve this code by putting in some NOP's to separate all consecutive jumps: +

        CALL P
+        TEST EAX,EAX
+        NOP
+        JZ   L2
+L1:     MOV  [EDI],EBX
+        ADD  EDI,4
+        DEC  EAX
+        JNZ  L1
+L2:     NOP
+        NOP
+        CALL P

+The extra NOP's cost 2 clock cycles, but they save much more. +Furthermore, JZ L2 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 P are always mispredicted. This problem can +only be solved by replacing the call to P by an inline macro (if you have enough code +cache). +

+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 NOP'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 NOP's, then you should of course do so. +

+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 NOP'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! +

+

22.1.4 Tight loops (PPlain)

+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. +

+

22.2 Branch prediction in PMMX, PPro, PII and PIII

+

22.2.1 BTB organization (PMMX, PPro, PII and PIII)

+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. +

+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. +

+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. +

+An entry may be pushed out of the BTB when another control transfer instruction with the +same set-value needs a BTB entry. +

+

22.2.2 Misprediction penalty (PMMX, PPro, PII and PIII)

+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. +

+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. +

+

22.2.3 Pattern recognition for conditional jumps (PMMX, PPro, PII and PIII)

+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. +

+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. +

+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. +

+

22.2.4 Perfectly predicted patterns (PMMX, PPro, PII and PIII)

+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:

+ + + + + + + + + + + + + + + +
 period  perfectly predicted patterns 
1-5all
6000011, 000101, 000111, 001011
70000101, 0000111, 0001011
800001011, 00001111, 00010011, 00010111, 00101101
9000010011, 000010111, 000100111, 000101101
100000100111, 0000101101, 0000101111, 0000110111, 0001010011, 0001011101
1100001001111, 00001010011, 00001011101, 00010100111
12000010100111, 000010111101, 000011010111, 000100110111, 000100111011
130000100110111, 0000100111011, 0000101001111
1400001001101111, 00001001111011, 00010011010111, 00010011101011, 00010110011101, 00010110100111
15000010011010111, 000010011101011, 000010100110111, +000010100111011, 000010110011101, 000010110100111, +000010111010011, 000011010010111
160000100110101111, 0000100111101011, 0000101100111101, +0000101101001111
+

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. +

+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. +

+ +

22.2.5 Handling deviations from a regular pattern (PMMX, PPro, PII and PIII)

+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. +

+Example: +

+0001110001110001110001011100011100011100010111000
+                      ^                   ^

+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 ^. 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. +

+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. +

+

22.2.6 Patterns which are not predicted perfectly (PMMX, PPro, PII and PIII)

+The simplest branch pattern which cannot be predicted perfectly is a branch which is taken +on every 6'th execution. The pattern is: +

000001000001000001
+    ^^    ^^    ^^
+    ab    ab    ab

+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 above). 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. +

+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. +

+

22.2.7 Completely random patterns (PMMX, PPro, PII and PIII)

+The powerful capability of pattern recognition has a minor drawback in the case of +completely random sequences with no regularities. +

+The following table lists the experimental fraction of mispredictions for a completely random +sequence of jumps and nojumps:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 fraction of jumps/nojumps  fraction of mispredictions 
0.001/0.9990.001001
0.01/0.990.0101
0.05/0.950.0525
0.10/0.900.110
0.15/0.850.171
0.20/0.800.235
0.25/0.750.300
0.30/0.700.362
0.35/0.650.418
0.40/0.600.462
0.45/0.550.490
0.50/0.500.500
+

+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. +

+

22.2.8 Tight loops (PMMX)

+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. +

+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. +

+Tight loops on PPro, PII and PIII are predicted normally, and take minimum two clock cycles per +iteration. +

+

22.2.9 Indirect jumps and calls (PMMX, PPro, PII and PIII)

+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. +

+

22.2.10 JECXZ and LOOP (PMMX)

+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 DEC ECX / JNZ). +

+

22.2.11 Returns (PMMX, PPro, PII and PIII)

+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. +

+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. +

+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. +

+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. +

+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. +

+

22.2.12 Static prediction in PMMX

+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. +

+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. +

+Any control transfer instruction which jumps to the address immediately following itself will +not get a BTB entry. Example:

+        JMP SHORT LL
+LL:

+This instruction will never get a BTB entry and therefore always have a misprediction +penalty. +

+

22.2.13 Static prediction in PPro, PII and PIII

+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. +

+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. +

+

22.2.14 Close jumps (PMMX)

+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. +

+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: +

        CALL    P
+        JNC     SHORT L

+If the last byte of the CALL instruction and the last byte of the JNC 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). +

+There are various ways to solve this problem:
+1. Move the code sequence a little up or down in memory so that you get a dword +boundary between the two addresses.
+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.
+3. Put in some instruction between the CALL and the JNC 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:
+

        CALL    P
+        MOV     EAX,EAX         ; two bytes filler to be safe
+        JNC     SHORT L

+If you want to avoid problems on the PPlain too, then put in two NOP's instead to prevent +pairing (see section 22.1.3 above). +

+The RET instruction is particularly prone to this problem because it is only one byte long: +

        JNZ     NEXT
+        RET

+Here you may need up to three bytes of fillers: +

        JNZ     NEXT
+        NOP
+        MOV     EAX,EAX
+        RET
+

+

22.2.15 Consecutive calls or returns (PMMX)

+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: +

FUNC1   PROC    NEAR
+        NOP             ; avoid call after call
+        NOP
+        CALL    FUNC2
+        CALL    FUNC3
+        NOP             ; avoid return after return
+        RET
+FUNC1   ENDP

+Two NOP's are required before CALL FUNC2 because a single +NOP would pair with the +CALL. One NOP is enough before the RET because +RET is unpairable. No NOP's are required +between the two CALL instructions because there is no penalty for call after return. (On the +PPlain you would need two NOP's here too). +

+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. +

+

22.2.16 Chained jumps (PPro, PII and PIII)

+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. +

+

22.2.17 Designing for branch predictabiligy (PMMX, PPro, PII and PIII)

+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. +

+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. +

+

22.3. Avoiding jumps (all processors)

+There can be many reasons why you may want reduce the number of jumps, calls and +returns: +

    +
  • jump mispredictions are very expensive, +
  • there are various penalties for consecutive or chained jumps, depending on the +processor, +
  • jump instructions may push one another out of the branch target buffer because of the +random replacement algorithm, +
  • a return takes 2 clocks on PPlain and PMMX, calls and returns generate 4 uops on +PPro, PII and PIII. +
  • on PPro, PII and PIII, instruction fetch may be delayed after a jump +(chapter 15), and +retirement may be slightly less effective for taken jumps then for other uops +(chapter 18). +
+

+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 +CALL PRO1 / RET can be replaced by JMP PRO1 if +PRO1 ends with the same kind of RET. +

+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: +

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

+The jump to C may be eliminated by dublicating the loop epilog: +

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

+The most often executed branch should come first here. The jump to D +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 +D. +

+

22.4. Avoiding conditional jumps by using flags (all processors)

+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: +

         CDQ
+         XOR EAX,EDX
+         SUB EAX,EDX

+(On PPlain and PMMX, use MOV EDX,EAX / SAR EDX,31 instead of CDQ). +

+The carry flag is particularly useful for this kind of tricks:
+Setting carry if a value is zero: CMP [VALUE],1
+Setting carry if a value is not zero: XOR EAX,EAX / CMP EAX,[VALUE]
+Incrementing a counter if carry: ADC EAX,0
+Setting a bit for each time the carry is set: RCL EAX,1
+Generating a bit mask if carry is set: SBB EAX,EAX
+Setting a bit on an arbitrary condition: SETcond AL
+Setting all bits on an arbitrary condition: XOR EAX,EAX / SETNcond AL / DEC EAX
+(remember to reverse the condition in the last example) +

+The following example finds the minimum of two unsigned numbers: if (b < a) a = b; +

         SUB EBX,EAX
+         SBB ECX,ECX
+         AND ECX,EBX
+         ADD EAX,ECX

+The next example chooses between two numbers: if (a != 0) a = b; else a = c; +

         CMP EAX,1
+         SBB EAX,EAX
+         XOR ECX,EBX
+         AND EAX,ECX
+         XOR EAX,EBX

+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. +

+

22.5. Replacing conditional jumps by conditional moves (PPro, PII and PIII)

+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 27.10 for how to detect if conditional moves are supported). +

+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. + +

+

23. Reducing code size (all processors)

+As explained in chapter 7, 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. +

+ 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 above). Some other methods for reducing the size or your code are discussed +below. +

+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. +

+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. +

+Likewise, data addresses take less space if they can be expressed as a pointer and a +displacement between -128 and +127. +Example:
+ MOV EBX,DS:[100000] / ADD EBX,DS:[100004] ; 12 bytes
+Reduce to:
+ MOV EAX,100000 / MOV EBX,[EAX] / ADD EBX,[EAX+4] ; 10 bytes +

+The advantage of using a pointer obviously increases if you use it many times. Storing data +on the stack and using EBP or ESP 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 PUSH and POP to write and read temporary data is +even shorter. +

+ 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: +

    PUSH 200      ; 5 bytes
+    PUSH 100      ; 2 bytes
+ 
+    ADD EBX,128   ; 6 bytes
+    SUB EBX,-128  ; 3 bytes

+ + The most important instruction with an immediate operand which doesn't have such a short +form is MOV.
+Examples: +

    MOV EAX, 0              ; 5 bytes

+ May be changed to:
+

    XOR EAX,EAX             ; 2 bytes

+And +

    MOV EAX, 1              ; 5 bytes

+ May be changed to: +

    XOR EAX,EAX / INC EAX   ; 3 bytes

+or: +

    PUSH 1 / POP EAX        ; 3 bytes

+And +

    MOV EAX, -1             ; 5 bytes

+May be changed to: +

    OR EAX, -1              ; 3 bytes
+

+If the same address or constant is used more than once then you may load it +into a register. A MOV +with a 4-byte immediate operand may sometimes be replaced by an arithmetic +instruction if the value of the register before the MOV is known. Example: +

        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

+Assuming that mem1 and mem3 are both within -128/+127 +bytes of mem2, this may be changed to: +

        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

+Be aware of the AGI stall in the LEA instruction (for PPlain and PMMX). +

+You may also consider that different instructions have different lengths. The following +instructions take only one byte and are therefore very attractive: +PUSH reg, POP reg, INC reg32, DEC reg32.
+INC and DEC with 8 bit registers take 2 bytes, so +INC EAX is shorter than INC AL. +

+XCHG EAX,reg is also a single-byte instruction and thus takes less space +than MOV EAX,reg, but it is slower. +

+Some instructions take one byte less when they use the accumulator than when they use +any other register.
+Examples: + +

    MOV EAX,DS:[100000]  is smaller than  MOV EBX,DS:[100000]
+    ADD EAX,1000         is smaller than  ADD EBX,1000

+ + Instructions with pointers take one byte less when they have only a base pointer + (not ESP) +and a displacement than when they have a scaled index register, or both base pointer and +index register, or ESP as base pointer.
+Examples: +

    MOV EAX,[array][EBX]  is smaller than  MOV EAX,[array][EBX*4]
+    MOV EAX,[EBP+12]      is smaller than  MOV EAX,[ESP+12]

+ Instructions with EBP as base pointer and no displacement and no index take one byte more +than with other registers: +

    MOV EAX,[EBX]    is smaller than  MOV EAX,[EBP],  but
+    MOV EAX,[EBX+4]  is same size as  MOV EAX,[EBP+4].

+ Instructions with a scaled index pointer and no base pointer must have a four byte +displacement, even when it is 0: +

    LEA EAX,[EBX+EBX]  is shorter than  LEA EAX,[2*EBX].
+

+

24. Scheduling floating point code (PPlain and PMMX)

+Floating point instructions cannot pair the way integer instructions can, except for one +special case, defined by the following rules: +

    +
  • the first instruction (executing in the U-pipe) must be FLD, FADD, FSUB, FMUL, +FDIV, FCOM, FCHS, or FABS. +
  • the second instruction (in V-pipe) must be FXCH +
  • the instruction following the FXCH must be a floating point instruction, otherwise the +FXCH will pair imperfectly and take an extra clock cycle. +

+This special pairing is important, as will be explained shortly. +

+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: +

    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

+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, +ST(0), 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 FXCH +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 FLD or +FCOMPP with FXCH. +

+By the proper use of FXCH instructions you may obtain a lot of overlapping in your floating +point code. Example: +

    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

+In the above example we are interleaving three independent threads. Each FADD takes 3 +clock cycles, and we can start a new FADD in each clock cycle. When we have started an +FADD in the 'a' thread we have time to start two new FADD +instructions in the 'b' and 'c' +threads before returning to the 'a' thread, so every third +FADD belongs to the same thread. +We are using FXCH instructions every time to get the register that belongs to the desired +thread into ST(0). As you can see in the example above, this generates a regular pattern, +but note well that the FXCH 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. +

+All versions of the instructions FADD, FSUB, FMUL, and +FILD 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. +

+By now you must be used to rules having exceptions, and the overlapping rule is no +exception: You cannot start an FMUL instruction one clock cycle +after another FMUL +instruction, because the FMUL circuitry is not perfectly pipelined. +It is recommended that you +put another instruction in between two FMUL's. Example: +

    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

+Here you have a stall before FMUL [b2] and before FMUL [c2] +because another FMUL +started in the preceding clock cycle. You can improve this code by putting +FLD instructions in between the FMUL's: +

    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

+In other cases you may put FADD, FSUB, or anything else in +between FMUL's to avoid the stalls. +

+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: + +

    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)

+ +Here we have a one clock stall before FADD [f] because it is waiting +for the result of FADD [d] and a two clock stall before the last +FADD because it is waiting for the result of +FADD [f]. 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 FXCH pair imperfectly. +

+The first stall can be avoided by having three threads rather than two, but +that would cost an extra FLD so we do not save anything by having +three threads rather than two unless there are at least eight numbers to add. +

+Not all floating point instructions can overlap. And some floating point +instructions can overlap more subsequent integer instructions than subsequent +floating point instructions. The FDIV 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: +

 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)

+The first FXCH pairs with the FDIV, but takes an extra +clock cycle because it is not followed by a floating point instruction. +The SHR / INC pair starts before the FDIV is finished, but +has to wait for the FXCH to finish. The FADD has to wait +till clock 38 because new floating point instructions can only execute during +the last two clock cycles of the FDIV. The second FXCH +pairs with the FADD. The FMUL has to wait for the FDIV +to finish because it uses the result of the division. +

+If you have nothing else to put in after a floating point instruction with a +large integer overlap, such as FDIV or FSQRT, 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: +

        FDIV    QWORD PTR [EBX]
+        CMP     [ESI],ESI
+        FMUL    QWORD PTR [ESI]

+Here we use the integer overlap to pre-load the value at [ESI] into +the cache while the FDIV is being computed (we don't care what +the result of the CMP is). +

+Chapter 28 gives a complete listing of floating point instructions, and +what they can pair or overlap with. +

+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 FST or FSTP 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: +

    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

+ +The FSTP [a3] stalls for one clock cycle because the result of +FADD [a2] 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 FST(P) instruction cannot pair +or overlap with any subsequent instructions. +

+Instructions with integer operands such as FIADD, FISUB, FIMUL, FIDIV, FICOM may +be split up into simpler operations in order to improve overlapping. Example: +

    FILD    [a]     ; clock cycle 1-3
+    FIMUL   [b]     ; clock cycle 4-9

+Split up into: +

    FILD    [a]     ; clock cycle 1-3
+    FILD    [b]     ; clock cycle 2-4
+    FMUL            ; clock cycle 5-7

+In this example, you save two clocks by overlapping the two FILD instructions. +

+

25. Loop optimization (all processors)

+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. +

+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 7). +

+

25.1. Loops in PPlain and PMMX

+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. +

+A C language code for this procedure would be: +

void ChangeSign (int * A, int * B, int N) {
+  int i;
+  for (i=0; i<N; i++) B[i] = -A[i];}
+

+Translating to assembly, we might write the procedure like this: +

+

Example 1.1:

+

_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

+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. +

+

Using pairable instructions only (PPlain and PMMX)

+

Example 1.2:

+

        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:

+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. +

+

Using the same register for counter and index

+

Example 1.3:

+

        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:

+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. +

+

Letting the counter end at zero (PPlain and PMMX)

+We want to get rid of the CMP 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: +

+

Example 1.4:

+

        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:

+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 A+SIZE A for ESI +and B+SIZE B for EDI). Now let's see how we +can improve pairing. +

+

Pairing calculations with loop overhead (PPlain and PMMX)

+We may want to improve pairing by intermingling calculations with the loop control +instructions. If we want to put something in between INC ECX +and JNZ L1, it has to be +something that doesn't affect the zero flag. The MOV [EDI+4*ECX],EBX +instruction after INC ECX would generate an AGI delay, so we have +to be more ingenious: +

+

Example 1.5:

+

        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:

+I have used a different way to calculate the negative of EAX 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 +INC instruction: INC doesn't change the carry flag, +whereas ADD does. I am using ADD +rather than INC to increment my loop counter and testing the carry +flag rather than the zero +flag. It is then possible to put the INC EAX in between without +affecting the carry flag. You +may think that we could have used LEA EAX,[EAX+1] here instead of +INC EAX, at least +that doesn't change any flags, but the LEA instruction would have +an AGI stall so that's not +the best solution. Note that the trick with the INC 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. +

+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. +

+

Overlapping the end of one operation with the beginning of the next (PPlain and PMMX)

+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 MOV of one iteration +with the first MOV of the next, but we want to explore this method further: +

+

Example 1.6:

+

        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:

+ +Here we begin reading the second value before we have stored the first, and +this of course improves pairing opportunities. The MOV EBX,0 +instruction has been put in between INC ECX and JNZ L1 +not to improve pairing but to avoid AGI stall. +

+

Rolling out a loop (PPlain and PMMX)

+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: +

+

Example 1.7:

+

        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:
+

+Now we are doing two operations in parallel which gives the best pairing opportunities. We +have to test if N is odd and if so do one operation outside the loop because the loop can +only do an even number of operations. +

+The loop has an AGI stall at the first MOV instruction because +ECX has been incremented in +the preceding clock cycle. The loop therefore takes 6 clock cycles for two operations. +

+

Reorganizing a loop to remove AGI stall (PPlain and PMMX)

+

Example 1.8:

+

        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:
+

+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. +

+If data caching is critical, then you may improve the speed further by +interleaving the A and B arrays into one structured array +so that each B[i] comes immediately after the +corresponding A[i]. If the structured array is aligned by at least +8 then B[i] will always be +in the same cache line as A[i], so you will never have a cache +miss when writing B[i]. +This may of course have a tradeoff in other parts of the program so you +have to weigh the costs against the benefits. +

+

Rolling out by more than 2 (PPlain and PMMX)

+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. +

+The drawbacks of excessive loop unrolling are: +

    +
  1. 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. +
  2. 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. +
  3. Excessive code size makes the utilization of the code cache less effective. +
+

+

Handling multiple 8 or 16 bit operands simultaneously in 32 bit registers (PPlain and PMMX)

+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 MOV AL,[ESI] / MOV BL,[ESI+1] 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. +

+The following example adds 2 to all elements of an array of bytes: +

+

Example 1.9:

+

        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:

+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. +

+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 XOR rather than +ADD when putting in the high bit again to avoid carry. +

+The ADD ESI,4 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. +

+The next example finds the length of a zero-terminated string by searching +for the first byte of zero. It is faster than using REP SCASB: +

+

Example 1.10:

+

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

+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. +

+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. +

+The TEST ECX,00008080H instruction is non-pairable. You could use the pairable +instruction OR CH,CL here instead, but then you would have to put +in a NOP or something to avoid the penalties of consecutive branches. +Another problem with OR CH,CL is that it +would cause a partial register stall on a PPro, PII and PIII. So I have chosen to keep the +unpairable TEST instruction. +

+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 LEA 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 BSWAP to reverse the order of the bytes. +

+If you want to search for a byte value other than zero, then you may XOR all four bytes +with the value you are searching for, and then use the method above to search for zero. +

+

Loops with MMX operations (PMMX)

+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. +

+Returning to the problem of adding two to all bytes in an array, we may take advantage of +the MMX instructions: +

Example 1.11:

+

.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

+The store instruction is moved to after the loop control instructions in order to avoid a store stall. +

+This loop takes 4 clocks because the PADDB instruction doesn't pair +with ADD ESI,8. (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 ADD ESI,8 by using ECX as index, +but that would give an AGI stall. +

+Since the loop overhead is considerable we might want to unroll the loop: +

+

Example 1.12:

+

.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

+This unrolled loop takes 6 clocks per iteration for adding 16 bytes. +The PADDB instructions are not paired. The two threads are +interleaved to avoid a store stall. +

+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. +

+

Loops with floating point operations (PPlain and PMMX)

+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. +

+Consider the C language code: +

  int i, n;  double * X;  double * Y;  double DA;
+  for (i=0; i<n; i++)  Y[i] = Y[i] - DA * X[i];

+This piece of code (called DAXPY) has been studied extensively because it is the key to +solving linear equations. +

+

Example 1.13:

+

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:

+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. +

+The interleaving of floating point operations work perfectly here: +The 2 clock stall between FMUL and FSUBR is filled +with the FSTP of the previous result. The 3 clock stall between +FSUBR and FSTP 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. +

+This solution takes 6 clock cycles per operation, which is better than the +unrolled solution published by Intel! +

+

Unrolling floating point loops (PPlain and PMMX)

+The DAXPY loop unrolled by 3 is quite complicated: +

Example 1.14:

+

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:

+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 FLD 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. +

+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. +

+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. +

+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. +

+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. +

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: +

+

Example 1.15:

+

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:
+

+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. +

+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. +

+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. +

+

25.2 Loops in PPro, PII and PIII

+In the previous chapter (25.1) 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. +

+I have chosen the same example as in chapter 25.1 +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. +

+A C language code for this procedure would be: +

void ChangeSign (int * A, int * B, int N) {
+  int i;
+  for (i=0; i<N; i++) B[i] = -A[i];}

+Translating to assembly, we might write the procedure like this: +

Example 2.1:

+

_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

+This looks like a nice solution, but it is not optimal because it uses the non-optimal +instructions LOOP, LODSD and STOSD 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: +

Example 2.2:

+

        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:

+The comments are interpreted as follows: the MOV EAX,[ESI] +instruction is 2 bytes long, it generates one uop for port 2 that reads +ESI and writes to (renames) EAX. This +information is needed for analyzing the possible bottlenecks. +

+Let's first analyze the instruction decoding (chapter 14): One of the +instructions generates 2 uops (MOV [EDI],EAX). +This instruction must go into decoder D0. There are three +decode groups in the loop so it can decode in 3 clock cycles. +

+Next, let's look at the instruction fetch (chapter 15): 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 ifetch table, 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. +

+The third problem to look at is register read stalls (chapter 16). 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. +

+The fourth analysis is execution (chapter 17). Counting the uops for the different ports we +get:
+port 0 or 1: 4 uops
+port 1 only: 1 uop
+port 2: 1 uop
+port 3: 1 uop
+port 4: 1 uop
+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. +

+The last analysis is retirement (chapter 18). 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. +

+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 22.2). +

+

Using the same register for counter and index and letting the counter end at zero (PPro, PII and PIII)

+

Example 2.3:

+

        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:

+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. +

+Decoding: There are two decode groups in the loop so it will decode in 2 clocks. +

+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. +

+Register read stalls: The ESI and EDI 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 EAX, ECX, 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. +

+Execution:
+port 0 or 1: 2 uops
+port 1: 1 uop
+port 2: 1 uop
+port 3: 1 uop
+port 4: 1 uop
+Execution time: 1.5 clocks. +

+Retirement:
+6 uops = 2 clocks. +

+Conclusion: this loop takes only 2 clock cycles per iteration. +

+If you use absolute addresses instead of ESI and EDI then the loop will take 3 clocks +because it cannot be contained in a single 16-byte block. +

+

Unrolling a loop (PPro, PII and PIII)

+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 25.1). 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. +

+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 +

Example 2.4:

+

        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:

+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. +

+Analyzing instruction fetching in this loop we find that a new ifetch block begins in the +ADD ESI,8 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 MOV [EDI+4],EAX to: +

    MOV [EDI+9999],EAX     ; make instruction with long displacement
+    ORG $-4
+    DD 4                   ; rewrite displacement to 4

+This will force a new ifetch block to begin at the long MOV [EDI+4],EAX +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. +

+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: +

Example 2.5:

+

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:

+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. +

+

Rolling out by more than 2

+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. +

+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: +

Example 2.6:

+

        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:

+The ifetch blocks are where we want them. Decode time is 6 clocks. +

+Register read stalls is a problem here because ECX has retired near the end of the loop +and we need to read both ESI, EDI, and ECX. 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 (EBX) is not the +same as in the previous example. +

+There are 12 uops and the loop executes in 6 clocks per iteration, or 1.5 clocks per +operation. +

+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. +

+The drawbacks of excessive loop unrolling are: +

    +
  1. 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. +
  2. 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. +
  3. Excessive code size makes the utilization of the code cache less effective. +
+

+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. +Example 1.14 shows how to unroll by 3. +

+

Handling multiple 8 or 16 bit operands simultaneously in 32 bit registers (PPro, PII and PIII)

+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: +

Example 2.7:

+

        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:

+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 XOR rather than +ADD when putting in the high bit again to avoid carry. +The array should of course be aligned by 4. +

+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. +

+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 REPNE SCASB: +

Example 2.8:

+

_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

+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. +

+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 LEA ECX instruction). I have not masked out the highest bit of each byte +before subtracting, as I did in example 2.7, 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 BSWAP to reverse the order of the bytes. If you want +to search for a byte value other than zero, then you may XOR all four bytes with the value +you are searching for, and then use the method above to search for zero. +

+

Loops with MMX instructions (PII and PIII)

+Using MMX instructions we can compare 8 bytes in one operation: +

Example 2.9:

+

_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

+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 REPNE SCASB. +

+

Loops with floating point instructions (PPro, PII and PIII)

+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. +

+Consider the C language code: +

  int i, n;  double * X;  double * Y;  double DA;
+  for (i=0; i<n; i++)  Y[i] = Y[i] - DA * X[i];

+This piece of code (called DAXPY) has been studied extensively because it is the key to +solving linear equations. +

Example 2.10:

+

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:

+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. +

+

Example 2.11:

+

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:

+Here we have used the same trick as in example 2.3. 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. +

+

Loops with XMM instructions (PIII)

+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. +

+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: +

Example 2.12:

+

        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:

+The L1 loop takes 5-6 clocks for 4 operations. +The ECX instructions have been placed before and after the +MULPS XMM0, XMM1 instruction in order to avoid a register read port stall +generated by the reading of the two parts of the XMM1 register +together with ESI or EDI in the RAT. The extra code after +L2 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 L2. +

+

26. Problematic Instructions

+

26.1 XCHG (all processors)

+The XCHG register,[memory] instruction is dangerous. By default this instruction has +an implicit LOCK prefix which prevents it from using the cache. This instruction is therefore +very time consuming, and should always be avoided. +

+

26.2 Rotates through carry (all processors)

+RCR and RCL with a count different from one are slow and should be avoided. +

+

26.3 String instructions (all processors)

+String instructions without a repeat prefix are too slow and should be replaced by simpler +instructions. The same applies to LOOP on all processors and to +JECXZ on PPlain and PMMX. +

+REP MOVSD and REP STOSD 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. +

+Some other methods of moving data are faster under certain conditions. See +chapter 27.8 for details. +

+Note that while the REP MOVS 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 ESI+(wordsize)-EDI 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 MOVSB or MOVSW in optimized code, not even in 16 bit mode. +

+REP MOVS and REP STOS 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: +

    +
  • both source and destination must be aligned by 8 +
  • direction must be forward (direction flag cleared) +
  • the count (ECX) must be greater than or equal to 64 +
  • the difference between EDI and ESI must be numerically greater than or equal to 32 +
  • the memory type for both source and destination must be either writeback or +write-combining (you can normally assume this). +

+Under these conditions the number of uops issued is approximately 215+2*ECX for +REP MOVSD and 185+1.5*ECX for REP STOSD, +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. +

+The byte and word versions also benefit from this fast mode, but they are less effective than +the dword versions. +

+REP STOSD is optimal under the same conditions as REP MOVSD. +

+REP LOADS, REP SCAS, and REP CMPS are not optimal, and +may be replaced by loops. See example 1.10, 2.8 +and 2.9 for alternatives to REPNE SCASB. REP CMPS +may suffer cache bank conflicts if bit 2-4 are the same in ESI and +EDI. +

+

26.4 Bit test (all processors)

+BT, BTC, BTR, and BTS instructions should preferably be replaced by instructions like +TEST, AND, OR, XOR, or shifts on PPlain and PMMX. On PPro, PII and PIII, bit tests with a +memory operand should be avoided. +

+

26.5 Integer multiplication (all processors)

+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 SHL, ADD, SUB, +and LEA. Example:
+IMUL EAX,10
+can be replaced with
+MOV EBX,EAX / ADD EAX,EAX / SHL EBX,3 / ADD EAX,EBX
+or
+LEA EAX,[EAX+4*EAX] / ADD EAX,EAX +

+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. +

+

26.6 WAIT instruction (all processors)

+You can often increase speed by omitting the WAIT instruction. +The WAIT instruction has three functions: +

+a. The old 8087 processor requires a WAIT before every +floating point instruction to make sure the coprocessor is ready to receive it. +

+b. WAIT is used for coordinating memory access between the floating point unit and the +integer unit. Examples: +

b.1.  FISTP [mem32]
+      WAIT             ; wait for FPU to write before..
+      MOV EAX,[mem32]  ; reading the result with the integer unit
+
+b.2.  FILD [mem32]
+      WAIT             ; wait for FPU to read value..
+      MOV [mem32],EAX  ; before overwriting it with integer unit
+
+b.3.  FLD QWORD PTR [ESP]
+      WAIT             ; prevent an accidental interrupt from..
+      ADD ESP,8        ; overwriting value on stack
+

+c. WAIT 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. +

+Regarding a:
+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 WAIT's by specifying a higher processor. A 8087 floating point emulator also +inserts WAIT instructions. You should therefore tell your assembler not to generate +emulation code unless you need it. +

+Regarding b:
+WAIT 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 WAIT on any 32 bit Intel processor, although Intel manuals say that +the WAIT is needed for this purpose except after FNSTSW + and FNSTCW. Omitting WAIT +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 WAIT. 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 WAIT is needed. +

+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 WAIT here in order to be +safe. +

+Regarding c:
+The assembler automatically inserts a WAIT for this purpose before the following +instructions: FCLEX, FINIT, FSAVE, FSTCW, FSTENV, FSTSW. You can omit the WAIT +by writing FNCLEX, etc. My tests show that the WAIT is unneccessary in most cases +because these instructions without WAIT will still generate an interrupt on exceptions except +for FNCLEX and FNINIT on the 80387. (There is some inconsistency about whether the +IRET from the interrupt points to the FN.. instruction or to the next instruction). +

+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 WAIT after the last floating point instruction in your +program to be sure to catch all exceptions. +

+You may still need the WAIT 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 FLD here, then +you need the WAIT because an interrupt after ADD ESP,8 would overwrite the value to load. +FNOP may be faster than WAIT and serve the same purpose. +

+

26.7 FCOM + FSTSW AX (all processors)

+The FNSTSW instruction is very slow on all processors. The PPro, PII and PIII +processors have +FCOMI instructions to avoid the slow FNSTSW. +Using FCOMI instead of the common +sequence FCOM / FNSTSW AX / SAHF will save you 8 clock cycles. You should +therefore use FCOMI to avoid FNSTSW wherever possible, even in cases where it costs +some extra code. +

+On processors without FCOMI instructions, the usual way of doing floating point +comparisons is: +

    FLD [a]
+    FCOMP [b]
+    FSTSW AX
+    SAHF
+    JB ASmallerThanB

+You may improve this code by using FNSTSW AX rather than +FSTSW AX and test AH +directly rather than using the non-pairable SAHF +(TASM version 3.0 has a bug with the FNSTSW AX instruction): +

    FLD [a]
+    FCOMP [b]
+    FNSTSW AX
+    SHR AH,1
+    JC ASmallerThanB
+

+Testing for zero or equality: +

    FTST
+    FNSTSW AX
+    AND AH,40H
+    JNZ IsZero     ; (the zero flag is inverted!)
+

+Test if greater: +

    FLD [a]
+    FCOMP [b]
+    FNSTSW AX
+    AND AH,41H
+    JZ AGreaterThanB
+

+Do not use TEST AH,41H as it is not pairable on PPlain and PMMX. +

+On the PPlain and PMMX, the FNSTSW 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 FNOP +which cannot change the status word, but not after integer instructions. +You can fill the latency between FCOM and +FNSTSW with integer instructions taking up to four clock cycles. +A paired FXCH immediately +after FCOM doesn't delay the FNSTSW, not even if the pairing is imperfect: +

    FCOM                  ; clock 1
+    FXCH                  ; clock 1-2 (imperfect pairing)
+    INC DWORD PTR [EBX]   ; clock 3-5
+    FNSTSW AX             ; clock 6-7
+

+You may want to use FCOM rather than FTST +here because FTST is not pairable. +Remember to include the N in FNSTSW. FSTSW +(without N) has a WAIT prefix which delays +it further. +

+It is sometimes faster to use integer instructions for comparing floating point values, as +described in chapter 27.6. +

+

26.8 FPREM (all processors)

+The FPREM and FPREM1 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 27.5 on how to truncate) +

+Some documents say that these instructions may give incomplete reductions and +that it is therefore necessary to repeat the FPREM or +FPREM1 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 FPREM or FPREM1 +was needed. +

+

26.9 FRNDINT (all processors)

+This instruction is slow on all processors. Replace it by: +

+    FISTP QWORD PTR [TEMP]
+    FILD  QWORD PTR [TEMP]

+This code is faster despite a possible penalty for attempting to read from +[TEMP] before the write is finished. It is recommended to put +other instructions in between in order to avoid +this penalty. See chapter 27.5 on how to truncate. +

+

26.10 FSCALE and exponential function (all processors)

+FSCALE 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 2N, where N is a signed integer, select from the examples below the one that +fits your range of N: +

+For |N| < 27-1 you can use single precision: +

    MOV     EAX, [N]
+    SHL     EAX, 23
+    ADD     EAX, 3F800000H
+    MOV     DWORD PTR [TEMP], EAX
+    FLD     DWORD PTR [TEMP]
+

+For |N| < 210-1 you can use double precision: +

    MOV     EAX, [N]
+    SHL     EAX, 20
+    ADD     EAX, 3FF00000H
+    MOV     DWORD PTR [TEMP], 0
+    MOV     DWORD PTR [TEMP+4], EAX
+    FLD     QWORD PTR [TEMP]
+

+For |N| < 214-1 use long double precision: +

    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]
+

+FSCALE is often used in the calculation of exponential functions. The following code shows +an exponential function without the slow FRNDINT and FSCALE instructions: +

+

; 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
+

+

26.11 FPTAN (all processors)

+According to the manuals, FPTAN 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, +FPTAN 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. +

+

26.12 FSQRT (PIII)

+A fast way of calculating an approximate squareroot on the PIII is to multiply +the reciprocal squareroot of x by x:
+SQRT(x) = x * RSQRT(x)
+The instruction RSQRTSS or RSQRTPS 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:
+x0 = RSQRTSS(a)
+x1 = 0.5 * x0 * (3 - (a * x0)) * x0)
+where x0 is the first approximation to the reciprocal squareroot of +a, and x1 is a better approximation. The order of evaluation is +important. You must use this formula before multiplying with a to get the squareroot. +

+

26.13 MOV [MEM], ACCUM (PPlain and PMMX)

+The instructions MOV [mem],AL   MOV [mem],AX   MOV [mem],EAX + are treated by the pairing circuitry as if they were writing to the accumulator. + Thus the following instructions do not pair: +

    MOV [mydata], EAX
+    MOV EBX, EAX
+

+This problem occurs only with the short form of the MOV + 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 MOV instruction. +

+In 32 bit mode you can write the general form of MOV [mem],EAX: +

    DB 89H, 05H
+    DD OFFSET DS:mem
+

+In 16 bit mode you can write the general form of MOV [mem],AX: +

    DB 89H, 06H
+    DW OFFSET DS:mem
+

+To use AL instead of (E)AX, you replace 89H + with 88H +

+This flaw has not been fixed in the PMMX. +

+

26.14 TEST instruction (PPlain and PMMX)

+The TEST instruction with an immediate operand is only +pairable if the destination is AL, AX, or EAX. +

+TEST register,register + and TEST register,memory is always pairable. +

+Examples: +

    TEST ECX,ECX                ; pairable
+    TEST [mem],EBX              ; pairable
+    TEST EDX,256                ; not pairable
+    TEST DWORD PTR [EBX],8000H  ; not pairable

+To make it pairable, use any of the following methods: +

    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)

+(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.) +

+

26.15 Bit scan (PPlain and PMMX)

+BSF and BSR 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. +

+The following code emulates BSR ECX,EAX: +

        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:
+

+The following code emulates BSF ECX,EAX: +

        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:
+

+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. +

+

26.16 FLDCW (PPro, PII and PIII)

+The PPro, PII and PIII have a serious stall after the +FLDCW instruction if followed by any floating +point instruction which reads the control word (which almost all floating +point instructions do). +

+When C or C++ code is compiled it often generates a lot of +FLDCW 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 FLDCW out of a loop +where truncation is needed inside the loop. +

+See chapter 27.5 on how to convert floating point numbers to integers +whitout changing the control word. +

+

27. Special topics

+

27.1 LEA instruction (all processors)

+The LEA 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:
+LEA EAX,[EBX+8*ECX-1000]
+is much faster than
+MOV EAX,ECX / SHL EAX,3 / ADD EAX,EBX / SUB EAX,1000
+The LEA 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 LEA EAX,[BX] is a possible +replacement for MOVZX EAX,BX, although suboptimal on most processors. +

+You must be aware, however, that the LEA 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. +

+Since the LEA instruction is pairable in the v-pipe on PPlain and +PMMX and shift instructions are not, you may use LEA as +a substitute for a SHL by 1, 2, or 3 if you want the +instruction to execute in the V-pipe. +

+The 32 bit processors have no documented addressing mode with a scaled index register +and nothing else, so an instruction like LEA EAX,[EAX*2] +is actually coded as LEA EAX,[EAX*2+00000000] +with an immediate displacement of 4 bytes. You may reduce the +instruction size by instead writing LEA EAX,[EAX+EAX] or even +better ADD EAX,EAX. +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: +

+

LEA EAX,[EBX*4]     ; 7 bytes
+LEA EAX,[ECX+EBX*4] ; 3 bytes
+

+

27.2 Division (all processors)

+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. +

+

Integer division by a constant (all processors)

+Integer division by a power of two can be done by shifting right. Dividing an +unsigned integer by 2N: +

        SHR     EAX, N

+Dividing a signed integer by 2N: +

        CDQ
+        AND     EDX, (1 SHL N) -1  ; or  SHR EDX, 32-N
+        ADD     EAX, EDX
+        SAR     EAX, N

+The SHR alternative is shorter than the AND if N > 7, +but can only go to execution port 0 (or u-pipe), whereas AND can +go to either port 0 or 1 (u or v-pipe). +

+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 = 2r / 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 2b <= d). Use r = 32+b to cover the maximum +range for the value of the dividend x. +

+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 DIV +instruction gives (Thanks to Terje Mathisen who invented this method): +

+  b = (the number of significant bits in d) - 1
+  r = 32 + b
+  f = 2r / 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 = 2b)
+  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
+  
+

+Example:
+Assume that you want to divide by 5.
+5 = 00000101b.
+b = (number of significant binary digits) - 1 = 2
+r = 32+2 = 34
+f = 234 / 5 = 3435973836.8 = 0CCCCCCCC.CCC...(hexadecimal)
+The fractional part is greater than a half: use case C.
+Round f up to 0CCCCCCCDh. +

+The following code divides EAX by 5 and returns the result in EDX: +

        MOV     EDX,0CCCCCCCDh
+        MUL     EDX
+        SHR     EDX,2
+

+After the multiplication, EDX 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 SHR EDX,3. +

+In case B you would have: +

        INC     EAX
+        MOV     EDX,f
+        MUL     EDX
+        SHR     EDX,b
+

+This code works for all values of x except 0FFFFFFFFH which gives zero because of +overflow in the INC instruction. If x = 0FFFFFFFFH is possible, then change the code to: +

        MOV     EDX,f
+        ADD     EAX,1
+        JC      DOVERFL
+        MUL     EDX
+DOVERFL:SHR     EDX,b
+

+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: +

    +
  • you may set r = 32 to avoid the SHR EDX,b in the end. +
  • 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 EDX register: +
       IMUL EAX,0CCCDh / SHR EAX,18
    +
  • you may choose a value of r that gives case C rather than case +B in order to avoid the INC EAX instruction +
+

+The maximum value for x in these cases is at least 2r-b, +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. +

+You may want to replace the slow multiplication instruction with faster instructions as +explained in chapter 26.5. +

+The following example divides EAX by 10 and returns the result +in EAX. 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 = 217 / 10 = 3333h, case B: q = (x+1)*3333h: +

        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
+

+A systematic test shows that this code works correctly for all x < 10004H. +

+

Repeated integer division by the same value (all processors)

+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. +

+The code that follows shows how to do multiple divisions with the same divisor (unsigned +division with truncation). First call SET_DIVISOR to specify the +divisor and calculate the +reciprocal, then call DIVIDE_FIXED for each value to divide by the same divisor. +

+.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

+This code gives the same result as the DIV instruction for +0 <= x < 232, 0 < d < 232.
+Note: The line JC DOVERFL and its target are not needed if +you are certain that x < 0FFFFFFFFH. +

+If powers of 2 occur so seldom that it is not worth optimizing for them, +then you may leave out the jump to DSHIFT and instead do a +multiplication with CORRECTION = 0 for case A. +

+If the divisor is changed so often that the procedure SET_DIVISOR needs optimizing, then you may +replace the BSR instruction with the code given in chapter +26.15 for the PPlain and PMMX processors. +

+

Floating point division (all processors)

+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 FDIV and FIDIV are faster at low +precision; on PPro, PII and PIII, this also applies +to FSQRT. No other instructions can be speeded up this way). +

+

Parallel division (PPlain and PMMX)

+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.
+Example: A = A1 / A2; B = B1 / B2 +

        FILD    [B1]
+        FILD    [B2]
+        MOV     EAX, [A1]
+        MOV     EBX, [A2]
+        CDQ
+        FDIV
+        DIV     EBX
+        FISTP   [B]
+        MOV     [A], EAX

+(make sure you set the floating point control word to the desired rounding method) +

+

Using reciprocal instruction for fast division (PIII)

+On PIII you can use the fast reciprocal instruction RCPSS or +RCPPS 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:
+x0 = RCPSS(d)
+x1 = x0 * (2 - d * x0) += 2*x0 - d * x0 * x0
+where x0 is the first approximation to the reciprocal of the divisor, d, +and x1 is a better approximation. You must use this formula before +multiplying with the dividend: +

        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

+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. +

+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: +

        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

+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. +

+

Avoiding divisions (all processors)

+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. +

+A/B + C/D can be rewritten as (A*D + C*B) / (B*D) +

+If you are using integer division, then you should be aware that the rounding errors may be +different when you rewrite the formulas. +

+

27.3 Freeing floating point registers (all processors)

+You have to free all used floating point registers before exiting a subroutine, +except for any register used for the result. +

+The fastest way of freeing one register is FSTP ST. +The fastest way of freeing two registers is FCOMPP on PPlain and PMMX; +on PPro, PII and PIII you may use either +FCOMPP or two times FSTP ST, whichever fits best into +the decoding sequence. +

+It is not recommended to use FFREE. +

+

27.4 Transitions between floating point and MMX instructions (PMMX, PII and PIII)

+You must issue an EMMS instruction after your last MMX instruction if there +is a possibility that floating point code follows later. +

+On PMMX there is a high penalty for switching between floating point and MMX +instructions. The first floating point instruction after an +EMMS takes approximately 58 clocks extra, and the first MMX instruction +after a floating point instruction takes approximately 38 clocks extra. +

+On PII and PIII there is no such penalty. The delay after EMMS +can be hidden by putting in integer +instructions between EMMS and the first floating point instruction. +

+

27.5 Converting from floating point to integer (All processors)

+All conversions from floating point to integer, and vice versa, must go via a memory +location: +

    FISTP DWORD PTR [TEMP]
+    MOV EAX, [TEMP]

+On PPro, PII and PIII, this code is likely to have a penalty for attempting to +read from [TEMP] before the write to [TEMP] is finished +because the FIST instruction is slow (see chapter 17). +It doesn't help to put in a WAIT (see chapter 26.6). +It is recommended that you put in other instructions between the write to +[TEMP] and the read from [TEMP] if possible in +order to avoid this penalty. This applies to all the examples that follow. +

+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 +FISTP 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 FLDCW instruction to retire. +

+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. +

+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. +

+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. +

+

Rounding to nearest or even

+

; 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
+

+

Truncation towards zero

+

; 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
+

+

Truncation towards minus infinity

+

; 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
+

+These procedures work for -231 < x < 231-1. +They do not check for overflow or NAN's. +

+The PIII has instructions for truncation of single precision floating point +numbers: CVTTSS2SI and CVTTPS2PI. 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. +

+

Alternative to FISTP instruction (PPlain and PMMX)

+

+Converting a floating point number to integer is normally done like this: +

        FISTP   DWORD PTR [TEMP]
+        MOV     EAX, [TEMP]
+

+An alternative method is: +

.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]
+

+Adding the 'magic number' of 251 + 252 has the effect +that any integer between -231 and +231 + 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 FISTP for all rounding methods except +truncation towards zero. The result is different from FISTP if the control word specifies +truncation or in case of overflow. You may need a WAIT instruction for +compatibility with the old 80287 processor, see chapter 26.6. +

+This method is not faster than using FISTP, but it gives better +scheduling opportunities on +PPlain and PMMX because there is a 3 clock void between FADD + and FSTP 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. +

+

27.6 Using integer instructions to do floating point operations (all processors)

+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:
+ FLD QWORD PTR [ESI] / FSTP QWORD PTR [EDI]
+Change to:
+ MOV EAX,[ESI] / MOV EBX,[ESI+4] / MOV [EDI],EAX / MOV [EDI+4],EBX
+

+

Testing if a floating point value is zero:

+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:
+ FLD DWORD PTR [EBX] / FTST / FNSTSW AX / AND AH,40H / JNZ IsZero
+Use integer instructions instead, and shift out the sign bit:
+ MOV EAX,[EBX] / ADD EAX,EAX / JZ IsZero
+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. +

+

Testing if negative:

+A floating point number is negative if the sign bit is set and at least one other bit is set. +Example:
+ MOV EAX,[NumberToTest] / CMP EAX,80000000H / JA IsNegative +

+

Manipulating the sign bit:

+You can change the sign of a floating point number simply by flipping the +sign bit. Example:
+ XOR BYTE PTR [a] + (TYPE a) - 1, 80H +

+Likewise you may get the absolute value of a floating point number by simply ANDing out +the sign bit. +

+

Comparing numbers:

+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:
+ FLD [a] / FCOMP [b] / FNSTSW AX / AND AH,1 / JNZ ASmallerThanB
+Change to:
+ MOV EAX,[a] / MOV EBX,[b] / CMP EAX,EBX / JB ASmallerThanB
+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. +

+If negative numbers are possible, then you have to convert the negative numbers to +2-complement, and do a signed compare: +

        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

+This method works for all normal floating point numbers, including -0. +

+

27.7 Using floating point instructions to do integer operations (PPlain and PMMX)

+

Integer multiplication (PPlain and PMMX)

+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!) +

+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. +

+Integer multiplication is faster than floating point on PPro, PII and PIII. +

+

Integer division (PPlain and PMMX)

+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 above). +

+

Converting binary to decimal numbers (all processors)

+Using the FBSTP instruction is a simple and convenient way of converting a binary number +to decimal, although not necessarily the fastest method. +

+

27.8 Moving blocks of data (all processors)

+There are several ways of moving blocks of data. The most common method is +REP MOVSD, but under certain conditions other methods are faster. +

+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: +

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
+

+The source and destination should of course be aligned by 8. The extra time used by the +slow FILD and FISTP 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 +FLD and FSTP (without I) on arbitrary bit patterns because denormal numbers +are handled slowly and certain bit patterns are not preserved unchanged. +

+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: +

TOP:    MOVQ    MM0,[ESI]
+        MOVQ    [EDI],MM0
+        ADD     ESI,8
+        ADD     EDI,8
+        DEC     ECX
+        JNZ     TOP
+

+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. +

+On PPro, PII and PIII processors the REP MOVSD instruction is particularly +fast when the following conditions are met (see chapter 26.3): +

    +
  • both source and destination must be aligned by 8 +
  • direction must be forward (direction flag cleared) +
  • the count (ECX) must be greater than or equal to 64 +
  • the difference between EDI and ESI must be numerically greater than or equal to 32 +
  • the memory type for both source and destination must be either writeback or +write-combining (you can normally assume this). +
+

+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. +

+On the PIII the fastest way of moving data is to use the MOVAPS +instruction if the above conditions are not met or if the destination is in +the level 1 or level 2 cache: +

        SUB     EDI, ESI
+TOP:    MOVAPS  XMM0, [ESI]
+        MOVAPS  [ESI+EDI], XMM0
+        ADD     ESI, 16
+        DEC     ECX
+        JNZ     TOP

+Unlike FLD, MOVAPS can handle any bit pattern without +problems. Remember that source and destination must be aligned by 16. +

+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. +

+On the PIII you also have the option of writing directly to RAM memory without +involving the cache by using the MOVNTQ or MOVNTPS +instruction. This can be useful if you don't want the destination to go into +a cache. MOVNTPS is only slightly faster than MOVNTQ. +

+

27.9 Self-modifying code (All processors)

+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. +

+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). +

+Self-modifying code is not considered good programming practice, but it may be justified if +the gain in speed is considerable. +

+

27.10 Detecting processor type (All processors)

+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, FCOMI, 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. +

+

; 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
+

+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". +

+To code the conditional move, MMX, XMM instructions etc. on an assembler that doesn't have +these instructions use the macros at www.agner.org/assem/macros.zip +

+

28. List of instruction timings for PPlain and PMMX

+

28.1 Integer instructions

+Explanations:
+Operands:
+r = register, m = memory, i = immediate data, sr = segment register
+m32 = 32 bit memory operand, etc. +

+Clock cycles:
+The numbers are minimum values. Cache misses, misalignment, and exceptions may +increase the clock counts considerably. +

+Pairability:
+u = pairable in u-pipe, v = pairable in v-pipe, uv = pairable in either pipe, +np = not pairable. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Instruction  Operands  Clock cycles  Pairability 
NOP 1uv
MOVr/m, r/m/i1uv
MOVr/m, sr1np
MOVsr , r/m>= 2 b)np
MOVm , accum1uv h)
XCHG(E)AX, r2np
XCHGr , r3np
XCHGr , m>15np
XLAT 4np
PUSHr/i1uv
POPr1uv
PUSHm2np
POPm3np
PUSHsr1 b)np
POPsr>= 3 b)np
PUSHF 3-5np
POPF 4-6np
PUSHA POPA 5-9 i)np
PUSHAD POPAD 5np
LAHF SAHF 2np
MOVSX MOVZXr , r/m3 a)np
LEAr , m1uv
LDS LES LFS LGS LSSm4 c)np
ADD SUB AND OR XORr , r/i1uv
ADD SUB AND OR XORr , m2uv
ADD SUB AND OR XORm , r/i3uv
ADC SBBr , r/i1u
ADC SBBr , m2u
ADC SBBm , r/i3u
CMPr , r/i1uv
CMPm , r/i2uv
TESTr , r1uv
TESTm , r2uv
TESTr , i1f)
TESTm , i2np
INC DECr1uv
INC DECm3uv
NEG NOTr/m1/3np
MUL IMULr8/r16/m8/m1611np
MUL IMULall other versions9 d)np
DIVr8/m817np
DIVr16/m1625np
DIVr32/m3241np
IDIVr8/m822np
IDIVr16/m1630np
IDIVr32/m3246np
CBW CWDE 3np
CWD CDQ 2np
SHR SHL SAR SALr , i1u
SHR SHL SAR SALm , i3u
SHR SHL SAR SALr/m, CL4/5np
ROR ROL RCR RCLr/m, 11/3u
ROR ROLr/m, i(><1)1/3np
ROR ROLr/m, CL4/5np
RCR RCLr/m, i(><1)8/10np
RCR RCLr/m, CL7/9np
SHLD SHRDr, i/CL4 a)np
SHLD SHRDm, i/CL5 a)np
BTr, r/i4 a)np
BTm, i4 a)np
BTm, i9 a)np
BTR BTS BTCr, r/i7 a)np
BTR BTS BTCm, i8 a)np
BTR BTS BTCm, r14 a)np
BSF BSRr , r/m7-73 a)np
SETccr/m1/2 a)np
JMP CALLshort/near1 e)v
JMP CALLfar>= 3 e)np
conditional jumpshort/near1/4/5/6 e)v
CALL JMPr/m2/5 enp
RETN 2/5 enp
RETNi3/6 e)np
RETF 4/7 e)np
RETFi5/8 e)np
J(E)CXZshort4-11 e)np
LOOPshort5-10 e)np
BOUNDr , m8np
CLC STC CMC CLD STD 2np
CLI STI 6-9np
LODS 2np
REP LODS 7+3*n g)np
STOS 3np
REP STOS 10+n g)np
MOVS 4np
REP MOVS 12+n g)np
SCAS 4np
REP(N)E SCAS 9+4*n g)np
CMPS 5np
REP(N)E CMPS 8+4*n g)np
BSWAP 1 a)np
CPUID 13-16 a)np
RDTSC 6-13 a) j)np
+

+Notes:
+a) this instruction has a 0FH prefix which takes one clock cycle extra to + decode on a PPlain unless preceded by a multicycle instruction (see + chapter 12).
+b) versions with FS and GS have a 0FH + prefix. see note a.
+c) versions with SS, FS, and GS have a 0FH prefix. see note a.
+d) versions with two operands and no immediate have a 0FH prefix, see note a.
+e) see chapter 22
+f) only pairable if register is accumulator. see chapter 26.14.
+g) add one clock cycle for decoding the repeat prefix unless preceded by a + multicycle instruction (such as CLD. see chapter 12).
+h) pairs as if it were writing to the accumulator. see chapter 26.14.
+i) 9 if SP divisible by 4. See 10.2
+j) on PPlain: 6 in priviledged or real mode, 11 in nonpriviledged, error in + virtual mode. On PMMX: 8 and 13 clocks respectively.
+

+

28.2 Floating point instructions

+

+Explanations:
+Operands:
+r = register, m = memory, m32 = 32 bit memory operand, etc. +

+Clock cycles:
+The numbers are minimum values. Cache misses, misalignment, denormal operands, and +exceptions may increase the clock counts considerably. +

+Pairability:
++ = pairable with FXCH, np = not pairable with FXCH. +

+i-ov:
+Overlap with integer instructions. i-ov = 4 means that the last four clock cycles can overlap +with subsequent integer instructions. +

+fp-ov:
+Overlap with floating point instructions. fp-ov = 2 means that the last two clock cycles can +overlap with subsequent floating point instructions. +(WAIT is considered a floating point instruction here)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 Instruction  Operand  Clock cycles  Pairability  i-ov  fp-ov 
FLDr/m32/m641+00
FLDm803np00
FBLDm8048-58np00
FST(P)r1np00
FST(P)m32/m642 m)np00
FST(P)m803 m)np00
FBSTPm80148-154np00
FILDm3np22
FIST(P)m6np00
FLDZ FLD1 2np00
FLDPI FLDL2E etc. 5 s)np22
FNSTSWAX/m166 q)np00
FLDCWm168np00
FNSTCWm162np00
FADD(P)r/m3+22
FSUB(R)(P)r/m3+22
FMUL(P)r/m3+22 n)
FDIV(R)(P)r/m19/33/39 p)+38 o)2
FCHS FABS 1+00
FCOM(P)(P) FUCOMr/m1+00
FIADD FISUB(R)m6np22
FIMULm6np22
FIDIV(R)m22/36/42 p)np38 o)2
FICOMm4np00
FTST 1np00
FXAM 17-21np40
FPREM 16-64np22
FPREM1 20-70np22
FRNDINT 9-20np00
FSCALE 20-32np50
FXTRACT 12-66np00
FSQRT 70np69 o)2
FSIN FCOS 65-100 r)np22
FSINCOS 89-112 r)np22
F2XM1 53-59 r)np22
FYL2X 103 r)np22
FYL2XP1 105 r)np22
FPTAN 120-147 r)np36 o)0
FPATAN 112-134 r)np22
FNOP 1np00
FXCHr1np00
FINCSTP FDECSTP 2np00
FFREEr2np00
FNCLEX 6-9np00
FNINIT 12-22np00
FNSAVEm124-300np00
FRSTORm70-95np00
WAIT 1np00
+

+Notes:
+m) The value to store is needed one clock cycle in advance.
+n) 1 if the overlapping instruction is also an FMUL.
+o) Cannot overlap integer multiplication instructions.
+p) FDIV takes 19, 33, or 39 clock cycles for 24, 53, and 64 bit precision +respectively. FIDIV takes 3 clocks more. The precision is defined by bit +8-9 of the floating point control word.
+q) The first 4 clock cycles can overlap with preceding integer instructions. +See chapter 26.7.
+r) clock counts are typical. Trivial cases may be faster, extreme cases may +be slower.
+s) may be up to 3 clocks more when output needed for FST, +FCHS, or FABS. +

+

28.3 MMX instructions (PMMX)

+

+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. +

+The EMMS instruction takes only one clock cycle, but the first floating point instruction after +an EMMS 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 EMMS on the PMMX (but a possible small penalty on the PII and PIII). +

+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. +

+All MMX instructions except EMMS are pairable in either pipe. Pairing rules for MMX +instructions are described in chapter 10. +

+

29. List of instruction timings and micro-op breakdown for PPro, PII and PIII

+Explanations:
+Operands:
+r = register, m = memory, i = immediate data, sr = segment register, +m32 = 32 bit memory operand, etc. +

+Micro-ops:
+The number of micro-ops that the instruction generates for each execution port.
+p0: port 0: ALU, etc.
+p1: port 1: ALU, jumps
+p01: instructions that can go to either port 0 or 1, whichever is vacant first.
+p2: port 2: load data, etc.
+p3: port 3: address generation for store
+p4: port 4: store data +

+Delay:
+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. +

+Throughput:
+The maximum throughput for several instructions of the same kind. For example, a +throughput of 1/2 for FMUL means that a new FMUL instruction can start executing +every 2 clock cycles.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
29.1 Integer instructions
InstructionOperandsmicro-opsdelaythroughput
  p0p1p01p2p3p4  
NOP   1     
MOVr,r/i  1     
MOVr,m   1    
MOVm,r/i    11  
MOVr,sr  1     
MOVm,sr  1 11  
MOVsr,r8   5 
MOVsr,m71  8 
MOVSX MOVZXr,r  1     
MOVSX MOVZXr,m   1    
CMOVccr,r1 1     
CMOVccr,m1 11    
XCHGr,r  3     
XCHGr,m  4111high b) 
XLAT   11    
PUSHr/i  1 11  
POPr  11    
POP(E)SP  21    
PUSHm  1111  
POPm  5111  
PUSHsr  2 11  
POPsr  81    
PUSHF(D) 3 11 11  
POPF(D) 10 61    
PUSHA(D)   2 88  
POPA(D)   28    
LAHF SAHF   1     
LEAr,m1     1 c) 
LDS LES LFS LGS LSSm  83    
ADD SUB AND OR XORr,r/i  1     
ADD SUB AND OR XORr,m  11    
ADD SUB AND OR XORm,r/i  1111  
ADC SBBr,r/i  2     
ADC SBBr,m  21    
ADC SBBm,r/i  3111  
CMP TESTr,r/i  1     
CMP TESTm,r/i  11    
INC DEC NEG NOTr  1     
INC DEC NEG NOTm  1111  
AAS DAA DAS  1      
AAD 1 2   4 
AAM 112   15 
MUL IMULr,(r),(i)1     41/1
MUL IMUL(r),m1  1  41/1
DIV IDIVr82 1   191/12
DIV IDIVr163 1   231/21
DIV IDIVr323 1   391/37
DIV IDIVm82 11  191/12
DIV IDIVm162 11  231/21
DIV IDIVm322 11  391/37
CBW CWDE   1     
CWD CDQ 1       
SHR SHL SAR ROR ROLr,i/CL1       
SHR SHL SAR ROR ROLm,i/CL1  111  
RCR RCLr,11 1     
RCR RCLr8,i/CL4 4     
RCR RCLr16/32,i/CL3 3     
RCR RCLm,11 2111  
RCR RCLm8,i/CL4 3111  
RCR RCLm16/32,i/CL4 2111  
SHLD SHRDr,r,i/CL2       
SHLD SHRDm,r,i/CL2 1111  
BTr,r/i  1     
BTm,r/i1 61    
BTR BTS BTCr,r/i  1     
BTR BTS BTCm,r/i1 6111  
BSF BSRr,r 11     
BSF BSRr,m 111    
SETccr  1     
SETccm  1 11  
JMPshort/near 1     1/2
JMPfar211    
JMPr 1     1/2
JMPm(near) 1 1   1/2
JMPm(far)212    
conditional jumpshort/near 1     1/2
CALLnear 11 11 1/2
CALLfar28122  
CALLr 12 11 1/2
CALLm(near) 14111 1/2
CALLm (far)28222  
RETN  121   1/2
RETNi 131   1/2
RETF 233    
RETFi233    
J(E)CXZshort 11     
LOOPshort218     
LOOP(N)Eshort218     
ENTERi,0  12 11  
ENTERa,bca. 18+4b b-12b  
LEAVE   21    
BOUNDr,m7 62    
CLC STC CMC   1     
CLD STD   4     
CLI 9     
STI 17     
INTO   5     
LODS    2    
REP LODS   10+6n    
STOS    111  
REP STOS   ca. 5n a)  
MOVS   1311  
REP MOVS   ca. 6n a)  
SCAS   12    
REP(N)E SCAS   12+7n    
CMPS   42    
REP(N)E CMPS   12+9n    
BSWAP 1 1     
CPUID 23-48     
RDTSC 31     
IN 18   >300 
OUT 18   >300 
PREFETCHNTA  d)m    1   
PREFETCHT0  d)m    1    
PREFETCHT1  d)m    1    
PREFETCHT2  d)m    1   
SFENCE  d)      1 + 1 1/6

+Notes:
+a) faster under certain conditions: see chapter 26.3.
+b) see chapter 26.1
+c) 3 if constant without base or index register
+d) PIII only. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
29.2 Floating point instructions
InstructionOperandsmicro-opsdelaythroughput
  p0p1p01p2p3p4  
FLDr1       
FLDm32/64   1  1 
FLDm802  2    
FBLDm8038  2    
FST(P)r1       
FST(P)m32/m64    111 
FSTPm802   22  
FBSTPm80165   22  
FXCHr      03/1 f)
FILDm3  1  5 
FIST(P)m2   115 
FLDZ 1       
FLD1 FLDPI FLDL2E etc.2       
FCMOVccr2     2 
FNSTSWAX3     7 
FNSTSWm161   11  
FLDCWm161 11  10 
FNSTCWm161   11  
FADD(P) FSUB(R)(P)r1     31/1
FADD(P) FSUB(R)(P)m1  1  3-41/1
FMUL(P)r1     51/2 g)
FMUL(P)m1  1  5-61/2 g)
FDIV(R)(P)r1     38 h)1/37
FDIV(R)(P)m1  1  38 h)1/37
FABS 1       
FCHS 3     2 
FCOM(P) FUCOMr1     1 
FCOM(P) FUCOMm1  1  1 
FCOMPP FUCOMPP 1 1   1 
FCOMI(P) FUCOMI(P)r1     1 
FCOMI(P) FUCOMI(P)m1  1  1 
FIADD FISUB(R)m6  1    
FIMULm6  1    
FIDIV(R)m6  1    
FICOM(P)m6  1    
FTST 1     1 
FXAM 1     2 
FPREM 23       
FPREM1 33       
FRNDINT 30       
FSCALE 56       
FXTRACT 15       
FSQRT 1     69e,i)
FSIN FCOS 17-97   27-103e)
FSINCOS 18-110   29-130e)
F2XM1 17-48   66e)
FYL2X 36-54   103e)
FYL2XP1 31-53   98-107e)
FPTAN 21-102   13-143e)
FPATAN 25-86   44-143e)
FNOP 1       
FINCSTP FDECSTP 1       
FFREEr1       
FFREEPr2       
FNCLEX   3     
FNINIT 13     
FNSAVE 141     
FRSTOR 72     
WAIT   2     
+ +

Notes:
+e) not pipelined
+f) FXCH generates 1 micro-op that is resolved by register renaming without + going to any port.
+g) FMUL uses the same circuitry as integer multiplication. Therefore, the + combined throughput of mixed floating point and integer multiplications is + 1 FMUL + 1 IMUL per 3 clock cycles.
+h) FDIV 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).
+i) faster for lower precision. +

+ + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
29.3 MMX instructions (PII and PIII)
InstructionOperandsmicro-opsdelaythroughput
  p0p1p01p2p3p4  
MOVD MOVQr,r  1   +  2/1
MOVD MOVQr64,m32/64   1  +  1/1
MOVD MOVQm32/64,r64  +   1 +1 1/1
PADD PSUB PCMPr64,r64  1   +  1/1
PADD PSUB PCMPr64,m64  11  +  1/1
PMUL PMADDr64,r641     + 31/1
PMUL PMADDr64,m641  1  + 31/1
PAND PANDN POR
PXOR
r64,r64  1  +   2/1
PAND PANDN POR
PXOR
r64,m64  11  +  1/1
PSRA PSRL PSLLr64,r64/i 1    +  1/1
PSRA PSRL PSLLr64,m64 1 1  +  1/1
PACK PUNPCKr64,r64 1    +  1/1
PACK PUNPCKr64,m64 1 1  +  1/1
EMMS 11   + 6 k) 
MASKMOVQ  d)r64,r64   1  1 12-81/30-1/2
PMOVMSKB  d)r32,r64  1     1 1/1
MOVNTQ  d)m64,r64     1 1 1/30-1/1
PSHUFW  d)r64,r64,i  1     1 1/1
PSHUFW  d)r64,m64,i  1  1   2 1/1
PEXTRW  d)r32,r64,i  1 1    2 1/1
PISRW  d)r64,r32,i  1     1 1/1
PISRW  d)r64,m16,i  1  1   2 1/1
PAVGB PAVGW  d)r64,r64   1    1 2/1
PAVGB PAVGW  d)r64,m64   1 1   2 1/1
PMINUB PMAXUB PMINSW PMAXSW  d)r64,r64   1    1 2/1
PMINUB PMAXUB PMINSW PMAXSW  d)r64,m64   1 1   2 1/1
PMULHUW  d)r64,r64 1      3 1/1
PMULHUW  d)r64,m64 1   1   4 1/1
PSADBW  d)r64,r64 2  1    5 1/2
PSADBW  d)r64,m64 2  1 1   6 1/2

+Notes:
+d) PIII only.
+k) you may hide the delay by inserting other instructions between EMMS and any +subsequent floating point instruction. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +  + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
29.4 XMM instructions (PIII)
InstructionOperandsmicro-opsdelaythroughput
   p0  p1  p01  p2  p3  p4   
MOVAPSr128,r128  2   + 11/1
MOVAPSr128,m128   2  + 21/2
MOVAPSm128,r128    2231/2
MOVUPSr128,m128   4  21/4
MOVUPSm128,r128 1  4431/4
MOVSSr128,r128  1   11/1
MOVSSr128,m32  11  11/1
MOVSSm32,r128    1111/1
MOVHPS MOVLPSr128,m64  1   11/1
MOVHPS MOVLPSm64,r128    1111/1
MOVLHPS MOVHLPSr128,r128  1   11/1
MOVMSKPSr32,r1281     11/1
MOVNTPSm128,r128     2 2 1/15-1/2
CVTPI2PSr128,r64 2    31/1
CVTPI2PSr128,m64 2 1  41/2
CVTPS2PI CVTTPS2PIr64,r128 2    31/1
CVTPS2PIr64,m128 1 2  41/1
CVTSI2SSr128,r32 2 1  41/2
CVTSI2SSr128,m32 2 2  51/2
CVTSS2SI CVTTSS2SIr32,r128 1 1  31/1
CVTSS2SIr32,m128 1 2  41/2
ADDPS SUBPSr128,r128 2    31/2
ADDPS SUBPSr128,m128 2 2  31/2
ADDSS SUBSSr128,r128 1    31/1
ADDSS SUBSSr128,m32 1 1  31/1
MULPSr128,r1282     41/2
MULPSr128,m1282  2  41/2
MULSSr128,r1281     41/1
MULSSr128,m321  1  41/1
DIVPSr128,r1282     481/34
DIVPSr128,m1282  2  481/34
DIVSSr128,r1281     181/17
DIVSSr128,m321  1  181/17
ANDPS ANDNPS ORPS XORPSr128,r128 2    21/2
ANDPS ANDNPS ORPS XORPSr128,m128 2 2  21/2
MAXPS MINPSr128,r128 2    31/2
MAXPS MINPSr128,m128 2 2  31/2
MAXSS MINSSr128,r128 1    31/1
MAXSS MINSSr128,m32 1 1  31/1
CMPccPSr128,r128 2    31/2
CMPccPSr128,m128 2 2  31/2
CMPccSSr128,r128 1 1  31/1
CMPccSSr128,m32 1 1  31/1
COMISS UCOMISSr128,r128 1    11/1
COMISS UCOMISSr128,m32 1 1  11/1
SQRTPSr128,r1282     561/56
SQRTPSr128,m1282  2  571/56
SQRTSSr128,r1282     301/28
SQRTSSr128,m322  1  311/28
RSQRTPSr128,r1282     21/2
RSQRTPSr128,m1282  2  31/2
RSQRTSSr128,r1281     11/1
RSQRTSSr128,m321  1  21/1
RCPPSr128,r1282     21/2
RCPPSr128,m1282  2  31/2
RCPSSr128,r1281     11/1
RCPSSr128,m321  1  21/1
SHUFPSr128,r128,i 21   21/2
SHUFPSr128,m128,i 2 2  21/2
UNPCKHPS UNPCKLPSr128,r128 22   31/2
UNPCKHPS UNPCKLPSr128,m128 2 2  31/2
LDMXCSRm3211   151/15
STMXCSRm326   71/9
FXSAVEm4096116   62 
FXRSTORm409689   68 
+

+

30. Testing speed

+The Pentium family of processors have an internal 64 bit clock counter which can be read +into EDX:EAX using the instruction RDTSC +(read time stamp counter). This is very useful for +testing exactly how many clock cycles a piece of code takes. +

+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: +

;************   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
+

+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 CLD +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 NOP 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 CLC after the +code to test is a non-pairable instruction which has a shadow under which +the 0FH prefix of the RDTSC can be decoded so that +it is independent of any shadowing effect from the code +to test on the PPlain. +

+On The PMMX you may want to insert XOR EAX,EAX / CPUID +before the instructions to test if you want the FIFO instruction buffer +to be empty, or some time-consuming instruction +(f.ex. CLI or AAD) if you want the FIFO buffer to +be full (CPUID has no shadow under which +prefixes of subsequent instructions can decode). +

+On the PPro, PII and PIII you have to insert XOR EAX,EAX / CPUID +before and after each RDTSC to prevent it from executing +in parallel with anything else, and remove the filler +instructions. (CPUID 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.) +

+The RDTSC 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"). +

+The complete test program is available from www.agner.org/assem/. +

+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. +

+

31. Comparison of the different microprocessors

+The following table summarizes some important differences between the microprocessors in +the Pentium family: +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  PPlain  PMMX  PPro  PII  PIII 
code cache, kb81681616
data cache, kb81681616
built in level 2 cache, kb00256512 *)512 *)
MMX instructionsnoyesnoyesyes
XMM instructionsnonononoyes
conditional move instructruct.nonoyesyesyes
out of order executionnonoyesyesyes
branch predictionpoorgoodgoodgoodgood
branch target buffer entries256256512512512
return stack buffer size04161616
branch misprediction penalty3-44-510-2010-2010-20
partial register stall00555
FMUL latency33555
FMUL throughput1/21/21/21/21/2
IMUL latency99444
IMUL throughput1/91/91/11/11/1
+

*) Celeron: 0-128, Xeon: 512 or more, many other variants available. +On some versions the level 2 cache runs at half speed. +

+Comments to the table:
+Code cache size is important if the critical part of your program is not limited to a small +memory space. +

+Data cache size is important for all programs that handle more than small amounts of data +in the critical part. +

+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. +

+Conditional move instructructions are useful for avoiding poorly predictable conditional +jumps. +

+Out of order execution improves performance, especially on non-optimized code. It includes +automatic instruction reordering and register renaming. +

+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. +

+A return stack buffer improves prediction of return instructions when a subroutine is called +alternatingly from different locations. +

+Partial register stalls make handling of mixed data sizes (8, 16, 32 bit) more difficult. +

+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. +

+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. +

+Scheduling floating point code for the PPlain and PMMX often requires a lot of +extra FXCH instructions. This will slow down execution on older microprocessors, but not on the +Pentium family and advanced non-Intel processors. +

+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 27.10). +

+ + + 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 df80 +D E /Fd 2 2 df0 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>I87 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 df0 +D<60F0F06004047C8B0C>I<000400000006000000060000000600000006000000060000000600 +00000600000006000000060000000600000006000000060000FFFFFFE0FFFFFFE0000600000006 +0000000600000006000000060000000600000006000000060000000600000006000000060000FF +FFFFE0FFFFFFE01B1C7E9A20>6 D<03C00FF01FF83FFC7FFE7FFEFFFFFFFFFFFFFFFF7FFE7FFE +3FFC1FF80FF003C010107E9115>15 D<000001800000078000001E00000078000001E000000780 +00001E00000078000001E00000078000001E00000078000000E0000000780000001E0000000780 +000001E0000000780000001E0000000780000001E0000000780000001E00000007800000018000 +0000000000000000000000000000000000000000000000000000007FFFFF00FFFFFF8019227D99 +20>20 DI<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 +DI106 D E /Fg 26 116 df<000101808053>48 +D65 D<00000000F80000000000000001040000000000000002020000000000000002 +020000000000000002020000000000000002020000000000000002020000000000000001040000 +000000000000F80000000000000000500000000000000000880000000000000001040000000000 +000006030000000000000008008000000000000030006000000000000040001000000000000180 +000C00000000000200000200000000000400000100000000000800000080000000001000200040 +000000002000200020000000004000200010000000004000200010000000008000200008000000 +008000200008000000008007FF0008000000010000200004000000010000200004000000010000 +200004000000010000200004000000010000200004000000010000000004000000010000000004 +000000008000000008000000008000000008000000004000000010000000004000000010000000 +002000000020000000001007FF00400000000008F800F880000000000700000700000000000400 +000100000000000400000100000000000400000100000000000400000100000000000800000080 +000000000807FF008000000000087800F080000000000980000C80000000001600000340000000 +0018000000C0000000000600000300000000000180000C0000000000007800F000000000000007 +FF000000000000000104000000000000000202000000000000000C0180000000000180F000780C +0000007E7F000007F3F000038000000000000E000C000000200000018010000000D80000004060 +0000030600000030800003FC01FE0000084007FC000001FF001020380000000000E02010C00000 +0000001840090000000000000480060000000000000300454779CA53>I74 +D<00000000040000000000000000000C0000000000000000000C0000000000000000000C000000 +0000000000000C000000000000000003FFE00000000000000003FFE000000000000000000C0000 +000000000000000C0000000000000000000C0000000000000000000C0000000000000000000C00 +00000000000000000C0000000000000000000C0000000000000000003E00000000000000000045 +000000000000000000808000000000000000010040000000000000000100400000000000000002 +002000000000000000020020000000000000000200200000000000FF00020020007F80000300E0 +020020038060000800180200200C00080010000602002030000400200001020020400002004000 +00C100418000010040000021004200000100400000110044000001008000000900480000008080 +0000048090000000808000000280A0000000808000000180C00000008080000001414000000080 +80000000C180000000804000000041000000010040000000630000000100200000002200000002 +002000000022000000020010000000220000000400080000001400000008000800000014000000 +080004000000140000001000020000001C0000002000010000001C000000400001000000080000 +00400000800000080000008000004000000800000100000040001FFFFC0001000000200FE00003 +F80200000021F000000007C20000001E00000000003C0000001000000000000400000010000000 +000004000000100000000000040000001000000000000400000008000FFFF800080000000803F0 +0007E008000000083C0000001E0800000009C000000001C80000000E0000000000380000000800 +0000000008000000080007FFF000080000000801F8000FC008000000081E0000003C0800000010 +E00000000384000000170000000000740000001800000000000C0000000C000000000018000000 +0300000000006000000000F00000000780000000000F800000F80000000000007FFFFF00000000 +494A7BD053>III<0000000080000000000000018001800000000000 +000160024000000000000001100440000000000000008C08200000000000000083102000000000 +0000008090200000000000000080601000000000000000818010000000000000008E000FFC0000 +00000000B0000003800000000000C0000000600000000000800000001800000000010000000006 +000000000200000000010000000004000000000080000000080000000000400000001000000000 +002000000020000000000010000000403800000000080000004070000000000800000040F00000 +00000400000040E0000000000400000041C0000000000200000043800000000002000000420000 +000000010000004000000100000100000080000000800000800000800000010000008000008000 +000100000040000100000001000000400001000000010000004000020000000200000020000400 +000002000000200004000000040000002000080000001800000010001000000038000000100010 +000000C80000001000200000010800000010002000000608000000080040000038080000000800 +400000C0080000000800460001000800000008008F0006000800000004009F0008001000000004 +009E0010001000000004009C002000100000000400900020001000000004004000400020000000 +02004010400020000000020020108000400000000200102100008000000002000C410000800000 +000200038200010000000002000044000200000000010000380004000000000100000000080000 +000001000000001000000000010000000020000000000100000000400000000001000000008000 +000000010000000100000000000100000002000000000001000000020000000000010000000400 +000000000100000004000000000000800000080000000000008000000800000000000080000008 +00000000000080000008000000000000800000080000000000008000000FFFFFFFFFFFFF804948 +7BCD53>II<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>II90 +D97 D<00000001F00000000000000003F80000000000000007FC0000000000000007 +FC0000000000000007FC0000000000000007FC0000000000000007FC0000000000000003F80000 +000000000001F00000000000000000400000000000000001F00000000000000003F80000000000 +000007FC000000000000001FFF000000000000003FFF80000000000000FFFFE0000000000001FF +FFF0000000000007FFFFFC00000000000FFFFFFE00000000001FFFFFFF00000000003FFFFFFF80 +000000007FFF9FFFC000000000FFFF9FFFE000000000FFFF9FFFE000000001FFFF9FFFF0000000 +01FFF001FFF000000001FFF001FFF000000003FFFF9FFFF800000003FFFF9FFFF800000003FFFF +9FFFF800000003FFFF9FFFF800000003FFFFFFFFF800000003FFFFFFFFF800000003FFFFFFFFF8 +00000001FFFFFFFFF000000001FFFFFFFFF000000000FFFFFFFFE000000000FFFFFFFFE0000000 +007FF803FFC0000000003F80003F80000000001E03F80F00000000000E3FFF8E000000000007FF +FFFC000000000007FFFFFC00000000000FFFFFFE00000000000FFFFFFE00000000000FFFFFFE00 +000000000FF001FE00000000001F80003F00000000001E07FC0F0000000000183FFF8300000000 +0018FFFFE300000000000BFFFFFA000000000003FFFFF8000000000000FFFFE00000000000000F +FE0000000000000001F00000000000000003F8000000000000000FFE000000000000003FFF8000 +0000003FFFFFFFFFFF800003FFFFFFFFFFFFF8000FFFFFFFFFFFFFFE001FFFFFFF1FFFFFFF007F +FFFFFC07FFFFFFC0FFFFFFE000FFFFFFE0FFFC0000000007FFE07FC000000000007FC03F000000 +0000001F801C0000000000000700080000000000000200434778CA53>I106 +D<00000000040000000000000000000C0000000000000000000C0000000000000000000C000000 +0000000000000C000000000000000003FFE00000000000000003FFE000000000000000000C0000 +000000000000000C0000000000000000000C0000000000000000000C0000000000000000000C00 +00000000000000000C0000000000000000000C0000000000000000003E00000000000000000045 +000000000000000000808000000000000000013E4000000000000000017F400000000000000002 +7F200000000000000002FFA00000000000000002FFA00000000000FF0002FFA0007F80000300E0 +02FFA00380600008FE1802FFA00C3F880013FF8602FFA030FFE40027FFE102FFA043FFF2004FFF +F8C17F418FFFF9004FFFFC217F421FFFF9005FFFFF117F447FFFFD009FFFFF897F48FFFFFC809F +FFFFC4BE91FFFFFC809FFFFFE2BEA3FFFFFC809FFFFFF1BEC7FFFFFC809FFFFFF95D4FFFFFFC80 +9FFFFFFCDD9FFFFFFC804FFFFFFC5D1FFFFFF9004FFFFFFE6B3FFFFFF90027FFFFFF2A7FFFFFF2 +0027FFFFFF227FFFFFF20013FFFFFFA2FFFFFFE40009FFFFFF94FFFFFFC80009FFFFFF94FFFFFF +C80004FFFFFFD5FFFFFF9000027FFFFFDDFFFFFF2000013FFFFFDDFFFFFE4000013FFFFFC9FFFF +FE4000009FFFFFC9FFFFFC8000004FFF0000007FF90000004FE000000003F9000000260007FFF0 +00320000002001FFFFFFC002000000181FFFFFFFFC0C00000009FFFFFFFFFFC80000000FFFFFFF +FFFFF80000000FFFFFFFFFFFF80000000FFFFFFFFFFFF80000000FFFF00007FFF80000000FFC00 +00001FF80000000FC007FFF001F80000000E01FFFFFFC0380000000C1FFFFFFFFC180000000CFF +FFFFFFFF980000000FFFF00007FFF80000000FFE0000003FF80000000FE007FFF003F80000000F +00FFFFFF80780000000C0FFFFFFFF818000000087FFFFFFFFF0800000001FFFFFFFFFFC0000000 +00FFFFFFFFFF80000000000FFFFFFFF80000000000007FFFFF0000000049497BD053>III<0000000080000000000000C00180000000000000F003C0000000000000F8 +07C0000000000000FE0FC0000000000000FF9FE0000000000000FFFFE0000000000000FFFFF000 +0000000000FFFFF0000000000000FFFFFFFE00000000007FFFF003C000000000FFFFF000300000 +0000FFFFFFF80800000001FFFFFFFF8600000003FFFFFFFFE100000007FFFFFFFFF08000000FFF +FFFFFFFC4000001FFFFFFFFFFE2000003FC7FFFFFFFF1000003F8FFFFFFFFF8000003F0FFFFFFF +FFC800003F1FFFFFFFFFC400003E3FFFFFFFFFE400003C7FFFFFFFFFE200003DFFFFFFFFFFF200 +003FFFFFFFFFFFF100007FFFFFFFFFFFF900007FFFFFFFFFFFF80000FFFFFFFFFFFFFC8000FFFF +FFFFFFFFFC8001FFFFFFFFFFFFFC4001FFFFFFFFFFFFFE4003FFFFFFFFFFFFFE4007FFFFFFFFFF +FFFE200FFFFFFFFFFFFFFF200FFFFFFFCFFFFFFF201FFFFFFF8FFFFFFF203FFFFFFE0FFFFFFF10 +3FFFFFFC0FFFFFFF907FFFFFF00FFFFFFF907FFFFFC00FFFFFFF9079FFFF000FFFFFFF88F0FFFC +000FFFFFFFC8E0FFF8001FFFFFFFC8E1FFF0001FFFFFFFC8E3FFE0001FFFFFFFCCEFFFC0001FFF +FFFFC47FFFC0003FFFFFFFE47FFF80003FFFFFFFE43FFF80007FFFFFFFE41FFF0000FFFFFFFFE4 +07FF0000FFFFFFFFE6007E0001FFFFFFFFE6007C0003FFFFFFFFE200380007FFFFFFFFF2000000 +0FFFFFFFFFF20000001FFFFFFFFFF20000003FFFFFFFFFF20000007FFFFFFFFFF3000000FFFFFF +FFFFF3000001FFFFFFFFFFF3000003FFFFFFFFFFF3000003FFFFFFFFFFF1000007FFFFFFFFFFF9 +000007FFFFFFFFFFF900000FFFFFFFFFFFF900000FFFFFFFFFFFF900000FFFFFFFFFFFF900000F +FFFFFFFFFFF900000FFFFFFFFFFFFF00000FFFFFFFFFFFFF48477BCC53>II<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 +>II 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>II<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>III<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 D66 D<00FC100383300E00B01C0070380030300030700010600010E00010E0 +0000E00000E00000E00000E00000E000106000107000103000203800201C00400E008003830000 +FC0014177E9619>I69 DI<007E080381980600580C0038180018300018700008700008E00008E00000E00000 +E00000E00000E003FEE000387000387000383000381800380C00380600380380D8007F0817177E +961C>I73 D76 D78 D<00FC000303000E01C01C00E038007030003070003860 +0018E0001CE0001CE0001CE0001CE0001CE0001CE0001C7000387000383000303800701C00E00E +01C003030000FC0016177E961B>I<0FC4302C601C400CC004C004C004E00070007F003FE00FF8 +01FC001C000E0006800680068006C004E008D81087E00F177E9614>83 D<7FFFF8603818403808 +403808803804803804803804003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380007FFC016177F9619>II88 D<1FC0386038301038003803F81E38 +30387038E039E039E07970FF1F1E100E7F8D12>97 DI<07F01838303870106000E000E000E000E00060 +0070083008183007C00D0E7F8D10>I<007E00000E00000E00000E00000E00000E00000E00000E +00000E0007CE001C3E00300E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E +00182E0007CFC012177F9614>I<0FC0186030307038E018FFF8E000E000E00060007008301018 +3007C00D0E7F8D10>I<03E006700E701C201C001C001C001C001C00FF801C001C001C001C001C +001C001C001C001C001C001C001C00FF800C1780960B>I<0F9E18E33060707070707070306018 +C02F80200060003FE03FF83FFC600EC006C006C006600C38380FE010157F8D12>II<183C3C18000000 +00007C1C1C1C1C1C1C1C1C1C1C1C1CFF081780960A>I<03000780078003000000000000000000 +00001F800380038003800380038003800380038003800380038003800380038003804380E300E7 +007C00091D82960B>IIIII<07C018303018600C600CE00EE00EE00EE00EE00E701C +3018183007C00F0E7F8D12>II<07C2001C2600381E00700E00600E00E00E00E00E00E00E00E00E00600E00700E00301E001C +2E0007CE00000E00000E00000E00000E00000E00007FC012147F8D13>II<1F4060C0C040C040E000FF007F +801FC001E080608060C060E0C09F000B0E7F8D0E>I<080008000800180018003800FF80380038 +003800380038003800380038403840384038401C800F000A147F930E>I +IIIIII 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>II<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 +DI<001FE02000FFF8E003F80FE007C003E00F8001E01F0000E03E0000E03E0000607E000060 +7C000060FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC0000007C0000 +607E0000603E0000603E0000C01F0000C00F80018007C0030003F80E0000FFFC00001FE0001B1C +7D9B22>IIII<000FF008007FFE3801FC07F807E001F80F8000781F0000783F000038 +3E0000387E0000187C000018FC000000FC000000FC000000FC000000FC000000FC000000FC007F +FFFC007FFF7C0001F87E0001F83E0001F83F0001F81F0001F80F8001F807E001F801FC07F8007F +FE78000FF818201C7D9B26>III< +FFFC07FFFFFC07FF0FC000E00FC001C00FC003800FC006000FC00C000FC038000FC070000FC0E0 +000FC1C0000FC3C0000FC7E0000FCFE0000FFBF0000FF3F8000FE1F8000FC0FC000FC0FE000FC0 +7E000FC03F000FC01F800FC01FC00FC00FC00FC007E00FC007F0FFFC3FFFFFFC3FFF201C7E9B25 +>75 DIII<003FE00001F07C0003C01E000F800F801F0007C01E0003C03E0003E07E00 +03F07C0001F07C0001F0FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC +0001F87C0001F07E0003F07E0003F03E0003E03F0007E01F0007C00F800F8003C01E0001F07C00 +003FE0001D1C7D9B24>II<003FE00001F07C0003C01E000F800F801F0007C01F0007C03E00 +03E07E0003F07C0001F07C0001F0FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC0001F8FC +0001F8FC0001F87C0001F07C0001F07E0003F03E0003E03E0703E01F08C7C00F906F8003D07E00 +01F87C00003FF8080000380800003C1800003FF800001FF800001FF000000FF0000007E0000003 +C01D247D9B24>II<07 +F8201FFEE03C07E07801E07000E0F000E0F00060F00060F80000FE0000FFE0007FFE003FFF003F +FF800FFFC007FFE0007FE00003F00001F00000F0C000F0C000F0C000E0E000E0F001C0FC03C0EF +FF0083FC00141C7D9B1B>I<7FFFFFE07FFFFFE0781F81E0701F80E0601F8060E01F8070C01F80 +30C01F8030C01F8030C01F8030001F8000001F8000001F8000001F8000001F8000001F8000001F +8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800007 +FFFE0007FFFE001C1C7E9B21>IIII<0FF8001C1E003E0F803E07803E +07C01C07C00007C0007FC007E7C01F07C03C07C07C07C0F807C0F807C0F807C0780BC03E13F80F +E1F815127F9117>97 DI<03FC000E0E001C1F003C1F0078 +1F00780E00F80000F80000F80000F80000F80000F800007800007801803C01801C03000E0E0003 +F80011127E9115>I<000FF0000FF00001F00001F00001F00001F00001F00001F00001F00001F0 +0001F001F9F00F07F01C03F03C01F07801F07801F0F801F0F801F0F801F0F801F0F801F0F801F0 +7801F07801F03C01F01C03F00F0FFE03F9FE171D7E9C1B>I<01FC000F07001C03803C01C07801 +C07801E0F801E0F801E0FFFFE0F80000F80000F800007800007C00603C00601E00C00F038001FC +0013127F9116>I<007F0001E38003C7C00787C00F87C00F83800F80000F80000F80000F80000F +8000FFF800FFF8000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F +80000F80000F80000F80007FF8007FF800121D809C0F>I<03F8F00E0F381E0F381C07303C0780 +3C07803C07803C07801C07001E0F000E0E001BF8001000001800001800001FFF001FFFC00FFFE0 +1FFFF07801F8F00078F00078F000787000707800F01E03C007FF00151B7F9118>II<1E003F003F003F003F001E00000000000000000000000000FF00FF00 +1F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B1E7F9D0E>I< +007800FC00FC00FC00FC007800000000000000000000000003FC03FC007C007C007C007C007C00 +7C007C007C007C007C007C007C007C007C007C007C007C007C707CF87CF878F8F070E01F800E26 +839D0F>IIIII<01FC000F07801C01C03C01E07800F07800F0F800F8F800F8F800F8F800 +F8F800F8F800F87800F07800F03C01E01E03C00F078001FC0015127F9118>II< +03F0600F0CE01E07E03C03E07C03E07803E0F803E0F803E0F803E0F803E0F803E0F803E07803E0 +7C03E03C03E01C07E00E0FE003F3E00003E00003E00003E00003E00003E00003E0001FFC001FFC +161A7E9119>II<1FD830786018E018E018 +F000FF807FE07FF01FF807FC007CC01CC01CE01CE018F830CFC00E127E9113>I<030003000300 +0300070007000F000F003FFCFFFC1F001F001F001F001F001F001F001F001F001F0C1F0C1F0C1F +0C0F08079803F00E1A7F9913>IIIIII<3FFF803C1F00303F00303E00607C0060FC0060F80001F00003F00007E0 +0007C1800F81801F81801F03803E03007E07007C0F00FFFF0011127F9115>II 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 DI<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>III<01FF81FE001E00F0001C0060001E0080000E0180000E +0100000F02000007040000070800000790000003A0000003C0000001C0000001C0000001E00000 +02E0000004E0000008F0000010700000207000006038000040380000803C0001001C0002001C00 +06001E001E001E00FF80FFC01F1C7E9B1F>II<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>II 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 DI<0000001FFF000030000001FFFFE000F000000FFFFFFC01F000 +007FFFFFFE03F00001FFFE007F87F00003FFE0000FCFF0000FFF000003FFF0001FFC000001FFF0 +003FF80000007FF0007FF00000003FF000FFC00000003FF001FFC00000001FF003FF800000000F +F007FF000000000FF00FFF0000000007F00FFE0000000007F01FFE0000000003F01FFE00000000 +03F03FFC0000000003F03FFC0000000001F03FFC0000000001F07FFC0000000001F07FF8000000 +0001F07FF80000000000007FF8000000000000FFF8000000000000FFF8000000000000FFF80000 +00000000FFF8000000000000FFF8000000000000FFF8000000000000FFF8000000000000FFF800 +0000000000FFF8000000000000FFF8000000000000FFF80000000000007FF80000000000007FF8 +0000000000007FF80000000000007FFC0000000000F03FFC0000000000F03FFC0000000000F03F +FC0000000000F01FFE0000000000F01FFE0000000001E00FFE0000000001E00FFF0000000001E0 +07FF0000000003C003FF8000000003C001FFC0000000078000FFE00000000F00007FF00000001F +00003FF80000003E00001FFC0000007C00000FFF000001F8000003FFE00007F0000001FFFE003F +C00000007FFFFFFF000000000FFFFFFC0000000001FFFFF000000000001FFF0000003C3D7BBB47 +>III<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 +D120 D E /Fo 40 122 df45 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 DI<000000003FFE00000E0000000FFFFFC0001E0000007FFFFFF8003E0000 +03FFFFFFFE00FE00000FFFFFFFFF81FE00003FFFF800FFC3FE0000FFFF80000FF7FE0001FFFC00 +0003FFFE0007FFF0000001FFFE000FFFC00000007FFE001FFF800000003FFE003FFF000000001F +FE007FFE000000000FFE00FFFC0000000007FE01FFF80000000007FE03FFF00000000003FE03FF +F00000000001FE07FFE00000000001FE07FFE00000000000FE0FFFC00000000000FE0FFFC00000 +0000007E1FFFC000000000007E1FFF8000000000007E3FFF8000000000007E3FFF800000000000 +3E3FFF8000000000003E7FFF8000000000003E7FFF0000000000003E7FFF000000000000007FFF +00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF000000 +00000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF000000000000 +00FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF00000000000000FFFF +000000000000007FFF000000000000007FFF000000000000007FFF000000000000007FFF800000 +0000003E3FFF8000000000003E3FFF8000000000003E3FFF8000000000003E1FFF800000000000 +3E1FFFC000000000003E0FFFC000000000007C0FFFC000000000007C07FFE000000000007C07FF +E00000000000F803FFF00000000000F803FFF00000000001F801FFF80000000001F000FFFC0000 +000003E0007FFE0000000007E0003FFF000000000FC0001FFF800000001F80000FFFC00000003F +000007FFF0000000FE000001FFFC000001FC000000FFFF80000FF80000003FFFF8007FF0000000 +0FFFFFFFFFC000000003FFFFFFFF00000000007FFFFFFC00000000000FFFFFE00000000000003F +FE000000474979C756>I69 DI<00 +0000003FFE00000E000000000FFFFFC0001E000000007FFFFFF8003E00000003FFFFFFFE00FE00 +00000FFFFFFFFF81FE0000003FFFF800FFC3FE000000FFFF80000FF7FE000001FFFC000003FFFE +000007FFF0000001FFFE00000FFFC00000007FFE00001FFF800000003FFE00003FFF000000001F +FE00007FFE000000000FFE0000FFFC0000000007FE0001FFF80000000007FE0003FFF000000000 +03FE0003FFF00000000001FE0007FFE00000000001FE0007FFE00000000000FE000FFFC0000000 +0000FE000FFFC000000000007E001FFFC000000000007E001FFF8000000000007E003FFF800000 +0000007E003FFF8000000000003E003FFF8000000000003E007FFF8000000000003E007FFF0000 +000000003E007FFF00000000000000007FFF0000000000000000FFFF0000000000000000FFFF00 +00000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF +0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000000000000000FF +FF0000000000000000FFFF0000000000000000FFFF0000000000000000FFFF0000007FFFFFFFFE +7FFF0000007FFFFFFFFE7FFF0000007FFFFFFFFE7FFF8000007FFFFFFFFE7FFF8000007FFFFFFF +FE3FFF8000000000FFFE003FFF8000000000FFFE003FFF8000000000FFFE001FFF8000000000FF +FE001FFFC000000000FFFE000FFFC000000000FFFE000FFFC000000000FFFE0007FFE000000000 +FFFE0007FFE000000000FFFE0003FFF000000000FFFE0003FFF800000000FFFE0001FFF8000000 +00FFFE0000FFFC00000000FFFE00007FFE00000000FFFE00003FFF00000000FFFE00001FFF8000 +0000FFFE00000FFFE0000001FFFE000007FFF0000003FFFE000001FFFC000007FFFE000000FFFF +80001FFFFE0000003FFFFC00FFC7FE0000000FFFFFFFFF83FE00000003FFFFFFFE00FE00000000 +7FFFFFF8003E000000000FFFFFE0000E00000000003FFE000000004F4979C75D>III75 D<00000003FFF0000000000000007FFFFF +80000000000003FFFFFFF000000000000FFFFFFFFC00000000003FFF807FFF0000000000FFF800 +07FFC000000003FFE00001FFF000000007FFC00000FFF80000000FFF0000003FFC0000001FFE00 +00001FFE0000003FFC0000000FFF0000007FFC0000000FFF800000FFF800000007FFC00001FFF0 +00000003FFE00003FFF000000003FFF00003FFE000000001FFF00007FFE000000001FFF80007FF +C000000000FFF8000FFFC000000000FFFC000FFFC000000000FFFC001FFF80000000007FFE001F +FF80000000007FFE003FFF80000000007FFF003FFF80000000007FFF003FFF80000000007FFF00 +7FFF00000000003FFF807FFF00000000003FFF807FFF00000000003FFF807FFF00000000003FFF +807FFF00000000003FFF80FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003F +FFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF0000000000 +3FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000 +003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC0FFFF00000000003FFFC07FFF000000 +00003FFF807FFF00000000003FFF807FFF80000000007FFF807FFF80000000007FFF803FFF8000 +0000007FFF003FFF80000000007FFF003FFF80000000007FFF001FFFC000000000FFFE001FFFC0 +00000000FFFE001FFFC000000000FFFE000FFFE000000001FFFC000FFFE000000001FFFC0007FF +E000000001FFF80003FFF000000003FFF00003FFF800000007FFF00001FFF800000007FFE00000 +FFFC0000000FFFC000007FFE0000001FFF8000007FFF0000003FFF8000003FFF8000007FFF0000 +000FFFC00000FFFC00000007FFF00003FFF800000003FFFC000FFFF000000000FFFF807FFFC000 +0000007FFFFFFFFF80000000000FFFFFFFFC000000000003FFFFFFF00000000000007FFFFF8000 +000000000003FFF0000000004A4979C759>79 DI82 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>III<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>II<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 DI<001F808000 +E0618001801980070007800E0003801C0003801C00018038000180780000807800008070000080 +F0000000F0000000F0000000F0000000F0000000F0000000F0000000F000000070000080780000 +8078000080380000801C0001001C0001000E000200070004000180080000E03000001FC000191E +7E9C1E>IIII<001F808000E0 +618001801980070007800E0003801C0003801C00018038000180780000807800008070000080F0 +000000F0000000F0000000F0000000F0000000F0000000F000FFF0F0000F807000078078000780 +78000780380007801C0007801C0007800E00078007000B800180118000E06080001F80001C1E7E +9C21>III<1FFF00F80078007800 +7800780078007800780078007800780078007800780078007800780078007800787078F878F878 +F878F0F040E021C01F00101D7F9B15>IIIII<003F800000E0E000038038000700 +1C000E000E001C0007003C00078038000380780003C0780003C0700001C0F00001E0F00001E0F0 +0001E0F00001E0F00001E0F00001E0F00001E0F00001E0700001C0780003C0780003C038000380 +3C0007801C0007000E000E0007001C000380380000E0E000003F80001B1E7E9C20>II<003F800000E0E0000380380007001C000E000E001C0007003C0007803800 +0380780003C0780003C0700001C0F00001E0F00001E0F00001E0F00001E0F00001E0F00001E0F0 +0001E0F00001E0700001C0780003C0780003C0380003803C0E07801C1107000E208E0007205C00 +03A0780000F0E020003FE0200000602000003060000038E000003FC000003FC000001F8000000F +001B257E9C20>II<07E0801C1980300580700380600180E00180E00080E00080E0 +0080F00000F800007C00007FC0003FF8001FFE0007FF0000FF80000F800007C00003C00001C080 +01C08001C08001C0C00180C00180E00300D00200CC0C0083F800121E7E9C17>I<7FFFFFC0700F +01C0600F00C0400F0040400F0040C00F0020800F0020800F0020800F0020000F0000000F000000 +0F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 +000F0000000F0000000F0000000F0000000F0000001F800003FFFC001B1C7F9B1E>IIII<7FF0FFC00FC03E000780180003C0180003E0100001E0200001F0600000F04000007880 +00007D8000003D0000001E0000001F0000000F0000000F8000000F80000013C0000023E0000021 +E0000041F00000C0F8000080780001007C0003003C0002001E0006001F001F003F80FFC0FFF01C +1C7F9B1F>II<7FFFF07C01F07001E06003C06003C0400780400F80400F00401E00001E0000 +3C00007C0000780000F00000F00001E00003E00003C0100780100780100F00101F00301E00203C +00203C00607800E0F803E0FFFFE0141C7E9B19>II93 +D<0810204040808080B0F87830050C7D9C0C>96 D<1FC000307000783800781C00301C00001C00 +001C0001FC000F1C00381C00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E +9115>II<07E00C301878307870306000E000E000E000E0 +00E000E00060007004300418080C3007C00E127E9112>I<003F00000700000700000700000700 +00070000070000070000070000070000070003E7000C1700180F00300700700700600700E00700 +E00700E00700E00700E00700E00700600700700700300700180F000C370007C7E0131D7E9C17> +I<03E00C301818300C700E6006E006FFFEE000E000E000E00060007002300218040C1803E00F12 +7F9112>I<00F8018C071E061E0E0C0E000E000E000E000E000E00FFE00E000E000E000E000E00 +0E000E000E000E000E000E000E000E000E000E000E007FE00F1D809C0D>I<00038003C4C00C38 +C01C3880181800381C00381C00381C00381C001818001C38000C300013C0001000003000001800 +001FF8001FFF001FFF803003806001C0C000C0C000C0C000C06001803003001C0E0007F800121C +7F9215>II<18003C003C00180000000000000000000000 +00000000FC001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C001C00FF +80091D7F9C0C>I<00C001E001E000C000000000000000000000000000000FE000E000E000E000 +E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0C0F1C0 +61803E000B25839C0D>IIIII<03F0000E1C00180600300300700380600180E001C0E001 +C0E001C0E001C0E001C0E001C06001807003803003001806000E1C0003F00012127F9115>II<03C1000C3300180B00300F00700700700700E00700E00700E00700E00700E00700 +E00700600700700700300F00180F000C370007C700000700000700000700000700000700000700 +000700003FE0131A7E9116>II<1F9030704030C010C010E010F8007F803FE00FF000F8 +80388018C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00FFE0 +1C001C001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F9910 +>IIII<7F8FF00F03800F030007020003840001C80001D80000F00000700000780000 +F800009C00010E00020E000607000403801E07C0FF0FF81512809116>II<7FFC +70386038407040F040E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112 +>II 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 D45 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 +DI<00003FF001800003FFFE0380000FFFFF878000 +3FF007DF8000FF8001FF8001FE00007F8003FC00003F8007F000001F800FF000000F801FE00000 +07801FE0000007803FC0000007803FC0000003807FC0000003807F80000003807F8000000000FF +8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000 +0000FF8000000000FF80000000007F80000000007F80000000007FC0000003803FC0000003803F +C0000003801FE0000003801FE0000007000FF00000070007F000000E0003FC00001E0001FE0000 +3C0000FF8000F800003FF007E000000FFFFFC0000003FFFF000000003FF8000029297CA832>I< +FFFFFFF80000FFFFFFFF8000FFFFFFFFE00003FC001FF80003FC0007FC0003FC0001FE0003FC00 +00FF0003FC00007F8003FC00003FC003FC00001FC003FC00001FE003FC00001FE003FC00000FF0 +03FC00000FF003FC00000FF003FC00000FF003FC00000FF803FC00000FF803FC00000FF803FC00 +000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF803FC00000FF8 +03FC00000FF003FC00000FF003FC00000FF003FC00001FE003FC00001FE003FC00001FC003FC00 +003FC003FC00007F8003FC00007F0003FC0001FE0003FC0003FC0003FC001FF800FFFFFFFFE000 +FFFFFFFF8000FFFFFFFC00002D297DA835>III<00007FE003000003FFFC0700001FFFFF0F00003FF00FFF0000 +FF8001FF0001FE0000FF0003F800003F0007F000003F000FF000001F001FE000000F001FE00000 +0F003FC000000F003FC0000007007FC0000007007F80000007007F8000000000FF8000000000FF +8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF8000000000FF800000 +0000FF8001FFFFF87F8001FFFFF87F8001FFFFF87FC00000FF003FC00000FF003FC00000FF001F +E00000FF001FE00000FF000FF00000FF0007F00000FF0003F80000FF0001FE0000FF0000FF8001 +FF00003FF007BF00001FFFFF1F000003FFFE0F0000007FF003002D297CA836>III75 DIII<0000FFE000000007FFFC0000 +003FC07F8000007F001FC00001FC0007F00003F80003F80007F00001FC000FF00001FE001FE000 +00FF001FE00000FF003FC000007F803FC000007F807FC000007FC07F8000003FC07F8000003FC0 +7F8000003FC0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000 +003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003FC07FC000007FC0 +7FC000007FC03FC000007F803FC000007F801FE00000FF001FE00000FF000FF00001FE0007F000 +01FC0003F80003F80001FC0007F00000FF001FE000003FC07F8000000FFFFE00000000FFE00000 +2B297CA834>II<0000FFE000000007FFFC0000003FC0 +7F8000007F001FC00001FC0007F00003F80003F80007F00001FC000FF00001FE001FE00000FF00 +1FE00000FF003FC000007F803FC000007F807FC000007FC07FC000007FC07F8000003FC07F8000 +003FC0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE0 +FF8000003FE0FF8000003FE0FF8000003FE0FF8000003FE07F8000003FC07F8000003FC07FC000 +007FC03FC000007F803FC000007F801FE00000FF001FE01F00FF000FF03F81FE0007F060C1FC00 +03F8C063F80001FCC077F00000FFC07FE000003FE07F8000000FFFFE00000000FFFE0060000000 +3E00600000003F00600000001F81E00000001FFFE00000001FFFC00000000FFFC00000000FFFC0 +00000007FF8000000007FF8000000003FF0000000001FE000000000078002B357CA834>II<007F806003FFF0E007FFF9E00F807FE01F001FE03E00 +07E07C0003E07C0001E0FC0001E0FC0001E0FC0000E0FE0000E0FE0000E0FF000000FFC000007F +FE00007FFFE0003FFFFC001FFFFE000FFFFF8007FFFFC003FFFFE000FFFFE00007FFF000007FF0 +00000FF8000007F8000003F8600001F8E00001F8E00001F8E00001F8F00001F0F00001F0F80003 +F0FC0003E0FF0007C0FFE01F80F3FFFF00E0FFFE00C01FF0001D297CA826>I<7FFFFFFFFFC07F +FFFFFFFFC07FFFFFFFFFC07F803FC03FC07E003FC007C078003FC003C078003FC003C070003FC0 +01C0F0003FC001E0F0003FC001E0E0003FC000E0E0003FC000E0E0003FC000E0E0003FC000E0E0 +003FC000E000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 +000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000 +003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0000000003FC0 +000000003FC0000000003FC0000000003FC00000007FFFFFE000007FFFFFE000007FFFFFE0002B +287EA730>IIII<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>II<07000F801FC03FE0 +3FE03FE01FC00F8007000000000000000000000000000000FFE0FFE0FFE00FE00FE00FE00FE00F +E00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE00FE0FFFEFFFEFFFE +0F2B7DAA14>I<000700000F80001FC0003FE0003FE0003FE0001FC0000F800007000000000000 +0000000000000000000000000000000001FFE001FFE001FFE0000FE0000FE0000FE0000FE0000F +E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000F +E0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE0000FE07C0FE0FE0FE0FE0F +C0FE1F80FE1F007C3E003FFC000FF000133784AA15>IIIII<003FE00001FFFC0003F07E000FC01F801F800FC03F800FE03F0007E07F0007F07F0007F0 +7F0007F0FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F8FF0007F87F0007 +F07F0007F03F800FE03F800FE01F800FC00FC01F8007F07F0001FFFC00003FE0001D1B7E9A22> +II114 D<03FE300FFFF01E03F03800F0700070F00070F0 +0070F80070FC0000FFE0007FFE007FFF803FFFE01FFFF007FFF800FFF80003FC0000FC60007CE0 +003CF0003CF00038F80038FC0070FF01E0F7FFC0C1FF00161B7E9A1B>I<007000007000007000 +00700000F00000F00000F00001F00003F00003F00007F0001FFFF0FFFFF0FFFFF007F00007F000 +07F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F00007F03807F038 +07F03807F03807F03807F03803F03803F87001F86000FFC0001F8015267FA51B>IIIIII<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 DI<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 +61 D<0001800000018000000180000003C0000003C0000003C0000005E0000005E000000DF000 +0008F0000008F0000010F800001078000010780000203C0000203C0000203C0000401E0000401E +0000401E0000800F0000800F0000FFFF000100078001000780030007C0020003C0020003C00400 +03E0040001E0040001E00C0000F00C0000F03E0001F8FF800FFF20237EA225>65 +DI<0007E0100038183000E00630 +01C00170038000F0070000F00E0000701E0000701C0000303C0000303C0000307C000010780000 +1078000010F8000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800 +0000780000107C0000103C0000103C0000101C0000201E0000200E000040070000400380008001 +C0010000E0020000381C000007E0001C247DA223>IIII<0007F008003C0C1800E0021801C001B803 +8000F8070000780F0000381E0000381E0000183C0000183C0000187C0000087800000878000008 +F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8001FFF780000F8780000 +787C0000783C0000783C0000781E0000781E0000780F00007807000078038000B801C000B800E0 +0318003C0C080007F00020247DA226>II +I75 DIII<000FE00000783C0000E00E0003C00780078003C00F +0001E00E0000E01E0000F03C0000783C0000787C00007C7C00007C7800003C7800003CF800003E +F800003EF800003EF800003EF800003EF800003EF800003EF800003EF800003E7800003C7C0000 +7C7C00007C3C0000783E0000F81E0000F00F0001E00F0001E0078003C003C0078000E00E000078 +3C00000FE0001F247DA226>II< +000FE00000783C0000E00E0003C00780078003C00F0001E00E0000E01E0000F03E0000F83C0000 +787C00007C7C00007C7800003C7800003CF800003EF800003EF800003EF800003EF800003EF800 +003EF800003EF800003EF800003E7800003C7C00007C7C00007C3C0000783C0000781E0380F00E +0420E00F0801E0078813C003C8178000E80E00007C3C02000FEC0200000C0200000C0200000E06 +00000F0E000007FC000007FC000007F8000003F8000001E01F2D7DA226>II<03F0200C0C601802603001E07000E0600060E00060 +E00060E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003FC0 +0007E00001E00000F00000F0000070800070800070800070800070C00060C00060E000C0F000C0 +C80180C6070081FC0014247DA21B>I<7FFFFFF878078078600780184007800840078008400780 +08C007800C80078004800780048007800480078004000780000007800000078000000780000007 +800000078000000780000007800000078000000780000007800000078000000780000007800000 +078000000780000007800000078000000780000007800000078000000FC00003FFFF001E227EA1 +23>IIII<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>II< +FF8FF8FF1E01E03C1C01C0180E01C0180E01E0100E01E010070260200702702007027020038430 +40038438400384384001C8188001C81C8001C81C8000F00D0000F00F0000F00F00006006000060 +06000060060020157F9423>III<3FFFC0380380300780200700 +600E00401C00403C0040380000700000E00001E00001C0000380400700400F00400E00C01C0080 +380080780180700780FFFF8012157F9416>II E /Fu +64 124 df<000FF83F00007FFDFFC001F81FE3E003E03F87E007C03F87E00F803F07E00F803F03 +C00F801F00000F801F00000F801F00000F801F00000F801F00000F801F0000FFFFFFFC00FFFFFF +FC000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F80 +1F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F801F00000F +801F00000F801F00000F801F00007FF0FFF0007FF0FFF00023237FA221>11 +D<000FF000007FFC0001F80E0003E01F0007C03F000F803F000F803F000F801E000F800C000F80 +00000F8000000F8000000F800000FFFFFF00FFFFFF000F801F000F801F000F801F000F801F000F +801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F000F801F00 +0F801F000F801F000F801F000F801F007FF0FFE07FF0FFE01B237FA21F>I45 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 DI<00 +03FE0080001FFF818000FF01E38001F8003F8003E0001F8007C0000F800F800007801F80000780 +3F000003803F000003807F000001807E000001807E00000180FE00000000FE00000000FE000000 +00FE00000000FE00000000FE00000000FE00000000FE000000007E000000007E000001807F0000 +01803F000001803F000003801F800003000F8000030007C000060003F0000C0001F800380000FF +00F000001FFFC0000003FE000021227DA128>IIII<0003FE0040001FFFC0C0007F00F1C001F8003FC003F0000F +C007C00007C00FC00003C01F800003C03F000001C03F000001C07F000000C07E000000C07E0000 +00C0FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00000000FE00 +0FFFFC7E000FFFFC7F00001FC07F00001FC03F00001FC03F00001FC01F80001FC00FC0001FC007 +E0001FC003F0001FC001FC003FC0007F80E7C0001FFFC3C00003FF00C026227DA12C>III75 +DIII<0007FC0000003FFF800000FC07E0 +0003F001F80007E000FC000FC0007E001F80003F001F80003F003F00001F803F00001F807F0000 +1FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00 +000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F00001FC07F00001FC03F00001F803F +80003F801F80003F000FC0007E0007E000FC0003F001F80000FC07E000003FFF80000007FC0000 +23227DA12A>II<0007FC000000 +3FFF800000FC07E00003F001F80007E000FC000FC0007E001F80003F001F80003F003F00001F80 +3F00001F807F00001FC07E00000FC07E00000FC0FE00000FE0FE00000FE0FE00000FE0FE00000F +E0FE00000FE0FE00000FE0FE00000FE0FE00000FE0FE00000FE07E00000FC07F00001FC07F0000 +1FC03F00001F803F81F03F801F83F83F000FC70C7E0007E606FC0003F607F80000FF07E000003F +FF80000007FF80200000038020000003C020000003E0E0000003FFE0000001FFC0000001FFC000 +0000FFC0000000FF800000007F000000001E00232C7DA12A>II<01FC0407FF8C1F03FC3C007C7C003C78001C78001CF8000CF8000CFC000CFC +0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE0003FF00007F00003F00 +003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE080FF8018227DA11F>I< +7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003F80180E003F801C0E003F801 +C0C003F800C0C003F800C0C003F800C0C003F800C00003F800000003F800000003F800000003F8 +00000003F800000003F800000003F800000003F800000003F800000003F800000003F800000003 +F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 +03F8000003FFFFF80003FFFFF80022227EA127>IIII<07FC001F +FF803F07C03F03E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC +01F0FC01F0FC01F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97 +DI<00FF8007FFE00F83 +F01F03F03E03F07E03F07C01E07C0000FC0000FC0000FC0000FC0000FC0000FC00007C00007E00 +007E00003E00301F00600FC0E007FF8000FE0014167E9519>I<0001FE000001FE0000003E0000 +003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E0000003E00 +01FC3E0007FFBE000F81FE001F007E003E003E007E003E007C003E00FC003E00FC003E00FC003E +00FC003E00FC003E00FC003E00FC003E00FC003E007C003E007C003E003E007E001E00FE000F83 +BE0007FF3FC001FC3FC01A237EA21F>I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC +00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00007C00007C00007E00003E00181F00300FC07003 +FFC000FF0015167E951A>I<003F8000FFC001E3E003C7E007C7E00F87E00F83C00F80000F8000 +0F80000F80000F80000F8000FFFC00FFFC000F80000F80000F80000F80000F80000F80000F8000 +0F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80007FF8007FF800 +13237FA211>I<03FC1E0FFF7F1F0F8F3E07CF3C03C07C03E07C03E07C03E07C03E07C03E03C03 +C03E07C01F0F801FFF0013FC003000003000003800003FFF801FFFF00FFFF81FFFFC3800FC7000 +3EF0001EF0001EF0001EF0001E78003C7C007C3F01F80FFFE001FF0018217E951C>II<1C003E007F007F007F003E001C +000000000000000000000000000000FF00FF001F001F001F001F001F001F001F001F001F001F00 +1F001F001F001F001F001F001F001F00FFE0FFE00B247EA310>I<0038007C00FE00FE00FE007C +0038000000000000000000000000000003FE03FE003E003E003E003E003E003E003E003E003E00 +3E003E003E003E003E003E003E003E003E003E003E003E003E003E783EFC3EFC3CFC7C78F87FE0 +1F800F2E83A311>II< +FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA210>III<00 +FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007EFC007EFC +007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>II<00FE030007FF87000FC1C7001F006F003F003F007E003F007E001F +007C001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F00FC001F007E001F007E00 +1F003E003F001F007F000FC1DF0007FF9F0001FC1F0000001F0000001F0000001F0000001F0000 +001F0000001F0000001F0000001F000000FFE00000FFE01B207E951E>II<0FF3003FFF00781F00600700E003 +00E00300F00300FC00007FE0007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E003 +80F00700FC0E00EFFC00C7F00011167E9516>I<01800001800001800001800003800003800007 +80000780000F80003F8000FFFF00FFFF000F80000F80000F80000F80000F80000F80000F80000F +80000F80000F80000F80000F81800F81800F81800F81800F81800F830007C30003FE0000F80011 +207F9F16>II +I +III<7FFFF0 +7FFFF07C03E07007C0600FC0E01F80C01F00C03E00C07E0000FC0000F80001F00003F03007E030 +07C0300F80701F80703F00603E00E07C03E0FFFFE0FFFFE014167E9519>II E /Fv 23 119 df<00000003FF00000C0000003FFFF0001C000001FFFFFC001C +000007FF007F003C00001FF0000F807C00007FC00003C0FC0000FF000000F0FC0003FC00000079 +FC0007F80000003FFC000FF00000001FFC001FE00000000FFC003FC000000007FC007F80000000 +03FC00FF8000000003FC01FF0000000001FC01FE0000000001FC03FE0000000000FC07FC000000 +0000FC07FC00000000007C0FFC00000000007C0FF800000000007C1FF800000000003C1FF80000 +0000003C3FF000000000003C3FF000000000003C3FF000000000001C7FF000000000001C7FF000 +000000001C7FE000000000001C7FE0000000000000FFE0000000000000FFE0000000000000FFE0 +000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FF +E0000000000000FFE0000000000000FFE0000000000000FFE0000000000000FFE0000000000000 +FFE00000000000007FE00000000000007FE00000000000007FF000000000001C7FF00000000000 +1C3FF000000000001C3FF000000000001C3FF000000000001C1FF800000000001C1FF800000000 +00380FF80000000000380FFC00000000003807FC00000000003807FC00000000007003FE000000 +00007001FE0000000000E001FF0000000000E000FF8000000001C0007F8000000001C0003FC000 +00000380001FE00000000700000FF00000000E000007F80000001C000003FC00000038000000FF +000000700000007FC00001E00000001FF00007C000000007FF007F0000000001FFFFFE00000000 +003FFFF0000000000003FF8000003E497AC74B>67 D69 D73 +D80 +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>II 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 DI<0000FF00100007FFE030001FC07830003E000C7000F80006F001F00003F003E00001F007C0 +0000F00F800000700F800000701F000000303F000000303E000000303E000000107E000000107E +000000107C00000000FC00000000FC00000000FC00000000FC00000000FC00000000FC00000000 +FC00000000FC00000000FC000000007C000000007E000000007E000000103E000000103E000000 +103F000000101F000000200F800000200F8000006007C000004003E000008001F000018000F800 +0300003E000E00001FC038000007FFE0000000FF8000242B7DA92B>I69 DI72 DI<03FFFF03FFFF0007E00003E00003E00003E00003E000 +03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E000 +03E00003E00003E00003E00003E00003E00003E00003E00003E00003E00003E03003E07803E0FC +03E0FC03E0FC03C0F807C0400780200F00300E000C3C0003F000182A7DA81F>I76 DII<0001FF0000000F01E000003C0078000078003C0000E0000E0001E0000F00 +03C000078007800003C00F800003E01F000001F01F000001F03E000000F83E000000F87E000000 +FC7E000000FC7C0000007C7C0000007CFC0000007EFC0000007EFC0000007EFC0000007EFC0000 +007EFC0000007EFC0000007EFC0000007EFC0000007E7C0000007C7E000000FC7E000000FC7E00 +0000FC3E000000F83F000001F81F000001F01F000001F00F800003E007800003C007C00007C003 +E0000F8000F0001E000078003C00003C007800000F01E0000001FF0000272B7DA92E>II82 +D<00FE010003FF83000F81E3001E0037003C001F0038000F007800070070000700F0000300F000 +0300F0000300F0000100F8000100F8000100FC0000007C0000007F0000003FE000001FFF00000F +FFE00007FFF80003FFFC00007FFE000007FF0000007F0000001F8000000F80000007C0000007C0 +800003C0800003C0800003C0800003C0C00003C0C0000380C0000380E0000780F0000700F8000E +00EE001C00C3C07800C1FFF000803FC0001A2B7DA921>I<7FFFFFFFF87FFFFFFFF87C007C00F8 +70007C003860007C001840007C000840007C0008C0007C000CC0007C000C80007C000480007C00 +0480007C000480007C000480007C000400007C000000007C000000007C000000007C000000007C +000000007C000000007C000000007C000000007C000000007C000000007C000000007C00000000 +7C000000007C000000007C000000007C000000007C000000007C000000007C000000007C000000 +007C000000007C000000007C000000007C00000000FE000000FFFFFE0000FFFFFE0026297EA82B +>II<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>I121 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 DIII< +FFFF807FFFC0FFFF807FFFC007F00003F80003E00001F00003E00001F00003E00001F00003E000 +01F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F000 +03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000 +01F00003E00001F00003E00001F00003E00001F00003FFFFFFF00003FFFFFFF00003E00001F000 +03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000 +01F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F000 +03E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E00001F00003E000 +01F00007F00003F800FFFF807FFFC0FFFF807FFFC02A317CB032>72 DI76 D78 +D<00003FC000000001C03800000007000E0000001C0003800000380001C00000F00000F00001E0 +0000780003C000003C00038000001C00078000001E000F0000000F000F0000000F001E00000007 +801E00000007803C00000003C03C00000003C07C00000003E07C00000003E07800000001E07800 +000001E0F800000001F0F800000001F0F800000001F0F800000001F0F800000001F0F800000001 +F0F800000001F0F800000001F0F800000001F0F800000001F0F800000001F07C00000003E07C00 +000003E07C00000003E07C00000003E03C00000003C03E00000007C01E00000007801E00000007 +800F0000000F000F0000000F00078000001E0003C000003C0003C000003C0001E00000780000F0 +0000F00000380001C000001C000380000007000E00000001E078000000003FC000002C337CB134 +>II<7FFFFFFFFFE07FFFFFFFFFE07E000F8007E078 +000F8001E070000F8000E060000F80006040000F80002040000F800020C0000F800030C0000F80 +003080000F80001080000F80001080000F80001080000F80001080000F80001080000F80001000 +000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80 +000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000 +000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80 +000000000F80000000000F80000000000F80000000000F80000000000F80000000000F80000000 +000F80000000000F80000000000F80000000000F80000000001FC00000000FFFFF8000000FFFFF +80002C317EB030>84 D89 +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 @@ + + + +Chess Engine Communication Protocol + + + +


+

Chess Engine Communication Protocol

+

Tim Mann

+

+Last modified on Sun Sep 17 23:37:17 PDT 2000 by mann +


+ + + +
+ +

1. Introduction

+ +

+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. +

+ +

+There are two reasons I can imagine someone wanting to do this: +

+
    +
  1. You have, or are developing, a chess engine but you don't want to +write your own graphical interface. +
  2. You have, or are developing,a chess engine, and you want to +interface it to the Internet Chess Server. +
+ +

+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 zippy.README +in the xboard or WinBoard distribution for more information. + +

+ +

+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. +

+ +

+I'd like to hear from everyone who is trying to interface their own +chess engine to xboard/WinBoard. Please email me, mann@pa.dec.com. 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 http://www.egroups.com/group/chess-engines, or you can read the +list there without joining. The list is filtered to prevent spam. +

+ +

2. Connection

+ +

+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 section 6 below. +

+ +

+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 +5 and 6 below for additional details. +

+ +

3. Debugging

+ +

+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. +

+ +

+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. +

+ +

+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. +

+ +

4. How it got this way

+ +

+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. +

+ +

+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. +

+ +

5. WinBoard requires Win32 engines

+ +

+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 http://sourceware.cygnus.com/cygwin/. 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. +

+ +

6. Hints on input/output

+ +

+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 fflush.) 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. +

+ +

+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. +

+ +

+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 +setbuf(stdout, NULL). A more laborious and error-prone +method is to carefully call fflush(stdout) after every line +you output; I don't recommend this. In C++, you can try +cout.setf(ios::unitbuf), which is documented in current +editions of "The C++ Programming Language," but not older ones. +Another C++ method that might work is +cout.rdbuf()->setbuf(NULL, 0). Alternatively, you can +carefully call cout.flush() after every line you output; +again, I don't recommend this. +

+ +

+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 write(1, ...) -- see the man page for write(2). +On Win32, you can use either the Unix-like _write(1, ...) or Win32 +native routines like WriteFile. +

+ +

+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 either characters in the buffer +or characters available from the underlying file descriptor. +

+ +

+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 read(0, ...) to read from standard input, and +use select() 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 _read(0, ...) or the native +Win32 ReadFile() 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 PeekNamedPipe to poll (even when the pipe is unnamed). +For consoles, +you can use GetNumberOfConsoleInputEvents. For sockets only, you can +use select(). It might be possible to use +WaitForSingleObject 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. +

+ +

+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 +setbuf(stdin, NULL). However, I have never tried this. Also, there +could be problems if you use scanf(), at least with certain patterns, +because scanf() 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 cin.rdbuf()->setbuf(NULL, 0), but again, I have never tried +this. +

+ +

+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 +cin.rdbuf()->in_avail(). 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. +

+ +

+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. +

+ +

7. Signals

+ +

Engines that run on Unix need to be concerned with two Unix +signals: SIGTERM and SIGINT. 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.

+ +

First, when an engine is sent the "quit" command, it is also given a +SIGTERM 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 signal(SIGTERM, SIG_IGN) at the +start of your program.

+ +

Second, +xboard will send an interrupt signal (SIGINT) 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. +

+ +

+The SIGINTs 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 SIGINT when running under Unix in xboard mode. You can do this +by having your engine call signal(SIGINT, SIG_IGN). Alternatively, +you can configure your personal copy of xboard to not send SIGINT 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. +

+ +

+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 SIGINT 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 SIGINT before the first such command only. +Another SIGINT is not sent until another move is made, even if xboard +issues more commands. This behavior is necessary for GNU Chess. The +first SIGINT stops it from pondering until the next move, but on some +systems, GNU Chess will die if it receives a SIGINT when not actually +thinking or pondering. +

+ +

+There are two reasons why WinBoard does not send the Win32 equivalent +of SIGINT (which is called CTRL_C_EVENT) 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 CTRL_C_EVENT. (More Microsoft brain damage.) +

+ +

8. Commands from xboard to the engine

+ +

+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. +

+ +

+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. +

+ +

+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. +

+ +
+
xboard +
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. +

+ +

new +
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. +

+ +

variant VARNAME +
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: + + +
wildcastleShuffle chess where king can castle from d file +
nocastleShuffle chess with no castling at all +
fischerandomFischeRandom (not supported yet) +
bughouseBughouse, ICC/FICS rules +
crazyhouseCrazyhouse, ICC/FICS rules +
losersWin by losing all pieces or getting mated (ICC) +
suicideWin by losing all pieces including king (FICS) +
twokingsWeird ICC wild 9 +
kriegspielKriegspiel (not really supported) +
atomicAtomic (not really supported) +
3checkWin by giving check 3 times (not supported) +
unknownUnknown variant (not supported) +
+

+ +

quit +
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 Signals above. +

+ +

random +
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. +

+ +

force +
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. +

+ +

white +
Set White on move. Set the engine to play Black. Stop clocks. +

+ +

black +
Set Black on move. Set the engine to play White. Stop clocks. +

+ +

level MPS BASE INC +
Set time controls. See the Time Control section below. +

+ +

st TIME +
Set time controls. See the Time Control section +below. The commands "level" and "st" are not used together. +

+ +

sd DEPTH +
The engine should limit its thinking to DEPTH ply. +

+ +

time N +
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. +

+ +

otim N + +
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. +

+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. +

+ +

+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. +

+ +
go + +
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. +

+ +

MOVE +
See below for the syntax of moves. If the move is illegal, print +an error message; see the section "Commands from the engine to +xboard". 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. +

+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: +

+ +
Normal moves:e2e4 +
Pawn promotion:e7e8q +
Castling:e1g1, e1c1, e8g8, e8c8 +
Bughouse drop:P@h3 +
ICS Wild 0/1 castling:d1f1, d1b1, d8f8, d8b8 +
FischerRandom castling:o-o, o-o-o (future) +
+ +

+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. +

+ +

+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 "Commands from the engine to xboard". +

+ +
? +
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. +

+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. +

+ +
draw +
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. +

+ +

result RESULT {COMMENT} +
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:
result 1-0 {White mates}
+

+Here are some notes on interpreting the "result" command. Some apply +only to playing on ICS ("Zippy" mode). +

+ +

+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. +

+ +

+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. +

+ +
edit +
The edit command puts the chess engine into a special mode, where +it accepts the following subcommands: + +
cchange current piece color, initially white +
Pa4 (for example)place pawn of current color on a4 +
xa4 (for example)empty the square a4 (not used by xboard) +
#clear board +
.leave edit mode +
+ +

The edit command does not change the side to move. To set up a +black-on-move position, xboard uses the following command sequence: +

+
+    new
+    force
+    a2a3
+    edit
+    <edit commands>
+    .
+
+ +

+This sequence is used for compatibility with engines that do not +interpret the "black" command according to the specification above; +see "Idioms" below. +

+ +

+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. +

+ +
hint +
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). +

+ +

bk +
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. +

+ +

undo +
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.) +

+ +

remove +
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. +

+ +

hard +
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. +

+ +

easy +
Turn off pondering. +

+ +

post +
Turn on thinking/pondering output. +See Thinking Output section. +

+ +

nopost +
Turn off thinking/pondering output. +

+ +

analyze +
Enter analyze mode. See Analyze Mode section. +
+ +

Here are some special commands for Zippy mode:

+ +
+
name X +
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:
name mann
+ +
rating +
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: +
rating 2600 1500
+ +
computer +
The opponent is on the ICS computer list. +
+ +

Bughouse commands:

+ +

+xboard now supports bughouse engines when in Zippy mode. See +zippy.README 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. +

+ +
+
partner <player> +
<player> is now your partner for future games. Example:
partner mann
+

+ +

partner +
Meaning: You no longer have a partner. +

+ +

ptell <text> +
Your partner told you <text>, either with a ptell or an ordinary tell. +

+ +

holding [<white>] [<black>] +
White currently holds <white>; black currently holds <black>. + Example:
holding [PPPRQ] []
+ +
holding [<white>] [<black>] <color><piece> +
White currently holds <white>; black currently holds <black>, after + <color> acquired <piece>. Example:
holding [PPPRQ] [R] BR
+
+ +

9. Commands from the engine to xboard

+ +
+
Illegal move: MOVE +
Illegal move (REASON): MOVE +
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: + +
+  Illegal move: e2e4
+  Illegal move (in check): Nf3
+  Illegal move (moving into check): e1g1
+
+

+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. +

+ +
Error (ERRORTYPE): COMMAND +
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: +
+  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
+
+ +

+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. +

+ +
move MOVE +
Your engine is making the move MOVE. Do not echo moves from + xboard with this command; send only new moves made by the engine. + +

+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 "Idioms and backward +compatibility features" below. +

+ +

+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: +

+
+  e2e4
+  e4
+  Nf3
+  ed
+  exd
+  exd5
+  Nxd5
+  Nfd3
+  e8q
+  e8Q
+  e8=q
+  e8(Q)
+  e7e8q
+  o-o
+  O-O
+  0-0
+
+ +

+and many more. +

+ +
RESULT {COMMENT} +
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: +
+  0-1 {Black mates}
+  1-0 {White mates}
+  1/2-1/2 {Draw by repetition}
+  1/2-1/2 {Stalemate}
+
+ +

+xboard relays the result to the user, the ICS, the other engine in Two +Machines mode, and the PGN save file as required. +

+ +
resign +
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. +

+ +

offer draw +
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. +

+ +

telluser MESSAGE +
xboard pops up a modal information dialog containing the message. +MESSAGE consists of any characters, including whitespace, to the end +of the line. +

+ +

tellusererror MESSAGE +
xboard pops up a non-modal error dialog containing the message. +MESSAGE consists of any characters, including whitespace, to the end +of the line. +

+ +

askuser REPTAG MESSAGE +
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. +

+ +

tellics MESSAGE +
In Zippy mode, xboard sends "MESSAGE\n" to ICS. MESSAGE consists +of any characters, including whitespace, to the end of the line. + +
+ +

10. Thinking Output

+ +

+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: +

+ +
ply score time nodes pv
+ +Where: + +
plyInteger giving current search depth. +
scoreInteger giving current evaluation in centipawns. +
timeCurrent search time in centiseconds (ex: +1028 = 10.28 seconds). + +
nodesNodes searched. +
pvFreeform 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. +
+ +

+Example: +

+ +
  9 156 1084 48000 Nf3 Nc6 Nc3 Nf6
+ +

+Meaning: +

+ +9 ply, score=1.56, time = 10.84 seconds, nodes=48000, +PV = "Nf3 Nc6 Nc3 Nf6" + +

+Longer example from actual Crafty output: +

+
+  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
+
+ +

+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: +

+ +
+  0      0       0      0  (e4 64%, d4 24%)
+
+ +

+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: +

+ +
+ 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 
+
+ +

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 if and only if it sends xboard the move in +the usual "Hint: xxx" format before sending the first line. +

+ +

11. Time control

+ +

+xboard supports three styles of time control: conventional chess clocks, +the ICS-style incremental clock, and an exact number of seconds per move. +

+ +

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. +

+ +

+The command to set a conventional time control looks like this: +

+ +
+  level 40 5 0
+  level 40 0:30 0
+
+ +

+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. +

+ +

+The command to set an incremental time control looks like this: +

+ +
+  level 0 2 12
+
+ +

+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. +

+ +

+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.) +

+ +

+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. +

+ +

+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. +

+ +

The command to set an exact number of seconds per move looks like this: +

+ +
+  st 30
+
+ +

+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. +

+ +

12. Analyze Mode

+ +

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. +

+ +

+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: +

+ +
    +
  • Any legal move, as in force mode +
  • "undo" +
  • "new" (reset position to start of game but stay in analyze mode) +
  • "edit" (exiting edit mode returns to analyze mode) +
  • "exit" (leave analyze mode) +
  • "." (optional, see below) +
+ +

+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. +

+ +

+The chess engine should respond to ".\n" with a line like this: +

+ +
+stat01: time nodes ply mvleft mvtot
+
+ +Where: + +
timeElapsed search time in centiseconds (ie: 567 = 5.67 seconds). +
nodesNodes searched so far. +
plySearch depth so far. +
mvleftNumber of moves left to consider at this depth. +
mvtotTotal number of moves to consider. +
+ +

+Example: +

+
+  stat01: 1234 30000 7 5 30
+
+ +

+Meaning: +

+ +

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.

+ +

+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. +

+ +

+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. +

+ +

13. Idioms and backward compatibility features

+ +

+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. +

+ +
+ +
white +
go +
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. +

+ +

black +
go +
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. +

+ +

time N +
otim N +
MOVE +
Sent when the opponent makes a move and the engine is already +playing the opposite color. +

+ +

white +
time N +
otim N +
black +
go +
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. +

+ +

black +
time N +
otim N +
white +
go +
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. +

+ +

hard +
easy +
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. + +
+ +

+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: +

+ + +
Command Interpreted as +
White resigns 0-1 {White resigns} +
Black resigns 1-0 {Black resigns} +
White 1-0 {White mates} +
Black 0-1 {Black mates} +
Draw 1/2-1/2 {Draw} +
computer mates 1-0 {White mates} or 0-1 {Black mates} +
opponent mates 1-0 {White mates} or 0-1 {Black mates} +
computer resigns 0-1 {White resigns} or 1-0 {Black resigns} +
game is a draw 1/2-1/2 {Draw} +
checkmate 1-0 {White mates} or 0-1 {Black mates} +
+ +

+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. +

+ +

+An alternative move syntax is also recognized: +

+ + +
Command Interpreted as +
NUMBER ... MOVE move MOVE +
+ +

+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. +

+ +

+Any line that contains the words "offer" and "draw" is recognized as +"offer draw". +

+ +

+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". +

+ +

+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. +

+ +

+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. +

+ +

+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. +

+ +
+
converted to HTML by Steffen A. Jakob
+ + -- cgit v1.3