Ticket #180: draqo-doc.diff
| File draqo-doc.diff, 73.7 KB (added by arend, 3 years ago) |
|---|
-
doc/board.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/board.texi,v retrieving revision 1.15 diff -u -p -r1.15 board.texi
71 71 @group 72 72 73 73 int board_size; 74 Intersection board[ MAXSIZE];74 Intersection board[BOARDSIZE]; 75 75 int board_ko_pos; 76 76 77 77 float komi; 78 78 int white_captured; 79 79 int black_captured; 80 80 81 Hash_data hashdata;81 Hash_data board_hash; 82 82 @end group 83 83 @end example 84 84 85 The description of the @code{ Position} struct is applicable to these85 The description of the @code{board_state} struct is applicable to these 86 86 variables also, so we won't duplicate it here. All these variables are 87 87 globals for performance reasons. Behind these variables, there are a 88 88 number of other private data structures. These implement incremental 89 89 handling of strings, liberties and other properties 90 (@pxref{Incremental Board}). The variable @code{ hashdata} contains information90 (@pxref{Incremental Board}). The variable @code{board_hash} contains information 91 91 about the hash value for the current position (@pxref{Hashing}). 92 92 93 93 These variables should never be manipulated directly, since they are … … 181 181 #define NS (MAX_BOARD + 1) 182 182 #define WE 1 183 183 #define SOUTH(pos) ((pos) + NS) 184 #define WEST(pos) ((pos) - 1)184 #define WEST(pos) ((pos) - WE) 185 185 #define NORTH(pos) ((pos) - NS) 186 #define EAST(pos) ((pos) + 1)186 #define EAST(pos) ((pos) + WE) 187 187 @end example 188 188 189 189 There are also shorthand macros @code{SW}, @code{NW}, @code{NE}, … … 209 209 often one computation is sufficient for 1D-coordinate where we would need 210 210 two with two 2D-coordinates: If we, for example, want to have the 211 211 coordinate of the upper right of @code{pos}, we can do this with 212 @code{N ORTH(EAST(pos))} instead of @code{(i+1, j-1)}.212 @code{NE(pos)} instead of @code{(i+1, j-1)}. 213 213 214 214 @strong{Important}: The 2D coordinate @code{(-1,-1)}, which is used for 215 215 pass and sometimes to indicate no point, maps to the 1D coordinate … … 240 240 a point on the board. 241 241 242 242 Often one wants to traverse the board, carrying out some function 243 at every vertex. Here are two possible ways of doing this: 244 245 @example 246 int m, n; 247 for (m = 0; m < board_size; m++) 248 for (n = 0; n < board_size; n++) @{ 249 do_something(POS(m, n)); 250 @} 251 @end example 252 253 Or: 243 at every vertex. Here are the best way of doing this (other 244 implemantations were tested and are slower on 19x19 board): 254 245 255 246 @example 256 247 int pos; … … 273 264 @item Number of stones in the string. 274 265 @item Origin of the string, i.e. a canonical reference point, defined 275 266 to be the stone with smallest 1D board coordinate. 276 @item A list of the stones in the string .267 @item A list of the stones in the string (linked in a cycle). 277 268 @item Number of liberties. 278 269 @item A list of the liberties. If there are too many liberties the list is 279 270 truncated. … … 281 272 @item A list of the neighbor strings. 282 273 @end itemize 283 274 284 The basic data structure is275 The basic data structures are 285 276 286 277 @example 287 278 struct string_data @{ … … 290 281 int origin; /* Coordinates of "origin", i.e. */ 291 282 /* "upper left" stone. */ 292 283 int liberties; /* Number of liberties. */ 293 int libs[MAX_LIBERTIES]; /* Coordinates of liberties. */294 284 int neighbors; /* Number of neighbor strings */ 295 int neighborlist[MAXCHAIN]; /* List of neighbor string numbers. */296 285 int mark; /* General purpose mark. */ 297 286 @}; 298 287 299 struct string_data string[MAX_STRINGS]; 288 struct string_liberties_data @{ 289 int list[MAX_LIBERTIES]; /* Coordinates of liberties. */ 290 @}; 291 292 struct string_neighbors_data @{ 293 int list[MAXCHAIN]; /* List of neighbor string numbers. */ 294 @}; 295 296 static struct string_data string[MAX_STRINGS]; 297 static struct string_liberties_data string_libs[MAX_STRINGS]; 298 static struct string_neighbors_data string_neighbors[MAX_STRINGS]; 300 299 @end example 301 300 302 It should be clear that almost all information is stored in the 303 @code{string} array. To get a mapping from the board coordinates to the 304 @code{string} array we have 301 It should be clear that almost all information is stored in these 302 arrays. They are splitted because of caching purposes - if one doesn't 303 need libs or neighbors, accessing string_data is faster, because @code{list} 304 arrays are quite big. 305 306 To get a mapping from the board coordinates to these arrays we have 305 307 306 308 @example 307 309 static int string_number[BOARDMAX]; 308 310 @end example 309 311 310 312 @noindent 311 which contains indices into the @code{string} array. This information is only313 which contains indices into these arrays. This information is only 312 314 valid at nonempty vertices, however, so it is necessary to first 313 315 verify that @code{board[pos] != EMPTY}. 314 316 315 The @code{string_data} structure does not include an array of the stone 316 coordinates. This information is stored in a separate array: 317 A string stones coordinates are stored in a separate array: 317 318 318 319 @example 319 320 static int next_stone[BOARDMAX]; … … 335 336 static int liberty_mark; 336 337 static int string_mark; 337 338 static int next_string; 338 static int strings_initialized = 0;339 339 @end example 340 340 341 341 The @code{ml} array and @code{liberty_mark} are used to "mark" liberties on … … 349 349 individual strings. 350 350 351 351 @code{next_string} gives the number of the next available entry in the 352 @code{string} array. Then @code{strings_initialized} is set to one when 353 all data structures are known to be up to date. Given an arbitrary board 354 position in the @samp{board} array, this is done by calling 355 @code{incremental_board_init()}. It is not necessary to call this 356 function explicitly since any other function that needs the information 357 does this if it has not been done. 352 @code{string} array. 353 354 To initialize all the structures of the incremental board one need to 355 call @code{new_position} function, which builds all information based 356 on the actual state of the board (in @code{board} variable). 358 357 359 358 The interesting part of the code is the incremental update of the data 360 359 structures when a stone is played and subsequently removed. To 361 360 understand the strategies involved in adding a stone it is necessary 362 361 to first know how undoing a move works. The idea is that as soon as 363 some piece of information is about to be changed, the old value is 364 pushed onto a stack which stores the value and its address. The stack 365 is built from the following structures: 362 some piece of information is about to be changed, the old value (or 363 an intersection state) is pushed onto a stack which stores the value 364 and its address. The stack is built from the following structures (we 365 have two stacks really, because Intersection can have different type 366 than int): 366 367 367 368 @example 368 369 struct change_stack_entry @{ … … 370 371 int value; 371 372 @}; 372 373 373 struct change_stack_entry change_stack[STACK_SIZE]; 374 int change_stack_index; 374 struct vertex_stack_entry @{ 375 Intersection *address; 376 int value; 377 @}; 378 379 static struct change_stack_entry change_stack[STACK_SIZE]; 380 static struct change_stack_entry *change_stack_pointer; 381 382 static struct vertex_stack_entry vertex_stack[STACK_SIZE]; 383 static struct vertex_stack_entry *vertex_stack_pointer; 375 384 @end example 376 385 377 386 @noindent 378 387 and manipulated with the macros 379 388 380 389 @example 390 CLEAR_STACKS() 381 391 BEGIN_CHANGE_RECORD() 382 392 PUSH_VALUE(v) 393 PUSH_VERTEX(v) 383 394 POP_MOVE() 384 395 @end example 385 396 386 397 Calling @code{BEGIN_CHANGE_RECORD()} stores a null pointer in the address 387 398 field to indicate the start of changes for a new move. As mentioned 388 earlier @code{PUSH_VALUE()} stores a value and its corresponding address. 399 earlier @code{PUSH_VALUE()} and @code{PUSH_VERTEX()} stores a value and its 400 corresponding address. 389 401 Assuming that all changed information has been duly pushed onto the 390 402 stack, undoing the move is only a matter of calling @code{POP_MOVE()}, 391 403 which simply assigns the values to the addresses in the reverse order 392 until the null pointer is reached. This description is slightly 393 simplified because this stack can only store 'int' values and we need 394 to also store changes to the board. Thus we have two parallel stacks 395 where one stores @code{int} values and the other one stores 396 @code{Intersection} values. 404 until the null pointer is reached. 397 405 398 406 When a new stone is played on the board, first captured opponent 399 407 strings, if any, are removed. In this step we have to push the board … … 438 446 The often used construction 439 447 440 448 @example 441 pos = FIRST_STONE(s); 449 first_stone = FIRST_STONE(s); 450 pos = first_stone; 442 451 do @{ 443 452 ... 444 453 pos = NEXT_STONE(pos); 445 @} while ( !BACK_TO_FIRST_STONE(s, pos));454 @} while (pos != first_stone); 446 455 @end example 447 456 448 457 @noindent 449 458 traverses the stones of the string with number @samp{s} exactly once, 450 459 with @code{pos} holding the coordinates. In general @code{pos} is 451 460 used as board coordinate and @samp{s} as an index into the 452 @code{string} array or sometimes a pointer to an entry in the 453 @code{string} array. 461 @code{string}, @code{string_libs} or @code{string_neighbors} array. 454 462 455 463 @node Some Board Functions 456 464 @section Some Board Functions … … 489 497 the komaster scheme (@pxref{Ko}). 490 498 491 499 @itemize @bullet 492 @item @code{int trymove(int pos, int color, const char *message )}500 @item @code{int trymove(int pos, int color, const char *message, int str)} 493 501 @findex trymove 494 502 @quotation 495 503 Returns true if @code{(pos)} is a legal move for @code{color}. In that … … 498 506 with @option{--decide-string} or with @option{-o}), the string 499 507 @code{*message} will be inserted in the SGF file as a comment. The 500 508 comment will also refer to the string at @code{str} if this is not 501 @code{0}. The value of @code{str} can be NO_MOVE if it is not needed but 502 otherwise the location of @code{str} is included in the comment. 509 @code{NO_MOVE}. The value of @code{str} can be @code{NO_MOVE} if it is 510 not needed but otherwise the location of @code{str} is included in the 511 comment. @strong{NOTE}: including str in comment isn't implemented for 512 now 503 513 @end quotation 504 514 @item @code{int tryko(int pos, int color, const char *message)} 505 515 @findex tryko -
doc/dfa.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/dfa.texi,v retrieving revision 1.7 diff -u -p -r1.7 dfa.texi
1 1 In this chapter, we describe the principles of the GNU Go DFA 2 2 pattern matcher. The aim of this system is to permit a fast 3 pattern matching when it becomes time critical like in owl 4 module (@ref{The Owl Code}). Since GNU Go 3.2, this is enabled 3 pattern matching. Since GNU Go 3.2, this is enabled 5 4 by default. You can still get back the traditional pattern matcher 6 5 by running @command{configure --disable-dfa} and then recompiling 7 6 GNU Go. -
doc/dragon.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/dragon.texi,v retrieving revision 1.19 diff -u -p -r1.19 dragon.texi
17 17 Later routines called by @code{genmove()} will then have access to this 18 18 information. This document attempts to explain the philosophy and 19 19 algorithms of this preliminary analysis, which is carried out by the 20 two routines @code{make_worm ()} and @code{make_dragon()} in21 @ file{dragon.c}.20 two routines @code{make_worms()} (in @file{worm.c}) and 21 @code{make_dragons()} (in @file{dragon.c}). 22 22 23 23 @cindex dragon 24 24 @cindex worm … … 83 83 int unconditional_status; 84 84 int attack_points[MAX_TACTICAL_POINTS]; 85 85 int attack_codes[MAX_TACTICAL_POINTS]; 86 int discarded_attacks[MAX_TACTICAL_POINTS]; 86 87 int defense_points[MAX_TACTICAL_POINTS]; 87 88 int defend_codes[MAX_TACTICAL_POINTS]; 89 int discarded_defenses[MAX_TACTICAL_POINTS]; 88 90 int attack_threat_points[MAX_TACTICAL_POINTS]; 89 int attack_threat_codes[MAX_TACTICAL_POINTS]; 91 int attack_threat_codes[MAX_TACTICAL_POINTS]; 92 int discarded_att_threats[MAX_TACTICAL_POINTS]; 90 93 int defense_threat_points[MAX_TACTICAL_POINTS]; 91 94 int defense_threat_codes[MAX_TACTICAL_POINTS]; 95 int discarded_def_threats[MAX_TACTICAL_POINTS]; 92 96 @}; 93 97 @end example 94 98 … … 109 113 other worm. Intersections that are shared are counted with equal 110 114 fractional values for each worm. This measures the direct territorial 111 115 value of capturing a worm. @dfn{effective_size} is a floating point number. 112 Only intersections at a distance of 4 or less are counted. 116 Only intersections at a distance (empty vertices between a worm and an 117 intersection) of 5 or less are counted. 113 118 @end quotation 114 119 @item @code{origin} 115 120 @quotation … … 220 225 @end quotation 221 226 @item @code{cutstone2} 222 227 @quotation 223 Cutting points are identified by the patterns in the connections 224 database. Proper cuts are handled by the fact that attacking and 228 Number of potential cuts involving the worm. Cutting points are 229 identified by the patterns in the connections database. Proper 230 cuts are handled by the fact that attacking and 225 231 defending moves also count as moves cutting or connecting the 226 232 surrounding dragons. The @code{cutstone2} field is set during 227 233 @code{find_cuts()}, called from @code{make_domains()}. … … 248 254 opposite color can be killed. More precisely an 249 255 @dfn{inessential string} is a string S of genus zero, 250 256 not adjacent to any opponent string which can be easily 251 captured, and which has no edge liberties or second 257 captured, which is not cutstone, and which has up to 258 2 edge liberties and no second 252 259 order liberties, and which satisfies the following 253 260 further property: If the string is removed from the 254 261 board, then the remaining cavity only borders worms of the … … 266 273 even if the opponent is allowed an arbitrary number of consecutive 267 274 moves. 268 275 @end quotation 269 @item unconditional_status276 @item @code{unconditional_status} 270 277 @quotation 271 278 Unconditional status is also set by the function 272 279 @code{unconditional_life}. This is set @code{ALIVE} for stones which are … … 285 292 transformed into an invincible group by some number of consecutive 286 293 moves. Well, this is not entirely true because there is a rare class of 287 294 seki groups not satisfying this condition. Exactly which these are is 288 left as an exercise for the reader. Currently @code{unconditional_life}, 289 which strictly follows the definitions above, calls such seki groups 290 unconditionally dead, which of course is a misfeature. It is possible to 291 avoid this problem by making the algorithm slightly more complex, but 292 this is left for a later revision. 295 shown in a comment in @file{unconditional.c}. 293 296 @end quotation 294 @item @code{int attack_points[MAX_TACTICAL_POINTS] }295 @item @code{ attack_codes[MAX_TACTICAL_POINTS]}297 @item @code{int attack_points[MAX_TACTICAL_POINTS];} 298 @item @code{int attack_codes[MAX_TACTICAL_POINTS];} 296 299 @item @code{int defense_points[MAX_TACTICAL_POINTS];} 297 300 @item @code{int defend_codes[MAX_TACTICAL_POINTS];} 298 301 @quotation … … 310 313 @quotation 311 314 These are points that threaten to attack or defend a worm. 312 315 @end quotation 316 @item @code{int discarded_attacks[MAX_TACTICAL_POINTS];} 317 @item @code{int discarded_defenses[MAX_TACTICAL_POINTS];} 318 @item @code{int discarded_att_threats[MAX_TACTICAL_POINTS];} 319 @item @code{int discarded_def_threats[MAX_TACTICAL_POINTS];} 320 @quotation 321 These are checked points that haven't led to any positive result. 322 Used to not check the same point more than once. 323 @end quotation 313 324 @end itemize 314 325 315 326 The function @code{makeworms()} will generate data for all worms. … … 343 354 XXX... 344 355 345 356 @end example 346 @findex dragon_eye347 348 The code for this type of amalgamation is in the routine349 @code{dragon_eye()}, discussed further in EYES.350 357 351 358 Next, we amalgamate strings which seem uncuttable. We amalgamate dragons 352 359 which either share two or more common liberties, or share one liberty … … 367 374 @section Connection 368 375 @cindex connections 369 376 370 The fields @code{black_eye.cut} and @code{white_eye.cut} are set where the377 The fields in @code{cutting_points} are set where the 371 378 opponent can cut, and this is done by the B (break) class patterns in 372 @file{conn.db}. There are two important uses for this field, which can be379 @file{conn.db}. There are two important uses for this table, which can be 373 380 accessed by the autohelper functions @code{xcut()} and @code{ocut()}. The 374 381 first use is to stop amalgamation in positions like 375 382 … … 534 541 int safety; 535 542 float weakness; 536 543 float weakness_pre_owl; 544 float strategic_size; 537 545 int escape_route; 538 546 struct eyevalue genus; 539 547 int heye; … … 541 549 int surround_status; 542 550 int surround_size; 543 551 int semeais; 544 int semeai_ margin_of_safety;552 int semeai_defense_code; 545 553 int semeai_defense_point; 546 int semeai_defense_certain; 554 int semeai_defense_certain; 555 int semeai_defense_target; 556 int semeai_attack_code; 547 557 int semeai_attack_point; 548 558 int semeai_attack_certain; 559 int semeai_attack_target; 549 560 int owl_threat_status; 550 561 int owl_status; 551 562 int owl_attack_point; 552 563 int owl_attack_code; 553 564 int owl_attack_certain; 565 int owl_attack_node_count; 554 566 int owl_second_attack_point; 555 567 int owl_defense_point; 556 568 int owl_defense_code; … … 607 619 @quotation 608 620 The dragon number, used as a key into the @code{dragon2} array. 609 621 @end quotation 610 @item origin622 @item @code{origin} 611 623 @cindex dragon origin 612 624 @quotation 613 625 The origin of the dragon is a unique particular vertex … … 616 628 copied to the dragon origins. Amalgamation of two dragons 617 629 amounts to changing the origin of one. 618 630 @end quotation 619 @item size631 @item @code{size} 620 632 @cindex dragon size 621 633 @quotation 622 634 The number of stones in the dragon. 623 635 @end quotation 624 @item effective size636 @item @code{effective size} 625 637 @cindex effective size 626 638 @quotation 627 639 The sum of the effective sizes of the constituent worms. … … 630 642 cardinality of the dragon plus the number of empty vertices which are 631 643 nearer this dragon than any other. 632 644 @end quotation 633 @item crude_status645 @item @code{crude_status} 634 646 @quotation 635 647 (ALIVE, DEAD, UNKNOWN, CRITICAL). An early measure of the life 636 648 potential of the dragon. It is computed before the owl code is 637 649 run and is superceded by the status as soon as that becomes 638 650 available. 639 651 @end quotation 640 @item status652 @item @code{status} 641 653 @cindex dragon status 642 654 @quotation 643 655 The dragon status is the best measure of the dragon's health. … … 649 661 Here are definitions of the fields in the @code{dragon2} array. 650 662 651 663 @itemize @bullet 652 @item origin664 @item @code{origin} 653 665 @quotation 654 666 The origin field is duplicated here. 655 667 @end quotation 656 @item adjacent657 668 @item @code{adjacent[MAX_NEIGHBOR_DRAGONS]} 658 @cindex neighbor dragons659 @cindex adjacent dragons660 @findex find_neighbor_dragons661 @quotation662 Dragons of either color near the given one are called @dfn{neighbors}.663 They are computed by the function @code{find_neighbor_dragons()}.664 The @code{dragon2.adjacent} array gives the dragon numbers of665 these dragons.666 @end quotation667 669 @item @code{neighbors} 668 670 @cindex neighbor dragons 669 671 @cindex adjacent dragons … … 671 673 @quotation 672 674 Dragons of either color near the given one are called @dfn{neighbors}. 673 675 They are computed by the function @code{find_neighbor_dragons()}. 674 The @code{ dragon2.adjacent} array gives the dragon numbers of675 these dragons .676 The @code{adjacent} array gives the dragon numbers of 677 these dragons and @code{neighbors} gives the number of them. 676 678 @end quotation 677 @item neighbors 678 @quotation 679 The number of neighbor dragons. 680 @end quotation 681 @item hostile_neighbors 679 @item @code{hostile_neighbors} 682 680 @quotation 683 681 The number of neighbor dragons of the opposite color. 684 682 @end quotation 685 @item moyo_size686 @item float moyo_territorial_value683 @item @code{moyo_size} 684 @item @code{moyo_territorial_value} 687 685 @findex compute_surrounding_moyo_sizes 688 686 @quotation 689 687 The function @code{compute_surrounding_moyo_sizes()} assigns … … 691 689 each dragon (@pxref{Territory and Moyo}). This is the 692 690 moyo size. They are recorded in these fields. 693 691 @end quotation 694 @item safety692 @item @code{safety} 695 693 @cindex dragon safety 696 694 @quotation 697 695 The dragon safety can take on one of the values … … 707 705 @item INESSENTIAL - the dragon is unimportant (e.g. nakade stones) and dead 708 706 @end itemize 709 707 @end quotation 710 @item weakness711 @item weakness_pre_owl708 @item @code{weakness} 709 @item @code{weakness_pre_owl} 712 710 @cindex dragon weakness 713 711 @cindex weakness 714 712 @quotation … … 717 715 dragons in greater need of safety. The field @code{weakness_pre_owl} 718 716 is a preliminary computation before the owl code is run. 719 717 @end quotation 720 @item escape_route 718 @item @code{strategic_size} 719 @cindex strategic_size 720 @quotation 721 An effective size including weakness of neighbors. 722 @end quotation 723 @item @code{escape_route} 721 724 @cindex dragon escape_route 722 725 @cindex escape_route 723 726 @findex compute_escape … … 726 729 in case it cannot make two eyes locally. Documentation 727 730 may be found in @ref{Escape}. 728 731 @end quotation 729 @item struct eyevalue genus732 @item @code{genus} 730 733 @cindex dragon genus 731 734 @cindex genus 732 735 @quotation … … 744 747 745 748 @end example 746 749 @end quotation 747 @item heye750 @item @code{heye} 748 751 @quotation 749 752 Location of a half eye attached to the dragon. 750 753 @end quotation 751 @item lunch754 @item @code{lunch} 752 755 @cindex dragon lunch 753 756 @cindex lunch 754 757 @quotation … … 756 759 can be captured. In contrast with worm lunches, a dragon 757 760 lunch must be able to defend itself. 758 761 @end quotation 759 @item surround_status760 @item surround_size762 @item @code{surround_status} 763 @item @code{surround_size} 761 764 @cindex surround_status 762 765 @cindex surround_size 763 766 @cindex surround … … 766 769 it is @dfn{surrounded}. See @ref{Surrounded Dragons} and 767 770 the comments in @file{surround.c} for more information about the 768 771 algorithm. Used in computing the escape_route, and also callable 769 from patterns (currently used by CB258).772 from patterns. 770 773 @end quotation 771 @item semeais 772 @item semeai_defense_point 773 @item semeai_defense_certain 774 @item semeai_attack_point 775 @item semeai_attack_certain 776 @cindex semeai 774 @item @code{semeais} 775 @item @code{semeai_defense_code} 776 @item @code{semeai_defense_point} 777 @item @code{semeai_defense_certain} 778 @item @code{semeai_defense_target} 779 @item @code{semeai_attack_code} 780 @item @code{semeai_attack_point} 781 @item @code{semeai_attack_certain} 782 @item @code{semeai_attack_target} 783 @cindex semeais 784 @cindex semeai_defense_code 777 785 @cindex semeai_defense_point 778 786 @cindex semeai_defense_certain 787 @cindex semeai_defense_target 788 @cindex semeai_attack_code 779 789 @cindex semeai_attack_point 780 790 @cindex semeai_attack_certain 791 @cindex semeai_attack_target 781 792 @quotation 782 793 If two dragons of opposite color both have the status CRITICAL 783 794 or DEAD they are in a @dfn{semeai} (capturing race), and their … … 785 796 @code{owl_analyze_semeai()} in @file{owl.c}, which attempts to 786 797 determine which is alive, which dead, or if the result is 787 798 seki, and whether it is important who moves first. The 788 function @ file{new_semeai()} in @file{semeai.c} attempts799 function @code{semeai()} in @file{semeai.c} attempts 789 800 to revise the statuses and to generate move reasons based 790 801 on these results. The field @code{dragon2.semeais} is nonzero 791 802 if the dragon is an element of a semeai, and equals the 792 803 number of semeais (seldom more than one). The semeai defense 793 804 and attack points are locations the defender or attacker 794 must move to win the semeai. The field @code{semeai_margin_of_safety} 795 is intended to indicate whether the semeai is close or not 796 but currently this field is not maintained. The fields 805 must move to win the semeai and the result code of these moves is 806 also stored. In @code{semeai_defense_target} and 807 @code{semeai_attack_target} an origin of an opponent dragon in 808 semeai, on which the move has impact, is stored. The fields 797 809 @code{semeai_defense_certain} and @code{semeai_attack_certain} 798 810 indicate that the semeai code was able to finish analysis 799 811 without running out of nodes. 800 812 @end quotation 801 @item owl_status 813 @item @code{owl_threat_status} 814 @quotation 815 Informs, whether the dragon has any defense or attack threats 816 (@code{CAN_THREATEN_ATTACK} or @code{CAN_THREATEN_DEFENSE}). 817 @end quotation 818 @item @code{owl_status} 802 819 @quotation 803 820 This is a classification similar to @code{dragon.crude_status}, but 804 821 based on the life and death reading in @file{owl.c}. … … 810 827 @code{owl_defend()} is run, and if it can be defended it 811 828 is classified as @code{CRITICAL}, and if not, as @code{DEAD}. 812 829 @end quotation 813 @item owl_attack_point830 @item @code{owl_attack_point} 814 831 @cindex owl_attack_point 815 832 @quotation 816 833 If the dragon can be attacked this is the point to attack the dragon. 817 834 @end quotation 818 @item owl_attack_code835 @item @code{owl_attack_code} 819 836 @cindex owl_attack_code 820 837 @quotation 821 The owl attack code, It can be WIN, KO_A, KO_B or 0 (@pxref{Return Codes}). 838 The owl attack code, It can be WIN, KO_A, GAIN, LOSS, 839 KO_B or 0 (@pxref{Return Codes}). 822 840 @end quotation 823 @item owl_attack_certain841 @item @code{owl_attack_certain} 824 842 @cindex owl_attack_certain 825 843 @quotation 826 844 The owl reading is able to finish analyzing the attack 827 845 without running out of nodes. 828 846 @end quotation 829 @item owl_second_attack_point 847 @item @code{owl_attack_node_count} 848 @cindex owl_attack_node_count 849 @quotation 850 Number of nodes used during analyze of attack move. 851 @end quotation 852 @item @code{owl_second_attack_point} 830 853 @cindex owl_second_attack_point 831 854 @quotation 832 855 A second attack point. 833 856 @end quotation 834 @item owl_defense_point857 @item @code{owl_defense_point} 835 858 @cindex owl_defense_point 836 859 @quotation 837 860 If the dragon can be defended, this is the place to play. 838 861 @end quotation 839 @item owl_defense_code862 @item @code{owl_defense_code} 840 863 @cindex owl_defense_code 841 864 @quotation 842 The owl defense code, It can be WIN, KO_A, KO_B or 0 (@pxref{Return Codes}). 865 The owl defense code, It can be WIN, KO_A, GAIN, LOSS, 866 KO_B or 0 (@pxref{Return Codes}). 843 867 @end quotation 844 @item owl_defense_certain868 @item @code{owl_defense_certain} 845 869 @cindex owl_defense_certain 846 870 @quotation 847 871 The owl code is able to finish analyzing the defense without 848 872 running out of nodes. 849 873 @end quotation 850 @item owl_second_defense_point874 @item @code{owl_second_defense_point} 851 875 @cindex owl_second_defense_point 852 876 @quotation 853 877 A second owl defense point. 854 878 @end quotation 879 @item @code{owl_attack_kworm} 880 @cindex owl_attack_kworm 881 @quotation 882 Position of a worm, which can be killed during attack on the dragon 883 (@code{owl_attack_code} has to be @code{GAIN}). 884 @end quotation 885 @item @code{owl_defense_kworm} 886 @cindex owl_defense_kworm 887 @quotation 888 Position of our worm (part of the dragon) abandoned during defense of 889 the dragon (@code{owl_defend_code} has to be @code{LOSS}). 890 @end quotation 855 891 @end itemize 856 892 857 893 @node Dragons in Color -
doc/install.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/install.texi,v retrieving revision 1.25 diff -u -p -r1.25 install.texi
130 130 @node Default Level 131 131 @subsection Default Level 132 132 133 GNU Go can play at different levels. Up to level 10 is 134 supported. At level 10 GNU Go is much more accurate but takes 135 an average of about 1.6 times longer to play than at level 8. 133 GNU Go can play at different levels. Level may be as high as you wish 134 but it will make GNU Go play slower (up to level 12 is recommended). At 135 level 10 GNU Go is much more accurate but takes an average of about 1.6 136 times longer to play than at level 8. 136 137 137 138 The level can be set at run time using the @option{--level} option. 138 139 If you don't set this, the default level will be used. You … … 146 147 @noindent 147 148 sets the default level to 9. If you omit this parameter, 148 149 the compiler sets the default level to 10. We recommend 149 using level 1 0unless you find it too slow. If you decide150 using level 12 unless you find it too slow. If you decide 150 151 you want to change the default you may rerun configure 151 152 and recompile the program. 152 153 … … 235 236 This is on by default. 236 237 @end itemize 237 238 239 There is one more option, which allows disabling of all unneeded 240 things in code - like stats, asserts, etc. It should be used only 241 to generate final release of the program and can be changed only 242 as configure option. 243 244 @itemize @bullet 245 @item @code{final-release} Disable unneeded things. 246 @end itemize 247 238 248 @node Windows and MS-DOS, Macintosh, Configure Options, Installation 239 249 @section Compiling GNU Go on Microsoft platforms 240 250 -
doc/move_generation.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/move_generation.texi,v retrieving revision 1.18 diff -u -p -r1.18 move_generation.texi
214 214 the simultaneous attack of one worm and the defense of another. As for 215 215 attack and defense moves, it's important that all moves which win a 216 216 semeai are found, so an informed choice can be made between them. 217 Semeai move reasons are set by the semeai module. 218 219 One might also wish to list moves which increase the lead in a semeai 220 race (removes ko threats) for use as secondary move reasons. Analogously, 221 if we are behind in the race. However this has not been implemented yet. 217 222 218 Semeai move reasons should be set by the semeai module. However this219 has not been implemented yet. One might also wish to list moves220 which increase the lead in a semeai race (removes ko threats) for use221 as secondary move reasons. Analogously if we are behind in the race.222 223 223 224 @node Making eyes 224 225 @subsection Making or destroying eyes … … 229 230 will be valued substantially higher if this is the case. As usual it's 230 231 important to find all moves that change the eye count. 231 232 232 (This is part of what eye_finder was doing. Currently it only finds233 one vital point for each unstable eye space.) 233 The eye module (@file{optics.c}) is handling this. It uses eyes patterns 234 database @file{patterns/eyes.db}. 234 235 235 236 @node Antisuji moves 236 237 @subsection Antisuji moves … … 247 248 territory move reason. That move reason is added by the @samp{e} 248 249 patterns in @file{patterns/patterns.db}. Similarly the @samp{E} patterns 249 250 attempt to generate or mitigate a moyo, which is a region of influence 250 not yet secure territory, yet valuable. Such a pattern sets the ``expand 251 moyo'' move reason. 251 not yet secure territory, yet valuable. There are also other patterns for 252 reducing territory, invasions and making bariers (to defend before 253 invasions) - they are in @file{patterns/influence.db} and 254 @file{patterns/barriers.db}. These patterns set the ``expand moyo'', 255 ``expand territory'' and ``invasion'' move reasons. They also have 256 influence on a move territorial valuation. 252 257 253 258 @node Owl attack and defense 254 259 @subsection Attacking and Defending Dragons … … 310 315 as explained for example in @emph{The Endgame} by Ogawa 311 316 and Davies. 312 317 313 Moves are valued with respect to four different criteria. These are 318 Moves are valued with respect to four different main criteria. These 319 are 314 320 315 321 @itemize @bullet 316 322 @item territorial value … … 362 368 * Minimum Value:: Minimum value 363 369 * Secondary Value:: Other, more indirect, gains from a move 364 370 * Threats and Followup Value:: Valuation of attack and defense threats 371 * Additional ko value:: Additional threat value for a ko fight 365 372 @end menu 366 373 367 374 @node Territorial value … … 384 391 385 392 @node Strategical value 386 393 @subsection Strategical Value 394 @findex estimate_strategical_value 387 395 388 396 Strategical defense or attack reasons are assigned to any move 389 397 which matches a pattern of type @samp{a} or @samp{d}. These are … … 394 402 to check its status or safety. This is done later, during 395 403 the valuation phase. 396 404 405 The whole algorithm is placed in @code{estimate_strategical_value}. 406 397 407 @node Shape factor 398 408 @subsection Shape Factor 399 409 … … 451 461 which we cannot legally take, then such a move becomes attractive as a ko 452 462 threat and the full followup value is taken into account. 453 463 464 @node Additional ko value 465 @subsection Additional ko value 466 467 Some moves give us additional threats and some give them to an opponent. 468 In such situations we should give some bonus or penalty for creating ko 469 threats. As for now only positive contribution is counted. 470 454 471 @node End Game 455 472 @section End Game 456 473 -
doc/patterns.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/patterns.texi,v retrieving revision 1.19 diff -u -p -r1.19 patterns.texi
85 85 Elements are not generated for @samp{?} markers, but they are not 86 86 completely ignored - see below. 87 87 88 The line beginning @samp{:} describes various attributes of the pattern, such89 as its symmetry and its class. Optionally, a function called a90 ``helper'' can be provided to assist the matcher in deciding whether91 to accept move. Most patterns do not require a helper, and this field92 is filled with NULL.93 94 88 @findex shapes_callback 95 89 The matcher in @file{matchpat.c} searches the board for places where this 96 90 layout appears on the board, and the callback function … … 100 94 After the pattern, there is some supplementary information in the format: 101 95 @example 102 96 103 :trfno, classification, [values], helper_function97 :trfno, attributes, [values], helper_function 104 98 105 99 @end example 106 100 … … 110 104 represents the axis of symmetry. (E.g. @samp{|} means symmetrical about a 111 105 vertical axis.) 112 106 107 @code{helper_function} is a function that can be provided to assist the matcher 108 in deciding whether to accept move. Most patterns do not require a helper, 109 and this field is filled with NULL. 110 113 111 The above pattern could equally well be written on the left edge: 114 112 115 113 @example … … 127 125 way, or for that matter, on the top or right edges, or in any 128 126 of the four corners. As a matter of convention all the edge patterns 129 127 in @file{patterns.db} are written on the bottom edge or in the lower left 130 corners. In the @file{patterns/} directory there is a program called 131 @code{transpat} which can rotate or otherwise transpose patterns. 132 This program is not built by default---if you think you need it, 133 @code{make transpat} in the @file{patterns/} directory and 134 consult the usage remarks at the beginning of @file{patterns/transpat.c}. 128 corners. 135 129 136 130 @node Pattern Classification 137 131 @section Pattern Attributes … … 415 409 need to remove the stones we placed from the reading stack. This is done 416 410 with the function @code{popgo()}. 417 411 412 IMPORTANT: The macro @code{OFFSET} is not used anymore, because it has 413 fixed coordinates and patterns can be now rotated randomly by DFA 414 optimizer. All helpers that require usage of this macro have to be moved 415 to autohelpers. 416 418 417 @node Autohelpers and Constraints 419 418 @section Autohelpers and Constraints 420 419 … … 566 565 The autohelper functions are translated into C code by the program in 567 566 @file{mkpat.c}. To see exactly how the functions are implemented, 568 567 consult the autohelper function definitions in that file. Autohelper 569 functions can be used in both constraint and action lines. 568 functions can be used in both constraint and action lines. Here is 569 a partial list of them: 570 570 571 571 @example 572 572 … … 1063 1063 1064 1064 The patterns in @file{conn.db} are used for helping @code{make_dragons()} 1065 1065 amalgamate worms into dragons and to some extent for modifying eye spaces. 1066 The patterns in this database use the classifications @samp{B} ,1067 @samp{C} , and @samp{e}. @samp{B} patterns are used for finding cutting points,1066 The patterns in this database use the classifications @samp{B} and 1067 @samp{C}. @samp{B} patterns are used for finding cutting points, 1068 1068 where amalgamation should not be performed, @samp{C} patterns are used for 1069 finding existing connections, over which amalgamation is to be done, and 1070 @samp{e} patterns are used for modifying eye spaces and reevaluating lunches. 1069 finding existing connections, over which amalgamation is to be done. 1071 1070 There are also some patterns without classification, which use action lines to 1072 1071 have an impact. These are matched together with the @samp{C} patterns. Further 1073 1072 details and examples can be found in @xref{Worms and Dragons}. … … 1181 1180 @findex find_connections 1182 1181 @quotation 1183 1182 Find explicit connection patterns and amalgamate the involved dragons. 1184 This goes through the connection database consulting patterns except those of1185 type B, E or e.When such a function is found, the function1183 This goes through the connection database consulting only patterns of type C. 1184 When such a function is found, the function 1186 1185 @code{cut_connect_callback} is invoked. 1187 1186 @end quotation 1188 @item void modify_eye_spaces1(void)1189 @findex modify_eye_spaces11190 @quotation1191 Find explicit connection patterns and amalgamate the involved dragons.1192 This goes through the connection database consulting only patterns1193 of type E (@pxref{Connections Database}). When such a function is found, the1194 function @code{cut_connect_callback} is invoked.1195 @end quotation1196 @item void modify_eye_spaces1(void)1197 @findex modify_eye_spaces11198 @quotation1199 Find explicit connection patterns and amalgamate the involved dragons.1200 This goes through the connection database consulting only patterns1201 of type e (@pxref{Connections Database}). When such a function is found, the1202 function @code{cut_connect_callback} is invoked.1203 @end quotation1204 1187 @end itemize 1205 1188 1206 1189 @node Tuning … … 1397 1380 @file{patterns.h}) by a standalone program @file{mkpat.c}, and the resulting 1398 1381 @file{.c} files are compiled and linked into the main GNU Go executable. 1399 1382 1383 IMPORTANT: After any change in patterns, which uses DFA pattern matching, one 1384 should optimize pattern databases, in which the changes was made. This is done 1385 by running a part of @file{optimize} script in @file{patterns} directory. Run 1386 only parts of this script, which refers to desired databases, because it takes 1387 a very long time to execute. 1388 1400 1389 Each pattern is compiled to a header, and a sequence of elements, 1401 1390 which are (notionally) checked sequentially at every position and 1402 1391 orientation of the board. These elements are relative to the pattern -
doc/reading.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/reading.texi,v retrieving revision 1.20 diff -u -p -r1.20 reading.texi
66 66 67 67 The function @code{do_attack} and @code{do_find_defense} are wrappers 68 68 themselves and call @code{attack1}, @code{attack2}, @code{attack3} or 69 @code{attack4} resp. @code{defend1}, @code{defend 1}, @code{defend1}70 or @code{defend 1} depending on the number of liberties.69 @code{attack4} resp. @code{defend1}, @code{defend2}, @code{defend3} 70 or @code{defend4} depending on the number of liberties. 71 71 72 72 These are fine-tuned to generate and try out the moves in an efficient 73 73 order. They generate a few moves themselves (mostly direct liberties … … 123 123 3 liberties are considered, but branching is inhibited, so fewer 124 124 variations are considered. 125 125 126 %@findex small_semeai127 %Currently the reading code does not try to defend a string by128 %attacking a boundary string with more than two liberties. Because129 %of this restriction, it can make oversights. A symptom of this is130 %two adjacent strings, each having three or four liberties, each131 %classified as @code{DEAD}. To resolve such situations, a function132 %@code{small_semeai()} (in @file{engine/semeai.c}) looks for such133 %pairs of strings and corrects their classification.134 135 126 The @code{backfill_depth} is a similar variable with a default 12. Below 136 127 this depth, GNU Go will try "backfilling" to capture stones. 137 128 For example in this situation: … … 173 164 be attacked, and if so, @code{*move} returns the attacking move, 174 165 unless @code{*movei} is a null pointer. (Use null pointers if 175 166 you are interested in the result of the attack but not the 176 attacking move itself.) Returns @code{WIN}, if the attack succeeds, 177 0 if it fails, and @code{KO_A} or @code{KO_B} if the result depends on ko 178 @ref{Return Codes}. 167 attacking move itself.) Returns a result code of the move 168 @xref{Return Codes}. 179 169 @end quotation 180 170 @findex find_defense 181 171 @item @code{find_defense(int str, int *move)} 182 172 @quotation 183 Attempts to find a move that will save the string at @code{str} . It184 returns true if such a move is found, with @code{*move}the location173 Attempts to find a move that will save the string at @code{str}, and if 174 so, @code{*move} returns the location 185 175 of the saving move (unless @code{*move} is a null pointer). It is not 186 176 checked that tenuki defends, so this may give an erroneous answer if 187 @code{!attack(str)}. Returns @code{KO_A} or @code{KO_B} if the188 result depends on ko@xref{Return Codes}.177 @code{!attack(str)}. Returns a result code of the move 178 @xref{Return Codes}. 189 179 @end quotation 190 180 @findex safe_move 191 181 @item @code{safe_move(int str, int color)} : 192 182 @quotation 193 183 The function @code{safe_move(str, color)} checks whether a move at 194 184 @code{str} is illegal or can immediately be captured. If @code{stackp==0} 195 the result is cached. If the move only can be captured by a ko, it's196 considered safe. This may or may not be a good convention.185 the result is cached. Returns a result code of an attack on the placed 186 stone. 197 187 @end quotation 198 188 @end itemize 199 189 … … 225 215 option @pxref{Invoking GNU Go}. 226 216 227 217 The hash table is created once and for all at the beginning of 228 the game by the function @code{ hashtable_new()}. Although hash218 the game by the function @code{reading_cache_init()}. Although hash 229 219 memory is thus allocated only once in the game, the table is 230 220 reinitialized at the beginning of each move by a call to 231 @code{ hashtable_clear()} from @code{genmove()}.221 @code{reading_cache_clear()} from @code{genmove()}. 232 222 233 223 @menu 234 224 * Hash Calculation:: Calculation of the hash value 235 225 * Hash Organization:: Organization of the hash table 236 * Hash Structures:: Structures in @file{hash.h}237 226 @end menu 238 227 239 228 @node Hash Calculation … … 249 238 @enumerate 250 239 @item First we define a @dfn{go position}. This positions consists of 251 240 @itemize @bullet 252 @item the actual board, i.e. the locations and colors of the stones 253 @item A @dfn{ko point}, if a ko is going on. The ko point is defined as241 @item the actual board, i.e. the locations and colors of the stones; 242 @item a @dfn{ko point}, if a ko is going on; the ko point is defined as 254 243 the empty point where the last single stone was situated before 255 244 it was captured. 256 245 @end itemize 257 246 247 In addition to that we include some more information into the hash code, 248 that describes stored analisys results: 249 @itemize @bullet 250 @item a @dfn{komaster} and @dfn{kom_pos}, @xref{Ko}, 251 @item an ID (an int between 0 and 255) of a function used to calculate 252 the results; 253 @item a target of analisys (up to two positions on a board); 254 @item sometimes some extra information used by various functions. 255 @end itemize 256 258 257 It is not necessary to specify the color to move (white or black) 259 258 as part of the position. The reason for this is that read results 260 259 are stored separately for the various reading functions such as 261 260 @code{attack3}, and it is implicit in the calling function which 262 261 player is to move. 263 262 264 @item For each location on the board we generate random numbers: 265 @itemize @bullet 266 @item A number which is used if there is a white stone on this location 267 @item A number which is used if there is a black stone on this location 268 @item A number which is used if there is a ko on this location 269 @end itemize 270 263 @item For each of the above information (excluding extra information) 264 we generate tables with random numbers for each: function, komaster 265 status or position on a board. 271 266 These random numbers are generated once at initialization time and 272 267 then used throughout the life time of the hash table. 273 268 274 269 @item The hash key for a position is the XOR of all the random numbers 275 which are applicable for the position (white stones, black stones, and 276 ko position). 270 which are applicable for the position. If extra information is needed 271 it is passed by a function as a hash code which is XORed into the 272 resulting hash key. 277 273 @end enumerate 278 274 279 275 @node Hash Organization 280 276 @subsection Organization of the hash table 281 277 282 The hash table consists of 3 parts:283 284 @cindex Hash node285 @cindex Read result286 287 @itemize @bullet288 @item An area which contains so called @dfn{Hash Nodes}. Each hash node289 contains:290 @itemize @minus291 @item A go position as defined above.292 @item A computed hash value for the position293 @item A pointer to Read Results (see below)294 @item A pointer to another hash node.295 @end itemize296 297 @item An area with so called Read Results. These are used to store298 which function was called in the go position, which string was299 under attack or to be defended, and the result of the reading.300 301 Each Read Result contains:302 @itemize @minus303 @item the function ID (an int between 0 and 255), the position of the304 string under attack and a depth value, which is used to305 determine how deep the search was when it was made, packed into306 one 32 bit integer.307 @item The result of the search (a numeric value) and a position to308 play to get the result packed into one 32 bit integer.309 @item A pointer to another Read Result.310 @end itemize311 312 @item An array of pointers to hash nodes. This is the hash table313 proper.314 315 @end itemize316 317 When the hash table is created, these 3 areas are allocated using318 @code{malloc()}. When the hash table is populated, all contents are taken319 from the Hash nodes and the Read results. No further allocation is320 done and when all nodes or results are used, the hash table is full.321 Nothing is deleted from the hash table except when it is totally322 emptied, at which point it can be used again as if newly initialized.323 324 @findex hashtable_search325 When a function wants to use the hash table, it looks up the current326 position using @code{hashtable_search()}. If the position doesn't already327 exist there, it can be entered using328 329 @findex hashtable_enter_position330 @code{hashtable_enter_position()}.331 332 @findex hashtable_enter_position333 Once the function has a pointer to the hash node containing a334 function, it can search for a result of a previous search using335 @code{hashnode_search()}. If a result is found, it can be used, and336 if not, a new result can be entered after a search using337 @findex hashnode_new_result338 @code{hashnode_new_result()}.339 340 Hash nodes which hash to the same position in the hash table341 (collisions) form a simple linked list. Read results for the same342 position, created by different functions and different attacked or343 defended strings also form a linked list.344 345 This is deemed sufficiently efficient for now, but the representation346 of collisions could be changed in the future. It is also not347 determined what the optimum sizes for the hash table, the number of348 positions and the number of results are.349 350 @node Hash Structures351 @subsection Hash Structures352 353 278 The basic hash structures are declared in @file{engine/hash.h} and 354 @file{engine/cache. c}279 @file{engine/cache.h} 355 280 356 @example 357 typedef struct hashposition_t @{ 358 Compacttype board[COMPACT_BOARD_SIZE]; 359 int ko_pos; 360 @} Hashposition; 361 @end example 362 363 Represents the board and optionally the location of a ko, 364 which is an illegal move. The player whose move is next 365 is not recorded. 281 The hash table consists of an array of pointers to hash entries and 282 variable that defines number of the entries. 366 283 367 284 @example 368 285 typedef struct @{ 369 Hashvalue hashval; 370 Hashposition hashpos; 371 @} Hash_data; 372 @end example 286 unsigned int num_entries; 287 Hashentry *entries; 288 @} Transposition_table; 373 289 374 Represents the return value of a function (@code{hashval}) and 375 the board state (@code{hashpos}). 376 377 @example 378 typedef struct read_result_t @{ 379 unsigned int data1; 380 unsigned int data2; 381 382 struct read_result_t *next; 383 @} Read_result; 290 Transposition_table ttable; 384 291 @end example 385 292 386 The data1 field packs into 32 bits the following fields: 387 388 @example 293 @cindex Hash entry 389 294 390 komaster: 2 bits (EMPTY, BLACK, WHITE, or GRAY) 391 kom_pos : 10 bits (allows MAX_BOARD up to 31) 392 routine : 4 bits (currently 10 different choices) 393 str1 : 10 bits 394 stackp : 5 bits 395 396 @end example 397 398 The data2 field packs into 32 bits the following fields: 295 The @dfn{Hash Entry} consists of two @dfn{Hash Nodes}. One is the 296 most reliable node and the second is the newest. The reliability is 297 computed based on cost of the function, which created a node and 298 depth of analysis for that node (the lower depth the more reliable 299 results). 399 300 400 301 @example 401 402 status : 2 bits (0 free, 1 open, 2 closed) 403 result1: 4 bits 404 result2: 4 bits 405 move : 10 bits 406 str2 : 10 bits 407 302 typedef struct @{ 303 Hashnode most_reliable; 304 Hashnode newest; 305 @} Hashentry; 408 306 @end example 409 307 410 The @code{komaster} and @code{(kom_pos)} field are 411 documented in @xref{Ko}. 308 @cindex Hash node 412 309 413 When a new result node is created, 'status' is set to 1 'open'. 414 This is then set to 2 'closed' when the result is entered. The main 415 use for this is to identify open result nodes when the hashtable is 416 partially cleared. Another potential use for this field is to 417 identify repeated positions in the reading, in particular local 418 double or triple kos. 310 Each hash node contains a computed hash value (as defined above) 311 and @dfn{Read Results}. 419 312 420 313 @example 421 typedef struct hashnode_t @{ 422 Hash_data key; 423 Read_result * results; 424 struct hashnode_t * next; 314 typedef struct @{ 315 Hash_data key; 316 HASHNODE_DATATYPE data; /* 32-bit value */ 425 317 @} Hashnode; 426 318 @end example 427 319 428 The hash table consists of hash nodes. Each hash node consists of 429 The hash value for the position it holds, the position itself and 430 the actual information which is purpose of the table from the start. 320 @cindex Read result 431 321 432 There is also a pointer to another hash node which is used when 433 the nodes are sorted into hash buckets (see below). 322 Read Results are used to store which function was called in the go 323 position, which string was under attack or to be defended, and the 324 result of the reading. The result is packed into one 32 bit integer. 325 Each Read Result contains: 326 @itemize @minus 327 @item a remaining (to the max depth) depth value, which is used to 328 determine how deep the search was when node was stored (5 bits); 329 @item the results of the search (two numeric values - 2 x 4 bits); 330 @item a cost of a function which stored the result (an arbitrary 331 numeric value) (4 bits); 332 @item a move to play to get the result (10 bits). 333 @end itemize 434 334 435 335 @example 436 typedef struct hashtable @{ 437 size_t hashtablesize; /* Number of hash buckets */ 438 Hashnode ** hashtable; /* Pointer to array of hashnode lists */ 336 #define hn_create_data(remaining_depth, value1, value2, move, cost) \ 337 ((((value1) & 0x0f) << 23) \ 338 | (((value2) & 0x0f) << 19) \ 339 | (((move) & 0x3ff) << 9) \ 340 | (((cost) & 0x0f) << 5) \ 341 | (((remaining_depth & 0x1f)/*<< 0*/))) 342 @end example 439 343 440 int num_nodes; /* Total number of hash nodes */ 441 Hashnode * all_nodes; /* Pointer to all allocated hash nodes. */ 442 int free_node; /* Index to next free node. */ 344 When the hash table is created, the hash entries are allocated using 345 @code{malloc()}. After that, no further allocation is 346 done and when all nodes or results are used, the hash table is full. 347 Nothing is deleted, instead nodes are replaced by newer or more 348 reliable nodes (when collision occurs). 443 349 444 int num_results; /* Total number of results */ 445 Read_result * all_results; /* Pointer to all allocated results. */ 446 int free_result; /* Index to next free result. */ 447 @} Hashtable; 448 @end example 350 @findex tt_get 351 When a function wants to use the hash table, it looks up the current 352 position using @code{tt_get()}. If the position doesn't already 353 exist there, it can be entered using 449 354 450 The hash table consists of three parts: 355 @findex tt_update 356 @code{tt_update()}. 451 357 452 @itemize @bullet 453 @item The hash table proper: a number of hash buckets with collisions 454 being handled by a linked list. 455 @item The hash nodes. These are allocated at creation time and are 456 never removed or reallocated in the current implementation. 457 @item The results of the searches. Since many different searches can 458 be done in the same position, there should be more of these than 459 hash nodes. 460 @end itemize 358 @findex tt_update 359 There are several macros which store the result and return it from 360 a searching functions. They are named @code{READ_RETURN0}, 361 @code{READ_RETURN}, @code{READ_RETURN_SEMEAI}, @code{READ_RETURN_CONN}, 362 @code{READ_RETURN_HASH} and @code{READ_RETURN2} and can be found in 363 @file{engine/cache.h}. 461 364 462 365 @node Persistent Cache 463 366 @section Persistent Reading Cache … … 475 378 Some calculations can be safely saved from move to move. If the 476 379 opponent's move is not close to our worm or dragon, we do not have to 477 380 reconsider the life or death of that group on the next move. So 478 the result is saved in a persistent cache. Persistent caches are used for381 the result is saved in a persistent cache. Persistent caches 479 382 are used in the engine for several types of read results. 480 383 481 384 @itemize @bullet … … 610 513 611 514 The rationale behind this rule is that in the case where there are 612 515 two kos on the board, the komaster cannot win both, and by becoming 613 komaster he has already chosen which ko he wants to win . But in the614 case of a nested ko, taking one ko is a precondition to taking the 615 other one, so we allow this.516 komaster he has already chosen which ko he wants to win (the same reasoning 517 applies to WEAK_KO rule). But in the case of a nested ko, taking one ko is 518 a precondition to taking the other one, so we allow this. 616 519 617 520 If the komaster's opponent takes a ko, then both players have taken one ko. In 618 521 this case @code{komaster} is set to @code{GRAY_BLACK} or @code{GRAY_WHITE} and … … 628 531 @itemize @bullet 629 532 @item 1. Komaster is EMPTY. 630 533 @itemize @minus 631 @item 1a .Unconditional ko capture is allowed.534 @item 1a) Unconditional ko capture is allowed. 632 535 @quotation 633 536 Komaster remains EMPTY if previous move was not a ko capture. 634 537 Komaster is set to WEAK_KO if previous move was a ko capture … … 642 545 @end itemize 643 546 @item 2. Komaster is O: 644 547 @itemize @minus 645 @item 2a) Only nested ko captures are allowed. Kom_pos is moved to the 646 new removed stone. 647 @item 2b) If komaster fills the ko at kom_pos then komaster reverts to 648 EMPTY. 548 @item 2a) Only nested ko captures are allowed. 549 @quotation 550 Kom_pos is moved to the new removed stone. 551 @end quotation 552 @item 2b) If the ko has been resolved in favor of the komaster (when the ko 553 is filled or kom_pos is no longer a ko because of some capture) then the 554 komaster reverts to EMPTY. 649 555 @end itemize 650 556 @item 3. Komaster is X: 557 @itemize @minus 558 @item 559 Play at kom_pos is not allowed if it is the ko recapture. Any other ko capture 560 is allowed. 651 561 @quotation 652 Play at kom_pos is not allowed. Any other ko capture 653 is allowed. If O takes another ko, komaster becomes GRAY_X. 562 If O takes another ko, komaster becomes GRAY_X. 654 563 @end quotation 564 @end itemize 655 565 @item 4. Komaster is GRAY_O or GRAY_X: 656 @quotation 657 Ko captures are not allowed. If the ko at kom_pos is 658 filled then the komaster reverts to EMPTY. 659 @end quotation 566 @itemize @minus 567 @item 568 Ko captures are not allowed. If the ko has been resolved in favor of 569 the komaster (when the ko is filled or kom_pos is no longer a ko because 570 of some capture) then the komaster reverts to EMPTY. 571 @end itemize 660 572 @item 5. Komaster is WEAK_KO: 661 573 @itemize @minus 662 574 @item 5a) After a non-ko move komaster reverts to EMPTY. 663 575 @item 5b) Unconditional ko capture is only allowed if it is nested ko capture. 664 576 @quotation 665 Komaster is changed to WEAK_X and kom_pos to the old value of 666 board_ko_pos. 577 Kom_pos is moved to the old value of board_ko_pos. 667 578 @end quotation 668 579 @item 5c) Conditional ko capture is allowed according to the rules of 1b. 669 580 @end itemize … … 801 712 The correct resolution is that H1 attacks L1 unconditionally while K2 802 713 defends it with ko (code @code{KO_A}). 803 714 804 After Black (X) takes the ko at K 3, white can do nothing715 After Black (X) takes the ko at K2, white can do nothing 805 716 but retake the ko conditionally, becoming komaster. B cannot 806 717 do much, but in one variation he plays at K4 and W takes 807 718 at H1. The following position results: … … 821 732 @end example 822 733 823 734 Now it is important the @samp{O} is no longer komaster. Were @samp{O} 824 still komaster, he could capture the ko at N3 and there would be735 still komaster, he couldn't capture the ko at N3 and there would be 825 736 no way to finish off B. 826 737 827 738 -
doc/using.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/using.texi,v retrieving revision 1.31 diff -u -p -r1.31 using.texi
496 496 Use Japanese Rules. This is the default unless you specify 497 497 @option{--enable-chinese-rules} as a configure option. 498 498 @end quotation 499 @item @option{--autolevel} 500 @quotation 501 Turns on level adjusting according to the left time. It doesn't apply to 502 GTP mode (which is turned on by GTP commands). 503 @end quotation 504 @item @option{--min-level @var{amount}} 505 @quotation 506 If the time is running out, sets the minimum level with which GNU Go 507 will play. If lower level is set with --level option, it sets 508 --min-level to that lower value too. Used only when --autolevel is 509 turned on. 510 @end quotation 511 @item @option{--max-level @var{amount}} 512 @quotation 513 If much time is left, sets the maximum level with which GNU Go will 514 play. If higher level is set with --level option, it sets --max-level 515 to that higher value too. Used only when --autolevel is turned on. 516 @end quotation 499 517 @item @option{--forbid-suicide} 500 518 @quotation 501 519 Do not allow suicide moves (playing a stone so that it ends up without … … 582 600 accuracy. For completeness, here they are. 583 601 584 602 @itemize @bullet 603 @item @option{--print-levels} 604 @quotation 605 Prints info about each level of play of GNU Go. 606 @end quotation 607 @end itemize 608 609 @itemize @bullet 585 610 @item @option{-D}, @option{--depth @var{depth}} 586 611 @cindex depth 587 612 @quotation … … 621 646 depth (default 13), GNU Go still tries to attack strings with only 622 647 3 liberties, but only tries one move at each node. 623 648 @end quotation 624 @item @option{--break_chain- cutoff@var{depth}}649 @item @option{--break_chain-depth @var{depth}} 625 650 @quotation 626 651 Set the @code{break_chain_depth}. Beyond this depth, GNU Go abandons 627 652 some attempts to defend groups by trying to capture part of the surrounding … … 643 668 Such tactics are tried below @code{superstring_depth} and this 644 669 command line option allows this parameter to be set. 645 670 @end quotation 671 @item @option{--semeai-node-limit @var{n}} 672 @quotation 673 If the number of variations exceeds this limit, Owl stops analyzing 674 semeai moves. Default 500. 675 @end quotation 646 676 @end itemize 647 677 648 678 The preceeding options are documented with the reading code … … 724 754 GNU Go. It causes both the traces and the output file (@option{-o}) to 725 755 be more informative. 726 756 @end quotation 757 @item @option{--limit-search @var{location}} 758 @quotation 759 Limits the area of allowed moves to a diamond with radius 6 with center 760 at @var{location}. 761 @end quotation 727 762 @item @option{-T}, @option{--printboard}: colored display of dragons. 728 763 @quotation 729 764 Use rxvt, xterm or Linux Console. (@pxref{Colored Display}) … … 732 767 @quotation 733 768 Print timing information to stderr. 734 769 @end quotation 770 @item @option{--showscore} 771 @quotation 772 Print scoring information to stderr. 773 @end quotation 735 774 @item @option{-E}, @option{--printeyes}: colored display of eye spaces 736 775 @quotation 737 776 Use rxvt, xterm or Linux Console. (@pxref{Colored Display}) … … 799 838 @quotation 800 839 Print statistics (for debugging purposes). 801 840 @end quotation 841 @item @option{--profile-patterns} 842 @quotation 843 Print statistics for pattern usage. 844 @end quotation 802 845 @item @option{-t}, @option{--trace} 803 846 @quotation 804 847 Print debugging information. Use twice for more detail. … … 919 962 The option @option{--capture-all-dead} requires the aftermath 920 963 code to finish capturing all dead stones. 921 964 @end quotation 965 @item @option{--play-out-aftermath} 966 @quotation 967 Forces playing of aftermath (see --score). 968 @end quotation 922 969 @end itemize 923 970 924 971 @subsection Experimental options -
doc/utils.texi
RCS file: /home/arend/Go/gnugo-rsync/gnugo/doc/utils.texi,v retrieving revision 1.19 diff -u -p -r1.19 utils.texi
35 35 @item @code{int does_attack(int move, int str)} 36 36 @findex does_attack 37 37 @quotation 38 returns true if the move at @code{move} attacks @code{str}. This means that it captures 39 the string, and that @code{str} is not already dead. 38 returns the result code for an attack on the string @code{'str'} by the move 39 @code{'move'}. However, if the move does not improve the attack result compared 40 to tenuki, 0 is returned. In particular if the string is already captured, 41 @code{does_attack()} always returns 0. 40 42 @end quotation 41 43 @item @code{int does_defend(int move, int str)} 42 44 @findex does_defend 43 45 @quotation 44 @code{does_defend(move, str)} returns true if the move at @code{move} 45 defends @code{str}. This means that it defends the string, and that 46 @code{str} can be captured if no defense is made. 46 returns the result code for a defense on the string @code{'str'} by the move 47 @code{'move'}. However, if the move does not improve the defense result compared 48 to tenuki, 0 is returned. If the string (str) can't be captured if no defense 49 is made, 0 is returned too. 47 50 @end quotation 48 51 @item @code{int somewhere(int color, int last_move, ...)} 49 52 @findex somewhere … … 514 517 @item @code{void dump_stack(void)} 515 518 @findex dump_stack 516 519 @quotation 517 for use under GDB prints the move stack. 520 For use under GDB prints the move stack. 521 @end quotation 522 @item @code{void dump_incremental_board(void)} 523 @findex dump_incremental_board 524 @quotation 525 Debug function. Dump all incremental board information. 518 526 @end quotation 519 527 @item @code{void add_stone(int pos, int color)} 520 528 @findex add_stone … … 588 596 different functions in this family. 589 597 590 598 @itemize @bullet 591 @item @code{int countlib(int str )}599 @item @code{int countlib(int str_pos)} 592 600 @findex countlib 593 601 @quotation 594 Count the number of liberties of the string at @code{ pos}. There595 must be a stone at this location.602 Count the number of liberties of the string at @code{str_pos}. @code{str_pos} 603 must not be empty. 596 604 @end quotation 597 @item @code{int findlib(int str , int maxlib, int *libs)}605 @item @code{int findlib(int str_pos, int maxlib, int *libs)} 598 606 @findex findlib 599 607 @quotation 600 Find the liberties of the string at @code{str}. This location must not be 601 empty. The locations of up to maxlib liberties are written into 602 @code{libs[]}. The full number of liberties is returned. If you want the 603 locations of all liberties, whatever their number, you should pass 604 @code{MAXLIBS} as the value for @code{maxlib} and allocate space for 605 @code{libs[]} accordingly. 608 Find the liberties of the string at @code{str_pos}. @code{str_pos} must not be 609 empty. The locations of up to maxlib liberties are written into @code{libs[]}. 610 The full number of liberties is returned. If you want the locations of all 611 liberties, whatever their number, you should pass @code{MAXLIBS} as the value 612 for @code{maxlib} and allocate space for @code{libs[]} accordingly. 606 613 @end quotation 607 614 @item @code{int fastlib(int pos, int color, int ignore_captures)} 608 615 @findex fastlib … … 652 659 Next we have some general utility functions. 653 660 654 661 @itemize @bullet 655 @item @code{int count_common_libs(int str1 , int str2)}662 @item @code{int count_common_libs(int str1_pos, int str2_pos)} 656 663 @findex count_common_libs 657 664 @quotation 658 665 Find the number of common liberties of the two strings. 659 666 @end quotation 660 @item @code{int find_common_libs(int str1 , int str2, int maxlib, int *libs)}667 @item @code{int find_common_libs(int str1_pos, int str2_pos, int maxlib, int *libs)} 661 668 @findex find_common_libs 662 669 @quotation 663 670 Find the common liberties of the two strings. The locations of up to … … 666 673 common liberties, whatever their number, you should pass @code{MAXLIBS} as the 667 674 value for @code{maxlib} and allocate space for @code{libs[]} accordingly. 668 675 @end quotation 669 @item @code{int have_common_lib(int str1 , int str2, int *lib)}676 @item @code{int have_common_lib(int str1_pos, int str2_pos, int *lib)} 670 677 @findex have_common_lib 671 678 @quotation 672 679 Determine whether two strings have at least one common liberty. 673 680 If they do and @code{lib != NULL}, one common liberty is returned in 674 681 @code{*lib}. 675 682 @end quotation 676 @item @code{int countstones(int str )}683 @item @code{int countstones(int str_pos)} 677 684 @findex countstones 678 685 @quotation 679 686 Report the number of stones in a string. 680 687 @end quotation 681 @item @code{int findstones(int str, int maxstones, int *stones)} 688 @item @code{int count_adjacent_stones(int str1_pos, int str2_pos, int maxstones)} 689 @findex count_adjacent_stones 690 @quotation 691 Counts how many stones in one string are directly adjacent to the second 692 string. A limit can be given in the @code{maxstones} parameter so that the 693 function returns immediately. 694 @end quotation 695 @item @code{int findstones(int str_pos, int maxstones, int *stones)} 682 696 @findex findstones 683 697 @quotation 684 Find the stones of the string at @code{str }. The location must not be685 empty. The locations of up to maxstones stones are written into 686 @code{stones[]}. The full number ofstones is returned.698 Find the stones of the string at @code{str_pos}. The locations of up 699 to maxstones stones are written into @code{stones[]}. The full number of 700 stones is returned. 687 701 @end quotation 688 @item @code{int chainlinks(int str, int adj[MAXCHAIN])}702 @item @code{int chainlinks(int str_pos, int adj[MAXCHAIN])} 689 703 @findex chainlinks 690 704 @quotation 691 705 This very useful function returns (in the @code{adj} array) the chains 692 surrounding the string at @code{str }. The number of chains is returned.706 surrounding the string at @code{str_pos}. The number of chains is returned. 693 707 @end quotation 694 @item @code{int chainlinks2(int str , int adj[MAXCHAIN], int lib)}708 @item @code{int chainlinks2(int str_pos, int adj[MAXCHAIN], int lib)} 695 709 @findex chainlinks2 696 710 @quotation 697 711 Returns (in @code{adj} array) those chains surrounding the string at 698 @code{str }, which has exactly @code{lib} liberties. The number of such chains712 @code{str_pos}, which has exactly @code{lib} liberties. The number of such chains 699 713 is returned. 700 714 @end quotation 701 @item @code{int chainlinks3(int str , int adj[MAXCHAIN], int lib)}715 @item @code{int chainlinks3(int str_pos, int adj[MAXCHAIN], int lib)} 702 716 @findex chainlinks3 703 717 @quotation 704 718 Returns (in @code{adj} array) the chains surrounding 705 the string at @code{str }, which have less or equal @code{lib} liberties.719 the string at @code{str_pos}, which have less or equal @code{lib} liberties. 706 720 The number of such chains is returned. 707 721 @end quotation 708 @item @code{int extended_chainlinks(int str , int adj[MAXCHAIN], int both_colors)}722 @item @code{int extended_chainlinks(int str_pos, int adj[MAXCHAIN], int both_colors)} 709 723 @findex extended_chainlinks 710 724 @quotation 711 725 Returns (in the @code{adj} array) the opponent strings being directly adjacent 712 to @code{str} or having a common liberty with @code{str}. The number of such713 strings is returned. If the both_colors parameter is true, also own strings726 to string at @code{str_pos} or having a common liberty with @code{str_nr}. The number 727 of such strings is returned. If the both_colors parameter is true, also own strings 714 728 sharing a liberty are returned. 715 729 @end quotation 716 @item @code{int find_origin(int str )}730 @item @code{int find_origin(int str_pos)} 717 731 @findex find_origin 718 732 @quotation 719 733 Find the origin of a string, i.e. the point with the smallest 1D board … … 727 741 i.e. whether it would get more than one liberty. This function 728 742 returns true also for the case of a suicide move. 729 743 @end quotation 730 @item @code{int liberty_of_string(int pos, int str )}744 @item @code{int liberty_of_string(int pos, int str_pos)} 731 745 @findex liberty_of_string 732 746 @quotation 733 Returns true if @code{pos} is a liberty of the string at @code{str}. 747 Returns true if @code{pos} is a liberty of the string at @code{str_pos}. Checks 748 whether pos is a liberty. 749 @end quotation 750 @item @code{int liberty_of_string2(int pos, int str_pos)} 751 @findex liberty_of_string2 752 @quotation 753 Returns true if @code{pos} is a liberty of the string at @code{str_pos}. 754 @code{str_pos} must be a liberty. 734 755 @end quotation 735 @item @code{int second_order_liberty_of_string(int pos, int str )}756 @item @code{int second_order_liberty_of_string(int pos, int str_pos)} 736 757 @findex second_order_liberty_of_string 737 758 @quotation 738 Returns true if @code{pos} is a second order liberty of the string at str. 759 Returns true if @code{pos} is a second order liberty of the string at 760 @code{str_pos}. 739 761 @end quotation 740 @item @code{int neighbor_of_string(int pos, int str)} 762 @item @code{int are_neighbors(int pos1, int pos2)} 763 @findex are_neighbors 764 @quotation 765 Returns true if the empty vertex or the string at @code{pos1} is 766 adjacent to the empty vertex or the string at @code{pos2}. 767 @end quotation 768 @item @code{int neighbor_of_string(int pos, int str_pos)} 741 769 @findex neighbor_of_string 742 770 @quotation 743 Returns true if @code{pos} is adjacent to the string at @code{str }.771 Returns true if @code{pos} is adjacent to the string at @code{str_pos}. 744 772 @end quotation 745 773 @item @code{int has_neighbor(int pos, int color)} 746 774 @findex has_neighbor 747 775 @quotation 748 Returns true if @code{pos} has a neighbor of @code{color}. 776 Returns true if @code{pos} has a neighbor of color @code{color}. 777 @end quotation 778 @item @code{int find_neighbor(int pos, int color)} 779 @findex find_neighbor 780 @quotation 781 If @code{pos} has exactly one neighbor of color @code{color} returns 782 position of this neighbor. Otherwise returns -1. 749 783 @end quotation 750 @item @code{int same_string(int str1 , int str2)}784 @item @code{int same_string(int str1_pos, int str2_pos)} 751 785 @findex same_string 752 786 @quotation 753 Returns true if @code{str1 } and @code{str2} belong to the same string.787 Returns true if @code{str1_pos} and @code{str2_pos} belong to the same string. 754 788 @end quotation 755 @item @code{int adjacent_strings(int str1 , int str2)}789 @item @code{int adjacent_strings(int str1_pos, int str2_pos)} 756 790 @findex adjacent_strings 757 791 @quotation 758 Returns true if the strings at @code{str1 } and @code{str2} are adjacent.792 Returns true if the strings at @code{str1_pos} and @code{str2_pos} are adjacent. 759 793 @end quotation 760 794 @item @code{int is_ko(int pos, int color, int *ko_pos)} 761 795 @findex is_ko … … 777 811 Return true if @code{pos} is either a stone, which if captured would give 778 812 ko, or if @code{pos} is an empty intersection adjacent to a ko stone. 779 813 @end quotation 814 @item @code{int is_superko_violation(int pos, int color, enum ko_rules type)} 815 @findex is_superko_violation 816 @quotation 817 Return true if a move by @code{color} at @code{pos} is a superko violation 818 according to the specified type of ko rules. This function does not 819 detect simple ko unless it's also a superko violation. 820 @end quotation 780 821 @item @code{int does_capture_something(int pos, int color)} 781 822 @findex does_capture_something 782 823 @quotation … … 797 838 Returns true if at least one move has been played at pos 798 839 at deeper than level @code{cutoff} in the reading tree. 799 840 @end quotation 841 @item @code{void get_move_from_stack(int k, int *move, int *color)} 842 @findex get_move_from_stack 843 @quotation 844 Retrieve a move from the move stack. 845 @end quotation 800 846 @item @code{int stones_on_board(int color)} 801 847 @findex stones_on_board 802 848 @quotation
