Scid  4.7.0
tablebase.tcl
Go to the documentation of this file.
1 ### tools/tablebase.tcl:
2 ### Tablebase display routines for Scid.
3 
4 set ::tb::isOpen 0
5 set tbTraining 0
6 set tbBoard 0
7 set tbStatus ""
8 
9 if { [catch {package require http}] } {
10  set ::tb::online_available 0
11 } else {
12  set ::tb::online_available 1
13 }
14 
15 namespace eval ::tb {
16  set url "http://k4it.de/egtb/fetch.php"
17  # proxy configuration
18  set proxyhost "127.0.0.1"
19  set proxyport 3128
20 }
21 
22 set tbInfo(section) 21
23 set tbInfo(material) "kpk"
24 set tbInfo(sections) [list 21 22 31 32 41]
25 foreach i $tbInfo(sections) { set tbInfo($i) [list]}
26 
27 set tbInfo(21) [list kqk krk kbk knk kpk]
28 
29 set tbInfo(22) [list \
30  kqkq kqkr kqkb kqkn kqkp \
31  - krkr krkb krkn krkp \
32  - - kbkb kbkn kbkp \
33  - - - knkn knkp \
34  - - - - kpkp]
35 
36 set tbInfo(31) [list \
37  kqqk kqrk kqbk kqnk kqpk \
38  - krrk krbk krnk krpk \
39  - - kbbk kbnk kbpk \
40  - - - knnk knpk \
41  - - - - kppk]
42 
43 set tbInfo(32) [list \
44  kqqkq kqqkr kqqkb kqqkn kqqkp \
45  kqrkq kqrkr kqrkb kqrkn kqrkp \
46  kqbkq kqbkr kqbkb kqbkn kqbkp \
47  kqnkq kqnkr kqnkb kqnkn kqnkp \
48  kqpkq kqpkr kqpkb kqpkn kqpkp \
49  - - - - - \
50  krrkq krrkr krrkb krrkn krrkp \
51  krbkq krbkr krbkb krbkn krbkp \
52  krnkq krnkr krnkb krnkn krnkp \
53  krpkq krpkr krpkb krpkn krpkp \
54  - - - - - \
55  kbbkq kbbkr kbbkb kbbkn kbbkp \
56  kbnkq kbnkr kbnkb kbnkn kbnkp \
57  kbpkq kbpkr kbpkb kbpkn kbpkp \
58  - - - - - \
59  knnkq knnkr knnkb knnkn knnkp \
60  knpkq knpkr knpkb knpkn knpkp \
61  kppkq kppkr kppkb kppkn kppkp]
62 
63 set tbInfo(41) [list \
64  kqqqk kqqrk kqqbk kqqnk kqqpk \
65  - kqrrk kqrbk kqrnk kqrpk \
66  - - kqbbk kqbnk kqbpk \
67  - - - kqnnk kqnpk \
68  - - - - kqppk \
69  - krrrk krrbk krrnk krrpk \
70  - - krbbk krbnk krbpk \
71  - - - krnnk krnpk \
72  - - - - krppk \
73  - - kbbbk kbbnk kbbpk \
74  - - - kbnnk kbnpk \
75  - - - - kbppk \
76  - - - knnnk knnpk \
77  - - - - knppk \
78  - - - - kpppk]
79 
80 set tbInfo(42) [list \
81  kqqqkq kqqqkr kqqqkb kqqqkn kqqqkp \
82  kqqrkq kqqrkr kqqrkb kqqrkn kqqrkp \
83  kqqbkq kqqbkr kqqbkb kqqbkn kqqbkp \
84  kqqnkq kqqnkr kqqnkb kqqnkn kqqnkp \
85  kqqpkq kqqpkr kqqpkb kqqpkn kqqpkp \
86  kqrrkq kqrrkr kqrrkb kqrrkn kqrrkp \
87  kqrbkq kqrbkr kqrbkb kqrbkn kqrbkp \
88  kqrnkq kqrnkr kqrnkb kqrnkn kqrnkp \
89  kqrpkq kqrpkr kqrpkb kqrpkn kqrpkp \
90  kqbbkq kqbbkr kqbbkb kqbbkn kqbbkp \
91  kqbnkq kqbnkr kqbnkb kqbnkn kqbnkp \
92  kqbpkq kqbpkr kqbpkb kqbpkn kqbpkp \
93  kqnnkq kqnnkr kqnnkb kqnnkn kqnnkp \
94  kqnpkq kqnpkr kqnpkb kqnpkn kqnpkp \
95  kqppkq kqppkr kqppkb kqppkn kqppkp \
96  krrrkq krrrkr krrrkb krrrkn krrrkp \
97  krrbkq krrbkr krrbkb krrbkn krrbkp \
98  krrnkq krrnkr krrnkb krrnkn krrnkp \
99  krrpkq krrpkr krrpkb krrpkn krrpkp \
100  krbbkq krbbkr krbbkb krbbkn krbbkp \
101  krbnkq krbnkr krbnkb krbnkn krbnkp \
102  krbpkq krbpkr krbpkb krbpkn krbpkp \
103  krnnkq krnnkr krnnkb krnnkn krnnkp \
104  krnpkq krnpkr krnpkb krnpkn krnpkp \
105  krppkq krppkr krppkb krppkn krppkp \
106  kbbbkq kbbbkr kbbbkb kbbbkn kbbbkp \
107  kbbnkq kbbnkr kbbnkb kbbnkn kbbnkp \
108  kbbpkq kbbpkr kbbpkb kbbpkn kbbpkp \
109  kbnnkq kbnnkr kbnnkb kbnnkn kbnnkp \
110  kbnpkq kbnpkr kbnpkb kbnpkn kbnpkp \
111  kbppkq kbppkr kbppkb kbppkn kbppkp \
112  knnnkq knnnkr knnnkb knnnkn knnnkp \
113  knnpkq knnpkr knnpkb knnpkn knnpkp \
114  knppkq knppkr knppkb knppkn knppkp \
115  kpppkq kpppkr kpppkb kpppkn kpppkp]
116 
117 # ::tb::isopen
118 # Returns boolean value of whether the tablebase window is open.
119 #
120 proc ::tb::isopen {} {
121  return [winfo exists .tbWin]
122 }
123 
124 # ::tb::Open
125 # Open the tablebase window.
126 #
127 proc ::tb::Open {} {
128  global tbInfo
129  set w .tbWin
130  if {[winfo exists $w]} { return}
132  ::setTitle $w "Scid: [tr WindowsTB]"
133  pack [ttk::frame $w.b] -side bottom -fill x
134  pack [ttk::frame $w.info] -side left -fill y
135  addVerticalRule $w
136  pack [ttk::frame $w.pos] -side right -fill both -expand yes
137 
138  # Left frame: tablebase browser and summary info
139 
140  set f $w.info
141  pack [ttk::frame $f.sec] -side top -fill x
142  foreach i $tbInfo(sections) {
143  set name "[string index $i 0]-[string index $i 1]"
144  ttk::radiobutton $f.sec.b$i -text " $name " -variable tbInfo(section) -value $i -command "::tb::section $i" ;# -indicatoron 0
145  pack $f.sec.b$i -side left -pady 1 -padx 1
146  }
147  autoscrollframe $f.list text $f.list.text \
148  -width 35 -height 7 -font font_Fixed -wrap none \
149  -foreground black -background white -cursor top_left_arrow
150  pack $f.list -side top
151  pack [ttk::frame $f.separator -height 2]
152  # addHorizontalRule $f
153 
154  autoscrollframe $f.data text $f.data.text \
155  -width 35 -height 0 -font font_Fixed -wrap none \
156  -foreground black -background white -cursor top_left_arrow
157  pack $f.data -side top -fill y -expand yes
158 
159  $f.list.text tag configure avail -foreground blue
160  $f.list.text tag configure unavail -foreground gray40
161  $f.data.text tag configure fen -foreground blue
162 
163  # Right frame: tablebase results for current position
164 
165  set f $w.pos
166  autoscrollframe $f text $f.text -width 30 -height 20 -font font_Small \
167  -wrap word -foreground black -background white -setgrid 1
168  $f.text tag configure indent -lmargin2 [font measure font_Fixed " "]
169 
170  ::board::new $f.board 25
171  $f.board configure -relief solid -borderwidth 1
172  for {set i 0} {$i < 64} {incr i} {
173  ::board::bind $f.board $i <Button-1> [list ::tb::resultsBoard $i]
174  }
175  if {$::tbBoard} {
176  grid $f.board -row 0 -column 2 -rowspan 2
177  }
178 
179  ttk::checkbutton $w.b.training -text $::tr(Training) -variable tbTraining -command ::tb::training ;# -padx 4 -pady 5
180  # button $w.b.online -text Online -command ::tb::updateOnline -relief raised -padx 4 -pady 5
181  if { !$::tb::online_available } {
182  catch { $w.b.online configure -state disabled}
183  }
184  ttk::button $w.b.random -text $::tr(Random) -command ::tb::random
185  ttk::button $w.b.showboard -image tb_coords -command ::tb::showBoard
186  dialogbutton $w.b.help -text $::tr(Help) -command { helpWindow TB }
187  dialogbutton $w.b.close -text $::tr(Close) -command "destroy $w"
188  ttk::label $w.b.status -width 1 -textvar tbStatus -font font_Small -relief flat -anchor w ;# -height 0
189  packbuttons right $w.b.close $w.b.help
190  pack $w.b.training -side left -padx 2 -pady 2
191  catch { pack $w.b.online -side left -padx 2 -pady 2}
192  pack $w.b.random $w.b.showboard -side left -padx 2 -pady 2
193  pack $w.b.status -side left -fill x -expand yes
194  bind $w <Destroy> { set ::tb::isOpen 0; set tbTraining 0 }
195  wm minsize $w 15 20
197  set ::tbTraining 0
201 }
202 
203 # ::tb::showBoard
204 # Toggles the results board.
205 #
206 proc ::tb::showBoard {} {
207  global tbBoard
208  set f .tbWin.pos
209  if {$tbBoard} {
210  set tbBoard 0
211  grid forget $f.board
212  } else {
213  set tbBoard 1
214  grid $f.board -row 0 -column 2 -rowspan 2
215  }
216 }
217 
218 # ::tb::resultsBoard
219 # Updates theresultsBoard board for a particular square.
220 #
221 proc ::tb::resultsBoard {sq} {
222  set f .tbWin.pos
223  set board [sc_pos board]
224  # If selected square is empty, take no action:
225  if {[string index $board $sq] == "."} { return}
226  # Clear any previous results:
227  ::board::clearText $f.board
228  # Highlight the selected square:
229  ::board::colorSquare $f.board $sq $::highcolor
230  # Retrieve tablebase scores:
231  busyCursor .
232  set scores [sc_pos probe board $sq]
233  set text(X) X; set color(X) red; set shadow(X) white
234  set text(=) =; set color(=) blue; set shadow(=) white
235  set text(?) "?"; set color(?) red; set shadow(?) white
236  set text(+) "#"; set text(-) "#"
237  if {[sc_pos side] == "white"} {
238  set color(+) white; set color(-) black
239  set shadow(+) black; set shadow(-) white
240  } else {
241  set color(+) black; set color(-) white
242  set shadow(+) white; set shadow(-) black
243  }
244  for {set i 0} {$i < 64} {incr i} {
245  # Skip squares that have a piece.
246  if {[string index $board $i] != "."} { continue}
247  # Draw the score on this square:
248  set score [string index $scores $i]
249  catch {::board::drawText $f.board $i $text($score) $color($score) 0 $shadow($score)}
250  }
251  unbusyCursor .
252 }
253 
254 # ::tb::name
255 # Converts a material string like "kqkr" or "KQKR" to "KQ-KR".
256 #
257 proc ::tb::name {s} {
258  set s [string toupper $s]
259  set idx [string last "K" $s]
260  set new [string range $s 0 [expr $idx - 1]]
261  append new "-"
262  append new [string range $s $idx end]
263  return $new
264 }
265 
266 # ::tb::section
267 # Updates the tablebase list for the specified section.
268 #
269 proc ::tb::section {{sec 0}} {
270  global tbInfo
271  set w .tbWin
272  if {! [winfo exists $w]} { return}
273  if {$sec == 0} { set sec $tbInfo(section)}
274  set tbInfo(section) $sec
275  if {! [info exists tbInfo($sec)]} { return}
276  set t $w.info.list.text
277  $t configure -state normal
278  $t delete 1.0 end
279  $t configure -height 10
280  set count 0
281  set linecount 1
282  foreach tb $tbInfo($sec) {
283  if {$tb == "-"} {
284  $t insert end [format "%-7s" ""]
285  } else {
286  set avail [sc_info tb available $tb]
287  if {$avail} {
288  set taglist [list avail $tb]
289  } else {
290  set taglist [list unavail $tb]
291  }
292  $t insert end [format "%-6s" [::tb::name $tb]] $taglist
293  $t insert end " "
294  # Bind tags for enter/leave/buttonpress on this tb:
295  $t tag bind $tb <Any-Enter> \
296  [list $t tag configure $tb -foreground yellow -background darkBlue]
297  $t tag bind $tb <Any-Leave> \
298  [list $t tag configure $tb -foreground {} -background {}]
299  $t tag bind $tb <ButtonPress-1> [list ::tb::summary $tb]
300  }
301  incr count
302  if {$count == 5} { set count 0; incr linecount; $t insert end "\n"}
303  }
304  if {$linecount > 10} { set linecount 10}
305  $t configure -height $linecount
306  $t configure -state disabled
307 }
308 
309 # ::tb::summary
310 # Shows the tablebase information for the specified tablebase.
311 #
312 proc ::tb::summary {{material ""}} {
313  global tbInfo tbs
314  set w .tbWin
315  if {! [winfo exists $w]} { return}
316 
317  if {$material == ""} { set material $tbInfo(material)}
318  set tbInfo(material) $material
319  set t $w.info.data.text
320  $t configure -state normal
321  $t delete 1.0 end
322  $t insert end [format "%-6s" [::tb::name $material]]
323  if {! [info exists tbs($material)]} {
324  $t insert end $::tr(NoSummary)
325  $t configure -state disabled
326  return
327  }
328  set data $tbs($material)
329 
330  $t insert end [format " %5u games per million\n\n" [lindex $data 0]]
331 
332  # Longest-mate and result-percentage stats:
333 
334  $t insert end $::tr(SideLongest)
335  $t insert end $::tr(toNoveMate)
336  $t insert end "---------------------------------\n"
337 
338  # Stats for White:
339  $t insert end [format "%-11s" $::tr(White)]
340  set len [lindex $data 1]
341  set fen [lindex $data 2]
342  if {$len == "0"} { set len "-"}
343  if {[string length $fen] > 2} {
344  append fen " w"
345  $t insert end [format "%3s" $len] [list fen $fen]
346  $t tag bind $fen <Any-Enter> \
347  [list $t tag configure $fen -foreground yellow -background darkBlue]
348  $t tag bind $fen <Any-Leave> \
349  [list $t tag configure $fen -foreground {} -background {}]
350  $t tag bind $fen <ButtonPress-1> [list ::tb::setFEN $fen]
351  } else {
352  $t insert end [format "%3s" $len]
353  }
354  $t insert end " "
355  $t insert end [format " %5s" [lindex $data 5]]
356  $t insert end [format " %5s" [lindex $data 6]]
357  $t insert end [format " %5s" [lindex $data 7]]
358  $t insert end "\n"
359 
360  # Stats for Black:
361  $t insert end [format "%-11s" $::tr(Black)]
362  set len [lindex $data 3]
363  set fen [lindex $data 4]
364  if {$len == "0"} { set len "-"}
365  if {[string length $fen] > 2} {
366  append fen " b"
367  $t insert end [format "%3s" $len] [list fen $fen]
368  $t tag bind $fen <Any-Enter> \
369  [list $t tag configure $fen -foreground yellow -background darkBlue]
370  $t tag bind $fen <Any-Leave> \
371  [list $t tag configure $fen -foreground {} -background {}]
372  $t tag bind $fen <ButtonPress-1> [list ::tb::setFEN $fen]
373  } else {
374  $t insert end [format "%3s" $len]
375  }
376  $t insert end " "
377  $t insert end [format " %5s" [lindex $data 8]]
378  $t insert end [format " %5s" [lindex $data 9]]
379  $t insert end [format " %5s" [lindex $data 10]]
380  $t insert end "\n\n"
381 
382  set mzugs [lindex $data 11]
383  $t insert end $::tr(MutualZugzwang)
384  if {$mzugs >= 0} { $t insert end "$mzugs\n"} else { $t insert end "?\n"}
385  if {$mzugs <= 0} {
386  $t configure -state disabled
387  return
388  }
389 
390  # Extra Zugzwang info:
391  set nBtmLoses [lindex $data 12]
392  set nWtmLoses [lindex $data 14]
393  set nBothLose [lindex $data 16]
394  set n1 $::tr(WdrawBloss)
395  set n2 $::tr(BdrawWloss)
396  set n3 $::tr(AllLoss)
397  set zugnames [list $n1 $n2 $n3]
398 # set zugnames [list [$::tr(WdrawBloss)] [$::tr(BdrawWloss)] [$::tr(AllLoss)] ]
399  if {$nBtmLoses > 0} {
400  $t insert end [lindex $zugnames 0]
401  $t insert end [format "%5d\n" $nBtmLoses]
402  }
403  if {$nWtmLoses > 0} {
404  $t insert end [lindex $zugnames 1]
405  $t insert end [format "%5d\n" $nWtmLoses]
406  }
407  if {$nBothLose > 0} {
408  $t insert end [lindex $zugnames 2]
409  $t insert end [format "%5d\n" $nBothLose]
410  }
411 
412  # Selected zugzwang positions:
413  set btmFens [lindex $data 13]
414  set wtmFens [lindex $data 15]
415  set bothFens [lindex $data 17]
416  set nBtmFens [llength $btmFens]
417  set nWtmFens [llength $wtmFens]
418  set nBothFens [llength $bothFens]
419  set nTotalFens [expr $nBtmFens + $nWtmFens + $nBothFens]
420  if {$nTotalFens == 0} {
421  $t configure -state disabled
422  return
423  }
424 
425  # Print the lists of selected zugzwang positions:
426  $t insert end $::tr(SelectetZugzwang)
427  foreach n [list $nBtmFens $nWtmFens $nBothFens] \
428  fenlist [list $btmFens $wtmFens $bothFens] \
429  name $zugnames tomove [list b w w] {
430  if {$n == 0} { continue}
431  $t insert end "\n [string trim $name]"
432  set count 0
433  for {set count 0} {$count < $n} {incr count} {
434  set fen [lindex $fenlist $count]
435  if {[expr $count % 10] == 0} {
436  $t insert end "\n "
437  }
438  $t insert end " "
439  append fen " $tomove"
440  $t insert end [format "%2d" [expr $count + 1]] [list fen $fen]
441  $t tag bind $fen <Any-Enter> \
442  [list $t tag configure $fen -foreground yellow -background darkBlue]
443  $t tag bind $fen <Any-Leave> \
444  [list $t tag configure $fen -foreground {} -background {}]
445  $t tag bind $fen <ButtonPress-1> [list ::tb::setFEN $fen]
446  }
447  }
448 
449  $t configure -state disabled
450 }
451 
452 # ::tb::results
453 # Called when the main window board changes, to display tablebase
454 # results for all moves from the current position.
455 #
456 proc ::tb::results {} {
457  global tbTraining
458  set w .tbWin
459  if {! [winfo exists $w]} { return}
460 
461  # Reset results board:
462  ::board::clearText $w.pos.board
463  ::board::update $w.pos.board [sc_pos board]
464 
465  # Update results panel:
466  set t $w.pos.text
467  $t delete 1.0 end
468  if {$tbTraining} {
469  $t insert end "\n (Training mode; results are hidden)"
470  } else {
471  $t insert end [sc_pos probe report] indent
472  }
473 }
474 
475 ################################################################################
476 #
477 ################################################################################
478 proc ::tb::updateOnline {} {
479  global tbTraining
480  set w .tbWin
481  if {! [winfo exists $w]} { return}
482 
483  # proxy configuration - needs UI
484  # ::http::config -proxyhost $::tb::proxyhost -proxyport $::tb::proxyport
485 
486  set t $w.pos.text
487  if { ! $tbTraining } {
488  set query [ ::http::formatQuery hook null action egtb fen [sc_pos fen]]
489  ::http::geturl $::tb::url -timeout 5000 -query $query -command { ::tb::httpCallback }
490  }
491 }
492 ################################################################################
493 #
494 ################################################################################
495 proc ::tb::httpCallback { token } {
496 
497  upvar #0 $token state
498 
499  set w .tbWin
500  if {! [winfo exists $w]} { return}
501  set t $w.pos.text
502 
503  # delete previous online output
504  foreach tag {tagonline} {
505  while {1} {
506  set del [$t tag nextrange $tag 1.0]
507  if {$del == ""} {break}
508  catch {$t delete [lindex $del 0] [lindex $del 1]}
509  }
510  }
511 
512  if {$state(status) != "ok"} {
513  $t insert end $state(status) tagonline
514  return
515  }
516 
517  set b $state(body)
518  set result ""
519 
520  if {[sc_pos side] == "black"} {
521  set tmp ""
522  set found 0
523  foreach line [split $b "\n"] {
524  if {$line == "NEXTCOLOR"} {
525  set found 1
526  continue
527  }
528  if {$found} {
529  append tmp "$line\n"
530  }
531  }
532  set b $tmp
533  }
534 
535  foreach line [split $b "\n"] {
536  if {$line == "NEXTCOLOR"} {
537  break
538  }
539  if { $line == "No information available" } {
540  append result "$line\n"
541  }
542  if {[string match "hook|null|value|*" $line]} {
543  append result "Online : [string range $line 16 end]\n"
544  continue
545  }
546  if {[scan $line "%d-%d:%s" sq1 sq2 tmp] == 3} {
547  set p1 [ string toupper [string index [sc_pos board] $sq1]]
548  set p2 [string index [sc_pos board] $sq2]
549  set take ""
550  if {$p2 != "."} {
551  set take "x"
552  }
553  append result "$p1[::board::san $sq1]$take[::board::san $sq2] [string range $line [string first : $line] end]\n"
554  }
555  }
556  ::http::cleanup state
557  $t insert end $result tagonline
558 }
559 ################################################################################
560 #
561 ################################################################################
562 
563 # ::tb::random
564 # Sets up a random position with the material of the tablebase
565 # currently displayed in the info frame.
566 #
567 proc ::tb::random {} {
568  global tbInfo
569  if {[catch {sc_game startBoard "random:$tbInfo(material)"} err]} {
570  tk_messageBox -title "Scid" -icon warning -type ok -message $err
571  return
572  }
573  # The material is valid, so clear the game and regenerate a
574  # random starting position:
575  sc_game new
576  sc_game startBoard "random:$tbInfo(material)"
577  updateBoard -pgn
578 }
579 
580 # ::tb::setFEN
581 # Called when an item in the Tablebase info browser with an
582 # associated FEN position is selected with the left mouse button,
583 # causing the position to be set in the main window.
584 #
585 proc ::tb::setFEN {fen} {
586  if {[catch {sc_game startBoard $fen} err]} {
587  tk_messageBox -title "Scid" -icon info -type ok -message $err
588  return
589  }
590  # The FEN is valid, so clear the game and reset the FEN:
591  sc_game new
592  sc_game startBoard $fen
593  updateBoard -pgn
594 }
595 
596 # ::tb::training
597 # Toggle tablebase training mode.
598 #
599 proc ::tb::training {} {
600  global tbTraining tbStatus gameInfo
601  set w .tbWin
602  set tbStatus ""
603  if {$tbTraining} {
604  set gameInfo(showTB_old) $gameInfo(showTB)
605  set gameInfo(showTB) 0
606  } else {
607  if {$gameInfo(showTB) == 0} { set gameInfo(showTB) $gameInfo(showTB_old)}
608  }
609  updateBoard -pgn
611 }
612 
613 # ::tb::move
614 # Finds and executes the best move in the current position,
615 # if one can be determined from the tablebases.
616 #
617 proc ::tb::move {} {
618  global tbTraining tbStatus
619  if {! $tbTraining} { return}
620  set moves [split [sc_pos probe optimal]]
621  set len [llength $moves]
622  if {$len == 0} {
623  set tbStatus "No optimal move was found."
624  return
625  }
626  set i [expr int(rand() * $len)]
627  set move [lindex $moves $i]
628  if {[catch {sc_move addSan $move}]} {
629  set tbStatus "Error playing $move."
630  } else {
631  set tbStatus "Played $move."
632  }
633  updateBoard -pgn
634 }
635 
636 
637 # tbs:
638 # Summary data about tablebases.
639 # Each list has the following elements:
640 # (0) Frequency (per million games),
641 # (1) Longest-wtm-mate length, (2) Longest-wtm-mate FEN,
642 # (3) Longest-btm-mate length, (4) Longest-btm-mate FEN,
643 # (5) wtm-win-%, (6) wtm-draw-%, (7) wtm-loss-%,
644 # (8) btm-win-%, (9) btm-draw-%, (10) btm-loss-%,
645 # (11) number of mutual zugzwangs (-1 if unknown).
646 # The longest-mate FENs have a board field only; no side to move, etc.
647 #
648 # There are three types of mutual zugzwang:
649 # wtm draws / btm loses, wtm loses / btm draws, wtm loses / btm loses.
650 # The first two are "half-point" zugzwangs, the last is "full-point".
651 #
652 # If the number of mutual zugzwangs is known and nonzero,
653 # six more items should follow in the list:
654 # (12) number of wtm-draws-btm-loses zugzwangs,
655 # (13) list of selected wtm-draws-btm-loses zugzwang FENs,
656 # (14) number of wtm-loses-btm-draws zugzwangs,
657 # (15) list of selected wtm-loses-btm-draws zugzwang FENs,
658 # (16) number of whoever-moves-loses (full-point) zugzwangs,
659 # (17) list of selected whoever-moves-loses zugzwang FENs.
660 # These zugzwang FENs board field only; no side to move, etc.
661 
662 set tbs(kqk) {
663  257 10 {7K/6Q1/8/8/2k5/8/8/8} 0 -
664  100.0 0.0 0.0 0.0 10.3 89.7
665  0
666 }
667 
668 set tbs(krk) {
669  542 16 {8/8/2R5/3k4/8/8/8/1K6} 0 -
670  100.0 0.0 0.0 0.0 9.9 90.1
671  0
672 }
673 
674 set tbs(kbk) {
675  194 0 - 0 -
676  0.0 100.0 0.0 0.0 100.0 0.0
677  0
678 }
679 
680 set tbs(knk) {
681  224 0 - 0 -
682  0.0 100.0 0.0 0.0 100.0 0.0
683  0
684 }
685 
686 set tbs(kpk) {
687  2352 28 {8/8/8/1k6/8/8/K5P1/8} 0 -
688  76.5 23.5 0.0 0.0 41.9 58.1
689  80 80 {} 0 {} 0 {}
690 }
691 
692 set tbs(kqkq) {
693  222 13 {8/8/8/8/8/8/8/qk1K2Q1} 13 {8/8/8/8/8/8/8/QK1k2q1}
694  41.7 57.8 0.5 41.7 57.8 0.5
695  0
696 }
697 
698 set tbs(kqkr) {
699  400 35 {K3r3/8/5k2/Q7/8/8/8/8} 19 {k7/5r2/K7/8/8/8/1Q6/8}
700  99.0 0.8 0.2 28.7 5.8 65.5
701  0
702 }
703 
704 set tbs(kqkb) {
705  25 17 {K7/8/8/3k4/4b3/8/8/7Q} 0 -
706  99.7 0.3 0.0 0.0 23.1 76.9
707  0
708 }
709 
710 set tbs(kqkn) {
711  74 21 {8/KQ6/2n5/2k5/8/8/8/8} 0 -
712  99.3 0.7 0.0 0.0 19.5 80.5
713  0
714 }
715 
716 set tbs(kqkp) {
717  937 28 {3KQ3/8/8/8/8/8/3kp3/8} 29 {8/1p4k1/7Q/8/7K/8/8/8}
718  99.4 0.6 0.0 7.7 12.1 80.2
719  0
720 }
721 
722 set tbs(krkr) {
723  423 19 {8/3R4/8/8/5k2/6r1/7K/8} 19 {1k6/2R5/3K4/8/8/8/6r1/8}
724  29.1 70.2 0.7 29.1 70.2 0.7
725  0
726 }
727 
728 set tbs(krkb) {
729  322 29 {k7/8/b7/8/K7/R7/8/8} 0 -
730  35.2 64.8 0.0 0.0 96.8 3.2
731  5 5 {
732  4R3/8/8/8/8/b1K5/8/3k4 8/5R2/7b/8/8/2K5/8/1k6 8/8/1b6/5R2/8/3K4/8/2k5
733  8/8/8/8/8/1k6/b7/R1K5 8/8/8/8/8/2K5/4k3/R2b4
734  } 0 {} 0 {}
735 }
736 
737 set tbs(krkn) {
738  397 40 {8/8/6R1/2K5/n7/8/8/3k4} 1 {8/8/8/8/1n6/k7/8/KR6}
739  48.4 51.6 0.0 0.0 89.0 11.0
740  18 18 {
741  8/2n5/8/4R3/3K1k2/8/8/8 8/8/5k2/4R3/3K4/2n5/8/8 8/8/8/1k6/2R5/3K4/4n3/8
742  8/8/8/2n5/3K4/4R3/5k2/8 8/8/8/3k4/2R5/3K4/n7/8 8/8/8/3k4/4R3/3K4/6n1/8
743  8/8/8/4k3/3R4/2K5/1n6/8 8/8/8/5k2/4R3/3K4/2n5/8 8/8/8/6n1/3K4/4R3/3k4/8
744  8/8/8/8/2R5/1k1K4/4n3/8 8/8/8/8/3K1k2/4R3/8/2n5 8/8/8/8/3R4/2K1k3/1n6/8
745  8/8/8/8/4R3/3K1k2/2n5/8 8/8/8/8/6n1/3K4/4R3/3k4 8/8/8/8/8/2KR4/8/2k2n2
746  8/8/8/8/8/2RK4/8/n2k4 8/8/8/8/8/3KR3/8/3k2n1 8/8/8/n7/3K4/2R5/3k4/8
747  } 0 {} 0 {}
748 }
749 
750 set tbs(krkp) {
751  2146 26 {2K5/8/7p/6k1/8/8/R7/8} 43 {8/8/8/8/5R2/2pk4/5K2/8}
752  91.4 8.4 0.2 16.4 17.5 66.1
753  12 12 {
754  8/8/8/8/8/1k6/p7/R1K5 8/8/8/8/8/2k5/1p6/1R1K4 8/8/8/8/8/4k3/5p2/3K1R2
755  8/3K4/8/3k4/3p4/8/8/3R4 8/1K6/8/1k6/1p6/8/8/1R6 8/2K5/8/2k5/2p5/8/8/2R5
756  8/2K5/8/2k5/3p4/8/8/3R4 8/3K4/8/3k4/4p3/8/8/4R3 8/1K6/8/1k6/2p5/8/8/2R5
757  8/2K5/8/2k5/1p6/8/8/1R6 8/3K4/8/3k4/2p5/8/8/2R5 8/K7/8/k7/1p6/8/8/1R6
758  } 0 {} 0 {}
759 }
760 
761 set tbs(kbkb) {
762  49 1 {8/8/8/8/8/K7/7B/kb6} 1 {6BK/8/6k1/8/8/b7/8/8}
763  0.0 100.0 0.0 0.0 100.0 0.0
764  0
765 }
766 
767 set tbs(kbkn) {
768  87 1 {knB5/8/1K6/8/8/8/8/8} 1 {K1k1n3/B7/8/8/8/8/8/8}
769  0.0 100.0 0.0 0.0 100.0 0.0
770  0
771 }
772 
773 set tbs(kbkp) {
774  387 1 {7k/7p/5K2/8/8/8/1B6/8} 29 {8/1p4k1/7B/8/8/7K/8/8}
775  0.0 94.8 5.2 23.6 76.4 0.0
776  1 0 {} 1 {8/8/8/8/8/8/1pK5/kB6} 0 {}
777 }
778 
779 set tbs(knkn) {
780  68 1 {k7/n1K5/8/3N4/8/8/8/8} 1 {8/8/8/8/1n6/1k6/8/KN6}
781  0.0 100.0 0.0 0.0 100.0 0.0
782  0
783 }
784 
785 set tbs(knkp) {
786  497 7 {8/8/8/8/pN6/8/2K5/k7} 29 {8/1p6/6kN/8/8/7K/8/8}
787  0.0 87.1 12.9 32.6 67.4 0.0
788  29 22 {} 7 {} 0 {}
789 }
790 
791 set tbs(kpkp) {
792  2810 33 {2K5/k7/7p/8/8/8/6P1/8} 33 {8/2p1K3/8/8/8/4P3/8/3k4}
793  43.4 33.3 23.2 43.4 33.3 23.2
794  121 106 {} 106 {} 15 {
795  8/8/8/1Kp5/2Pk4/8/8/8 8/8/8/2Kp4/3Pk3/8/8/8 8/8/8/8/1Kp5/2Pk4/8/8
796  8/8/8/8/1pK5/kP6/8/8 8/8/8/8/2Kp4/3Pk3/8/8 8/8/8/8/2pK4/1kP5/8/8
797  8/8/8/8/3Kp3/4Pk2/8/8 8/8/8/8/8/1Kp5/2Pk4/8 8/8/8/8/8/1pK5/kP6/8
798  8/8/8/8/8/2Kp4/3Pk3/8 8/8/8/8/8/2pK4/1kP5/8 8/8/8/8/8/3Kp3/4Pk2/8
799  8/8/8/8/8/Kp6/1Pk5/8 8/8/8/8/Kp6/1Pk5/8/8 8/8/8/Kp6/1Pk5/8/8/8
800  }
801 }
802 
803 set tbs(kqqk) {
804  13 4 {8/8/8/4k3/8/8/1K6/QQ6} 0 -
805  100.0 0.0 0.0 0.0 2.1 97.9
806  0
807 }
808 
809 set tbs(kqrk) {
810  18 6 {7Q/8/8/8/4k3/8/8/1R5K} 0 -
811  100.0 0.0 0.0 0.0 1.1 98.9
812  0
813 }
814 
815 set tbs(kqbk) {
816  36 8 {8/Q4B2/5k2/8/8/8/8/K7} 0 -
817  100.0 0.0 0.0 0.0 9.4 90.6
818  0
819 }
820 
821 set tbs(kqnk) {
822  41 9 {K7/N7/8/8/8/5k2/Q7/8} 0 -
823  100.0 0.0 0.0 0.0 9.7 90.3
824  0
825 }
826 
827 set tbs(kqpk) {
828  156 10 {8/8/8/2k5/8/8/4P1Q1/7K} 0 -
829  100.0 0.0 0.0 0.0 2.8 97.2
830  0
831 }
832 
833 set tbs(krrk) {
834  8 7 {4R3/3k4/8/8/5R1K/8/8/8} 0 -
835  100.0 0.0 0.0 0.0 0.3 99.7
836  0
837 }
838 
839 set tbs(krbk) {
840  46 16 {8/8/3R4/4k3/4B3/8/8/K7} 0 -
841  100.0 0.0 0.0 0.0 8.8 91.2
842  0
843 }
844 
845 set tbs(krnk) {
846  15 16 {K7/2R5/3k4/3N4/8/8/8/8} 0 -
847  100.0 0.0 0.0 0.0 9.2 90.8
848  0
849 }
850 
851 set tbs(krpk) {
852  333 16 {K7/8/3R4/4kP2/8/8/8/8} 0 -
853  100.0 0.0 0.0 0.0 2.5 97.5
854  0
855 }
856 
857 set tbs(kbbk) {
858  31 19 {K7/8/3B4/3k4/8/8/4B3/8} 0 -
859  49.3 50.7 0.0 0.0 58.8 41.2
860  0
861 }
862 
863 set tbs(kbnk) {
864  206 33 {7K/4B3/4k3/8/8/8/8/2N5} 0 -
865  99.5 0.5 0.0 0.0 18.1 81.9
866  0
867 }
868 
869 set tbs(kbpk) {
870  453 31 {8/3P4/KBk5/8/8/8/8/8} 0 -
871  96.0 4.0 0.0 0.0 16.8 83.2
872  6 6 {
873  1B1K4/8/8/k7/8/P7/8/8 1B6/3K4/8/1k6/8/P7/8/8 1BK5/8/1k6/8/8/P7/8/8
874  8/B1k5/K7/P7/8/8/8/8 kB6/8/1PK5/8/8/8/8/8 kB6/8/KP6/8/8/8/8/8
875  } 0 {} 0 {}
876 }
877 
878 set tbs(knnk) {
879  20 1 {k7/3N4/K1N5/8/8/8/8/8} 0 -
880  0.0 100.0 0.0 0.0 100.0 0.0
881  0
882 }
883 
884 set tbs(knpk) {
885  426 27 {1N6/8/8/8/8/2k3P1/8/2K5} 0 -
886  96.3 3.7 0.0 0.0 18.5 81.5
887  75 75 {} 0 {} 0 {}
888 }
889 
890 set tbs(kppk) {
891  563 32 {8/8/8/8/2k5/6P1/K5P1/8} 0 -
892  98.4 1.6 0.0 0.0 7.9 92.1
893  43 43 {} 0 {} 0 {}
894 }
895 
896 set tbs(kqqkq) {
897  51 30 {2K5/8/1k6/5q2/8/8/6Q1/7Q} 13 {7Q/7K/8/6Qk/8/8/7q/8}
898  99.1 0.8 0.1 0.6 32.8 66.6
899  0
900 }
901 
902 set tbs(kqqkr) {
903  0 35 {Kr6/8/8/8/8/3Q4/4Q3/2k5} 19 {6Q1/8/8/8/8/7K/2r4Q/7k}
904  100.0 0.0 0.0 0.1 0.2 99.7
905  0
906 }
907 
908 set tbs(kqqkb) {
909  0 15 {8/8/7Q/5k1K/7Q/5b2/8/8} 0 -
910  100.0 0.0 0.0 0.0 0.1 99.9
911  0
912 }
913 
914 set tbs(kqqkn) {
915  0 19 {5K2/3n4/4k3/2Q5/8/8/8/1Q6} 0 -
916  100.0 0.0 0.0 0.0 0.1 99.9
917  0
918 }
919 
920 set tbs(kqqkp) {
921  7 22 {8/8/8/3Q4/7Q/2k5/1p6/K7} 13 ?
922  100.0 0.0 0.0 0.0 0.7 99.3
923  0
924 }
925 
926 set tbs(kqrkq) {
927  36 67 {8/8/8/8/q7/6k1/8/KR5Q} 38 {8/8/q7/8/8/6R1/2K4Q/k7}
928  97.0 2.8 0.2 24.4 21.2 54.4
929  1 1 {8/8/8/8/1R6/k4q2/8/1K2Q3} 0 {} 0 {}
930 }
931 
932 set tbs(kqrkr) {
933  132 34 {1K2Q3/8/3k4/1r2R3/8/8/8/8} 20 {6rQ/8/8/8/8/7K/5R2/6k1}
934  99.8 0.1 0.0 0.3 17.1 82.1
935  0
936 }
937 
938 set tbs(kqrkb) {
939  12 29 {2k5/5b2/8/8/2K5/8/Q7/6R1} 0 -
940  100.0 0.0 0.0 0.0 11.6 88.4
941  0
942 }
943 
944 set tbs(kqrkn) {
945  2 40 ? 1 {8/8/8/8/1n6/k7/8/KR5Q}
946  99.9 0.1 0.0 0.0 7.7 92.3
947  0
948 }
949 
950 set tbs(kqrkp) {
951  25 40 ? 43 ?
952  100.0 0.0 0.0 0.3 1.4 98.3
953  0
954 }
955 
956 set tbs(kqbkq) {
957  28 33 {5q2/8/8/5B2/k1K4Q/8/8/8} 24 {6KQ/8/1B6/6k1/8/6q1/8/8}
958  55.7 44.0 0.3 30.5 62.3 7.2
959  25 25 {} 0 {} 0 {}
960 }
961 
962 set tbs(kqbkr) {
963  21 40 ? 30 ?
964  99.3 0.6 0.0 0.7 27.5 71.8
965  0
966 }
967 
968 set tbs(kqbkb) {
969  2 17 ? 2 ?
970  99.7 0.3 0.0 0.0 19.8 80.2
971  0
972 }
973 
974 set tbs(kqbkn) {
975  2 21 ? 1 ?
976  99.5 0.5 0.0 0.0 16.7 83.3
977  0
978 }
979 
980 set tbs(kqbkp) {
981  25 32 ? 24 ?
982  100.0 0.0 0.0 1.0 14.1 84.9
983  0
984 }
985 
986 set tbs(kqnkq) {
987  74 41 {8/7q/8/k7/2K5/2N5/8/4Q3} 24 {7K/8/1N6/Q5k1/8/8/6q1/8}
988  50.1 49.6 0.3 33.5 62.2 4.3
989  38 38 {} 0 {} 0 {}
990 }
991 
992 set tbs(kqnkr) {
993  12 38 ? 41 ?
994  99.2 0.7 0.0 3.0 27.2 69.8
995  0
996 }
997 
998 set tbs(kqnkb) {
999  7 17 ? 1 ?
1000  99.8 0.2 0.0 0.0 20.9 79.1
1001  0
1002 }
1003 
1004 set tbs(kqnkn) {
1005  13 21 ? 1 ?
1006  99.4 0.6 0.0 0.0 17.8 82.2
1007  0
1008 }
1009 
1010 set tbs(kqnkp) {
1011  46 30 ? 29 ?
1012  99.9 0.1 0.0 1.9 15.0 83.1
1013  0
1014 }
1015 
1016 set tbs(kqpkq) {
1017  1179 124 {4q3/K7/8/8/8/4P3/6Q1/k7} 29 {8/7q/3PK3/8/8/8/Q7/3k4}
1018  68.4 31.2 0.4 35.2 51.2 13.6
1019  640 640 {} 0 {} 0 {}
1020 }
1021 
1022 set tbs(kqpkr) {
1023  216 38 ? 33 ?
1024  99.6 0.3 0.1 19.7 6.1 74.1
1025  1 1 {k7/8/KQ1r4/P7/8/8/8/8} 0 {} 0 {}
1026 }
1027 
1028 set tbs(kqpkb) {
1029  16 28 ? 2 ?
1030  99.9 0.1 0.0 0.0 16.7 83.3
1031  0
1032 }
1033 
1034 set tbs(kqpkn) {
1035  41 30 ? 8 ?
1036  99.7 0.3 0.0 0.0 12.5 87.5
1037  0
1038 }
1039 
1040 set tbs(kqpkp) {
1041  622 105 {8/8/8/8/3P2Q1/8/1p6/K1k5} 34 ?
1042  100.0 0.0 0.0 3.3 7.3 89.4
1043  0
1044 }
1045 
1046 set tbs(krrkq) {
1047  8 29 {3R4/1R6/8/8/q7/7K/8/k7} 49 {7R/1q6/3K4/8/k7/8/2R5/8}
1048  58.2 36.8 5.1 52.0 37.0 11.0
1049  10 10 {
1050  6R1/8/8/8/6R1/7q/1K5k/8 6R1/8/8/8/8/6R1/7q/K6k 8/6R1/8/8/8/3K2R1/7q/7k
1051  8/6R1/8/8/8/6R1/7q/1K5k 8/8/1R6/8/8/1R1K4/q7/k7 8/8/6R1/8/8/6R1/7q/2K4k
1052  8/8/8/3R4/8/k7/2KR4/4q3 8/8/8/6R1/8/6R1/7q/3K3k 8/8/8/8/1R6/1R6/q7/k2K4
1053  8/8/8/8/8/2K5/2R1R3/kq6
1054  } 0 {} 0 {}
1055 }
1056 
1057 set tbs(krrkr) {
1058  38 31 {8/1R6/8/8/8/5r1K/4R3/k7} 20 {1k6/2R5/7r/3K3R/8/8/8/8}
1059  99.2 0.7 0.0 0.4 33.4 66.2
1060  0
1061 }
1062 
1063 set tbs(krrkb) {
1064  8 29 {8/8/8/2b5/8/4KR2/1k6/6R1} 0 -
1065  99.3 0.7 0.0 0.0 22.4 77.6
1066  1 1 {8/8/8/8/8/b1k5/1R6/1RK5} 0 {} 0 {}
1067 }
1068 
1069 set tbs(krrkn) {
1070  8 40 {4k3/6R1/8/7n/5K2/1R6/8/8} 1 {8/8/8/8/1n6/k7/8/KR1R4}
1071  99.7 0.3 0.0 0.0 15.0 85.0
1072  0
1073 }
1074 
1075 set tbs(krrkp) {
1076  3 33 ? 50 ?
1077  100.0 0.0 0.0 1.0 5.7 93.3
1078  0
1079 }
1080 
1081 set tbs(krbkq) {
1082  23 21 ? 70 ?
1083  38.7 48.0 13.4 71.2 25.6 3.2
1084  372 0 {} 372 {3Kn3/8/8/8/8/4r3/7Q/3k4} 0 {}
1085 }
1086 
1087 set tbs(krbkr) {
1088  649 65 {k7/7r/3K4/8/6B1/8/4R3/8} 30 {8/4R2K/8/5k2/8/8/7B/4r3}
1089  41.3 58.7 0.0 0.8 94.1 5.1
1090  17 17 {
1091  8/8/8/8/8/1R1K4/2B5/r1k5 8/8/8/8/8/2KB4/2R5/kr6 8/8/8/8/7B/4r3/5R2/2K1k3
1092  8/8/8/8/rB6/8/1R6/1K1k4 7k/6R1/7r/8/8/8/1B6/1K6 8/8/8/8/8/2K4B/6R1/3r1k2
1093  8/8/8/8/4R3/k7/2K1B3/4r3 8/8/8/8/8/2R3Br/k1K5/8 8/8/8/3B1r2/3K4/8/6R1/3k4
1094  8/8/8/8/8/R2K4/5B2/1r1k4 8/8/8/8/8/3K2R1/8/4k1Br 8/8/8/2B5/8/6r1/k1K4R/8
1095  8/5r2/8/8/1R4B1/8/3K4/k7 8/8/3B4/1r6/8/2K5/4R3/1k6 8/8/8/8/3KB2r/8/5R2/k7
1096  8/8/3B4/8/8/5r2/k1K1R3/8 5R2/8/8/8/8/3K4/5Br1/2k5
1097  } 0 {} 0 {}
1098 }
1099 
1100 set tbs(krbkb) {
1101  20 30 ? 2 ?
1102  98.2 1.8 0.0 0.0 31.1 68.9
1103  0
1104 }
1105 
1106 set tbs(krbkn) {
1107  5 40 ? 1 ?
1108  98.9 1.1 0.0 0.0 24.0 76.0
1109  0
1110 }
1111 
1112 set tbs(krbkp) {
1113  33 28 ? 70 ?
1114  99.1 0.9 0.0 2.4 17.1 80.5
1115  1 1 {1k1K4/7R/8/8/8/8/6p1/7B} 0 {} 0 {}
1116 }
1117 
1118 set tbs(krnkq) {
1119  15 20 ? 69 ?
1120  35.4 41.1 23.4 78.2 19.7 2.1
1121  455 0 {} 455 {} 0 {}
1122 }
1123 
1124 set tbs(krnkr) {
1125  430 37 {2k1r3/8/R7/N2K4/8/8/8/8} 41 {4K3/8/1r6/8/5k2/1R4N1/8/8}
1126  36.7 63.3 0.1 3.2 93.6 3.2
1127  10 10 {
1128  2R5/8/8/8/8/k2K4/8/r1N5 8/8/8/8/3N4/1R1K4/8/r1k5 8/8/8/8/3N4/2KR4/8/2k1r3
1129  8/8/8/8/4N3/7R/k1K5/5r2 8/8/8/8/8/2KRN3/8/2k1r3 8/8/8/8/8/3KN3/3R4/2k1r3
1130  8/8/8/8/8/5RN1/8/2K1k1r1 8/8/8/8/8/6RN/8/3K1k1r 8/8/8/8/8/NR1K4/8/r1k5
1131  8/8/8/8/r1N5/2R5/k1K5/8
1132  } 0 {} 0 {}
1133 }
1134 
1135 set tbs(krnkb) {
1136  7 31 ? 1 ?
1137  97.7 2.3 0.0 0.0 32.4 67.6
1138  0
1139 }
1140 
1141 set tbs(krnkn) {
1142  12 37 ? 1 ?
1143  99.0 1.0 0.0 0.0 24.6 75.4
1144  3 3 {
1145  8/8/8/8/4n3/1k6/N7/R1K5 8/8/8/8/8/3n4/N2k4/RK6 8/8/8/8/8/n7/1k6/N1RK4
1146  } 0 {} 0 {}
1147 }
1148 
1149 set tbs(krnkp) {
1150  32 29 ? 68 ?
1151  98.5 1.5 0.0 4.5 17.1 78.4
1152  0
1153 }
1154 
1155 set tbs(krpkq) {
1156  367 68 ? 104 ?
1157  37.7 11.8 50.5 91.0 7.1 1.8
1158  243 2 {} 241 {} 0 {}
1159 }
1160 
1161 set tbs(krpkr) {
1162  9184 74 {8/1k6/4R3/8/8/8/6Pr/4K3} 33 {8/1P6/2k5/8/K7/8/8/1r5R}
1163  66.6 33.0 0.4 20.1 54.4 25.5
1164  209 209 {} 0 {} 0 {}
1165 }
1166 
1167 set tbs(krpkb) {
1168  626 73 ? 2 ?
1169  96.4 3.6 0.0 0.0 32.6 67.4
1170  225 225 {} 0 {} 0 {}
1171 }
1172 
1173 set tbs(krpkn) {
1174  397 54 ? 8 ?
1175  97.5 2.5 0.0 0.0 24.7 75.3
1176  413 413 {} 0 {} 0 {} 0 {}
1177 }
1178 
1179 set tbs(krpkp) {
1180  1092 56 ? 103 ?
1181  99.4 0.4 0.3 10.0 6.6 83.5
1182  3 0 {} 2 {
1183  8/8/8/8/8/1p6/kP6/1RK5 8/8/8/8/8/k7/Pp6/RK6
1184  } 1 {8/8/8/8/8/2p5/1kP5/2RK4}
1185 }
1186 
1187 set tbs(kbbkq) {
1188  3 21 ? 81 ?
1189  15.3 20.2 64.5 96.5 2.9 0.6
1190  1 0 {} 1 {8/8/8/8/q7/2BB4/1K6/3k4} 0 {}
1191 }
1192 
1193 set tbs(kbbkr) {
1194  13 23 {4r3/8/8/8/8/4B3/8/k1K4B} 31 {1K4B1/8/3k4/8/B5r1/8/8/8}
1195  16.5 83.4 0.1 1.3 97.2 1.5
1196  3 3 {
1197  8/8/8/8/8/3K1k2/6r1/4B2B 8/8/8/8/8/5k2/6r1/3KB2B 8/8/8/B7/8/3k4/2r5/KB6
1198  } 0 {} 0 {}
1199 }
1200 
1201 set tbs(kbbkb) {
1202  35 22 {6B1/8/7B/8/b7/2K5/8/k7} 2 {1B5K/5k1B/8/8/8/4b3/8/8}
1203  15.6 84.3 0.0 0.0 98.6 1.4
1204  0
1205 }
1206 
1207 set tbs(kbbkn) {
1208  28 78 {8/K7/8/8/8/5k2/6n1/2B4B} 1 ?
1209  48.2 51.8 0.0 0.0 66.1 33.9
1210  1 1 {8/8/8/8/8/6n1/2K4B/kB6} 0 {} 0 {}
1211 }
1212 
1213 set tbs(kbbkp) {
1214  23 74 ? 83 ?
1215  48.0 50.2 1.8 11.4 54.1 34.5
1216  1 1 {B1k5/1pB5/3K4/8/8/8/8/8} 0 {} 0 {}
1217 }
1218 
1219 set tbs(kbnkq) {
1220  13 36 ? 53 ?
1221  25.0 6.4 68.6 97.6 1.7 0.7
1222  1 0 {} 1 {8/8/q7/8/3K4/2N5/8/k1B5} 0 {}
1223 }
1224 
1225 set tbs(kbnkr) {
1226  64 36 {8/8/8/2N5/8/8/B6K/5kr1} 41 {8/8/1B4N1/5k2/8/1r6/8/4K3}
1227  26.0 73.8 0.2 3.8 94.6 1.6
1228  8 6 {
1229  3r4/8/2B5/8/1N6/8/8/k1K5 8/8/8/8/8/2k5/1r6/B1NK4 8/8/8/8/8/2k5/3r4/1KN1B3
1230  8/8/8/8/8/3k4/4r3/2KN1B2 8/8/8/8/8/4k3/5r2/3KN1B1 8/8/8/8/B7/1r6/N1k5/K7
1231  } 2 {8/8/8/8/8/1k3r2/8/1KB4N 8/r7/8/B7/8/8/N1k5/K7} 0 {}
1232 }
1233 
1234 set tbs(kbnkb) {
1235  54 39 {8/7B/8/8/6N1/8/3k4/1Kb5} 2 {KB6/8/k4N2/8/6b1/8/8/8}
1236  25.5 74.5 0.0 0.0 98.8 1.2
1237  45 45 {} 0 {} 0 {}
1238 }
1239 
1240 set tbs(kbnkn) {
1241  36 107 {6Bk/8/8/7N/8/7K/6n1/8} 1 {8/8/3N4/8/3n4/8/B7/K1k5}
1242  32.2 67.8 0.0 0.0 96.1 3.9
1243  922 922 {} 0 {} 0 {}
1244 }
1245 
1246 set tbs(kbnkp) {
1247  165 104 ? 55 ?
1248  91.4 5.5 3.2 14.7 23.0 62.4
1249  62 61 {} 1 {8/8/8/1N6/3K4/B7/5p2/k7} 0 {}
1250 }
1251 
1252 set tbs(kbpkq) {
1253  117 35 ? 50 ?
1254  21.3 11.5 67.2 96.8 2.8 0.4
1255  16 0 {} 16 {
1256  3K4/2P5/B3qk2/8/8/8/8/8 8/1KP1q3/1B1k4/8/8/8/8/8 8/qPK5/8/3k4/1B6/8/8/8
1257  2q5/2B2P2/3K4/1k6/8/8/8/8 8/2P5/4q3/KB6/8/k7/8/8 8/3P4/5q2/1KB5/8/1k6/8/8
1258  8/1KP1q3/4k3/B7/8/8/8/8 3K4/q1P5/B4k2/8/8/8/8/8 8/5P2/3K4/8/4k2B/7q/8/8
1259  8/4P3/6q1/k1K5/2B5/8/8/8 3k4/KP1q4/3B4/8/8/8/8/8 8/3K1P2/1k2Bq2/8/8/8/8/8
1260  3K4/2P5/2B2k2/8/1q6/8/8/8 8/1P1K4/1qB2k2/8/8/8/8/8 1k6/3K1P2/4Bq2/8/8/8/8/8
1261  5k2/1P1K4/1qB5/8/8/8/8/8
1262  } 0 {}
1263 }
1264 
1265 set tbs(kbpkr) {
1266  451 45 ? 39 ?
1267  30.9 67.3 1.8 23.4 73.1 3.5
1268  306 4 {} 302 {} 0 {}
1269 }
1270 
1271 set tbs(kbpkb) {
1272  570 51 ? 3 ?
1273  41.3 58.7 0.0 0.0 86.9 13.1
1274  160 160 {} 0 {} 0 {}
1275 }
1276 
1277 set tbs(kbpkn) {
1278  497 105 ? 8 ?
1279  53.7 46.3 0.0 0.0 76.4 23.6
1280  2125 2112 {} 13 {} 0 {}
1281 }
1282 
1283 set tbs(kbpkp) {
1284  1443 67 ? 51 ?
1285  86.4 9.5 4.1 16.7 24.1 59.2
1286  406 403 {} 2 {} 1 {8/8/8/8/8/k1p5/2P5/1BK5}
1287 }
1288 
1289 set tbs(knnkq) {
1290  5 1 {k1N5/2K5/8/3N4/8/5q2/8/8} 72 ?
1291  0.0 42.8 57.1 94.0 6.0 0.0
1292  229 0 {} 229 {} 0 {}
1293 }
1294 
1295 set tbs(knnkr) {
1296  15 3 {5r1k/8/7K/4N3/5N2/8/8/8} 41 {8/8/1r4N1/4kN2/8/8/8/4K3}
1297  0.0 99.6 0.4 6.3 93.7 0.0
1298  25 0 {} 25 {} 0 {}
1299 }
1300 
1301 set tbs(knnkb) {
1302  2 4 {7k/5K2/8/8/5NN1/8/8/2b5} 1 {8/8/8/8/8/8/N1k5/K1b4N}
1303  0.0 100.0 0.0 0.0 100.0 0.0
1304  0
1305 }
1306 
1307 set tbs(knnkn) {
1308  8 7 {7n/8/8/8/1N1KN3/8/8/k7} 1 {K7/N1k5/8/3n4/3N4/8/8/8}
1309  0.1 99.9 0.0 0.0 100.0 0.0
1310  362 362 {} 0 {} 0 {}
1311 }
1312 
1313 set tbs(knnkp) {
1314  71 115 ? 74 ?
1315  31.3 66.4 2.3 12.8 73.6 13.6
1316  3143 3124 {} 19 {} 0 {}
1317 }
1318 
1319 set tbs(knpkq) {
1320  130 41 ? 55 ?
1321  17.9 11.9 70.2 97.2 2.3 0.5
1322  52 0 {} 52 {} 0 {}
1323 }
1324 
1325 set tbs(knpkr) {
1326  433 44 ? 67 ?
1327  26.7 69.3 4.0 29.3 68.5 2.2
1328  1181 23 {} 1158 {} 0 {}
1329 }
1330 
1331 set tbs(knpkb) {
1332  728 43 ? 9 ?
1333  38.8 61.2 0.0 0.0 88.1 11.9
1334  642 640 {} 2 {} 0 {}
1335 }
1336 
1337 set tbs(knpkn) {
1338  781 97 ? 7 ?
1339  49.2 50.8 0.0 0.0 77.2 22.8
1340  4191 4128 {} 63 {} 0 {}
1341 }
1342 
1343 set tbs(knpkp) {
1344  1410 57 ? 58 ?
1345  78.3 13.6 8.1 21.8 27.6 50.6
1346  2303 2281 {} 14 {} 8 {
1347  8/8/8/8/3K4/NkpP4/8/8 8/8/8/8/3K4/3PpkN1/8/8 8/8/8/8/8/1k2p3/4P3/KN6
1348  8/8/8/8/8/2K5/2PpkN2/8 8/8/8/8/8/3K4/3PpkN1/8 8/8/8/8/8/3K4/NkpP4/8
1349  8/8/8/8/1p6/1P6/K7/N1k5 8/8/8/8/8/1K6/1PpkN3/8
1350  }
1351 }
1352 
1353 set tbs(kppkq) {
1354  726 124 {8/5P2/8/8/3K4/3P3q/7k/8} 41 {8/2KP2q1/8/2P5/5k2/8/8/8}
1355  16.0 12.6 71.4 98.4 1.5 0.1
1356  2 0 {} 2 {8/2KP3q/2P2k2/8/8/8/8/8 8/2KP3q/8/2P3k1/8/8/8/8} 0 {}
1357 }
1358 
1359 set tbs(kppkr) {
1360  1652 54 {3K4/8/8/4P3/8/2r5/5P2/2k5} 40 {8/8/8/7K/5P2/3Pr3/8/2k5}
1361  35.4 20.1 44.5 75.2 18.2 6.6
1362  119 18 {} 99 {} 2 {1r1k4/1P6/1PK5/8/8/8/8/8 8/8/8/8/k7/r1P5/1KP5/8}
1363 }
1364 
1365 set tbs(kppkb) {
1366  519 43 {8/6P1/7k/8/6P1/1K6/8/1b6} 4 {K5b1/P7/1k6/8/8/8/2P5/8}
1367  54.4 45.6 0.0 0.0 75.4 24.6
1368  212 211 {} 1 {8/8/8/8/8/b2k4/P2P4/1K6} 0 {}
1369 }
1370 
1371 set tbs(kppkn) {
1372  705 50 {3n4/5P2/8/8/3K2P1/8/k7/8} 17 {7K/8/4k2P/8/8/8/5P2/5n2}
1373  64.7 35.3 0.0 0.0 62.4 37.6
1374  1077 920 {} 157 {} 0 {}
1375 }
1376 
1377 set tbs(kppkp) {
1378  5080 127 {8/8/8/8/1p2P3/1k1KP3/8/8} 43 {7K/8/4P3/5P2/3k4/7p/8/8}
1379  77.1 10.3 12.6 27.7 19.1 53.2
1380  4237 4179 {} 52 {} 6 {
1381  8/8/8/8/2k5/K1p5/P3P3/8 8/8/8/8/3k4/1K1p4/1P3P2/8
1382  8/8/8/8/4k3/2K1p3/2P3P1/8 8/8/8/2k5/K1p5/P3P3/8/8
1383  8/8/8/8/5k2/3K1p2/3P3P/8 8/8/8/k7/p1K5/2P5/2P5/8
1384  }
1385 }
1386 
1387 set tbs(kqqqk) {
1388  0 3 ? 0 -
1389  100.0 0.0 0.0 0.0 4.0 96.0
1390  0
1391 }
1392 
1393 set tbs(kqqrk) {
1394  0 4 ? 0 -
1395  100.0 0.0 0.0 0.0 3.1 96.9
1396  0
1397 }
1398 
1399 set tbs(kqqbk) {
1400  3 4 ? 0 -
1401  100.0 0.0 0.0 0.0 2.7 97.3
1402  0
1403 }
1404 
1405 set tbs(kqqnk) {
1406  2 4 ? 0 -
1407  100.0 0.0 0.0 0.0 2.4 97.6
1408  0
1409 }
1410 
1411 set tbs(kqqpk) {
1412  12 4 ? 0 -
1413  100.0 0.0 0.0 0.0 2.1 97.9
1414  0
1415 }
1416 
1417 set tbs(kqrrk) {
1418  0 4 ? 0 -
1419  100.0 0.0 0.0 0.0 2.0 98.0
1420  0
1421 }
1422 
1423 set tbs(kqrbk) {
1424  3 5 ? 0 -
1425  100.0 0.0 0.0 0.0 1.7 98.3
1426  0
1427 }
1428 
1429 set tbs(kqrnk) {
1430  3 5 ? 0 -
1431  100.0 0.0 0.0 0.0 1.4 98.6
1432  0
1433 }
1434 
1435 set tbs(kqrpk) {
1436  26 7 ? 0 -
1437  100.0 0.0 0.0 0.0 1.1 98.9
1438  0
1439 }
1440 
1441 set tbs(kqbbk) {
1442  3 6 ? 0 -
1443  100.0 0.0 0.0 0.0 5.0 95.0
1444  0
1445 }
1446 
1447 set tbs(kqbnk) {
1448  5 7 ? 0 -
1449  100.0 0.0 0.0 0.0 1.1 98.9
1450  0
1451 }
1452 
1453 set tbs(kqbpk) {
1454  31 9 ? 0 -
1455  100.0 0.0 0.0 0.0 1.2 98.8
1456  0
1457 }
1458 
1459 set tbs(kqnnk) {
1460  0 8 ? 0 -
1461  100.0 0.0 0.0 0.0 9.1 90.9
1462  0
1463 }
1464 
1465 set tbs(kqnpk) {
1466  10 9 ? 0 -
1467  100.0 0.0 0.0 0.0 1.0 99.0
1468  0
1469 }
1470 
1471 set tbs(kqppk) {
1472  64 9 ? 0 -
1473  100.0 0.0 0.0 0.0 0.7 99.3
1474 }
1475 
1476 set tbs(krrrk) {
1477  2 5 ? 0 -
1478  100.0 0.0 0.0 0.0 0.9 99.1
1479  0
1480 }
1481 
1482 set tbs(krrbk) {
1483  0 10 ? 0 -
1484  100.0 0.0 0.0 0.0 0.8 99.2
1485  0
1486 }
1487 
1488 set tbs(krrnk) {
1489  0 10 ? 0 -
1490  100.0 0.0 0.0 0.0 0.6 99.4
1491  0
1492 }
1493 
1494 set tbs(krrpk) {
1495  7 14 ? 0 -
1496  100.0 0.0 0.0 0.0 0.3 99.7
1497  0
1498 }
1499 
1500 set tbs(krbbk) {
1501  0 12 ? 0 -
1502  100.0 0.0 0.0 0.0 4.3 95.7
1503  0
1504 }
1505 
1506 set tbs(krbnk) {
1507  3 29 ? 0 -
1508  100.0 0.0 0.0 0.0 0.5 99.5
1509  0
1510 }
1511 
1512 set tbs(krbpk) {
1513  23 16 ? 0 -
1514  100.0 0.0 0.0 0.0 0.6 99.4
1515  0
1516 }
1517 
1518 set tbs(krnnk) {
1519  0 15 ? 0 -
1520  100.0 0.0 0.0 0.0 8.5 91.5
1521  0
1522 }
1523 
1524 set tbs(krnpk) {
1525  16 17 ? 0 -
1526  100.0 0.0 0.0 0.0 0.5 99.5
1527  0
1528 }
1529 
1530 set tbs(krppk) {
1531  119 15 {8/8/4k3/8/8/3P4/3P4/5R1K} 0 -
1532  100.0 0.0 0.0 0.0 0.2 98.8
1533  0
1534 }
1535 
1536 set tbs(kbbbk) {
1537  0 16 ? 0 -
1538  74.0 26.0 0.0 0.0 31.6 68.4
1539  0
1540 }
1541 
1542 set tbs(kbbnk) {
1543  3 33 ? 0 -
1544  100.0 0.0 0.0 0.0 4.1 95.9
1545  0
1546 }
1547 
1548 set tbs(kbbpk) {
1549  5 30 ? 0 -
1550  98.3 1.7 0.0 0.0 6.8 93.2
1551  0
1552 }
1553 
1554 set tbs(kbnnk) {
1555  0 34 ? 0 -
1556  100.0 0.0 0.0 0.0 8.4 91.6
1557  0
1558 }
1559 
1560 set tbs(kbnpk) {
1561  26 33 ? 0 -
1562  100.0 0.0 0.0 0.0 0.8 99.2
1563  0
1564 }
1565 
1566 set tbs(kbppk) {
1567  100 25 ? 0 -
1568  99.8 0.2 0.0 0.0 1.3 98.7
1569  6 6 {
1570  8/B1k5/K7/P7/P7/8/8/8 K7/8/1k6/1P6/BP6/8/8/8 K7/8/Bk6/1P6/1P6/8/8/8
1571  KBk5/P1P5/8/8/8/8/8/8 kB6/8/1PK5/1P6/8/8/8/8 kB6/8/KP6/1P6/8/8/8/8
1572  } 0 {} 0 {}
1573 }
1574 
1575 set tbs(knnnk) {
1576  0 21 ? 0 -
1577  98.7 1.3 0.0 0.0 25.0 75.0
1578  0
1579 }
1580 
1581 set tbs(knnpk) {
1582  7 28 ? 0 -
1583  98.4 1.6 0.0 0.0 12.0 88.0
1584  0
1585 }
1586 
1587 set tbs(knppk) {
1588  96 32 ? 0 -
1589  100.0 0.0 0.0 0.0 1.0 99.0
1590  93 93 {} 0 {} 0 {}
1591 }
1592 
1593 set tbs(kpppk) {
1594  97 33 {7K/5k2/8/8/1P6/1P6/1P6/8} 0 -
1595  99.9 0.1 0.0 0.0 0.6 99.4
1596  11 11 {
1597  1k6/1P6/K7/P7/P7/8/8/8 1k6/1P6/K7/PP6/8/8/8/8 2k5/2P5/3K4/P7/P7/8/8/8
1598  8/1k6/1P6/KP6/1P6/8/8/8 8/8/1k6/1P6/KP6/1P6/8/8 8/8/8/1k1P4/8/PK6/P7/8
1599  8/8/8/1k6/1P6/KP6/1P6/8 8/K1k5/P1P5/P7/8/8/8/8 K1k5/2P5/P1P5/8/8/8/8/8
1600  K1k5/8/P1P5/P7/8/8/8/8 k7/8/KP6/PP6/8/8/8/8
1601  } 0 {} 0 {}
1602 }
1603 
1604 # End of file: tb.tcl
1605