diff -N -r -u -X .ignore gnugo-copy/config.vcin gnugo/config.vcin
|
old
|
new
|
|
| 30 | 30 | /* GAIN/LOSS codes. Disabled by default. */ |
| 31 | 31 | #define EXPERIMENTAL_OWL_EXT 0 |
| 32 | 32 | |
| | 33 | /* Disable unneeded things. 0 standard. */ |
| | 34 | #define FINAL_RELEASE 0 |
| | 35 | |
| 33 | 36 | /* Define as 1 to use the grid optimisation, or 2 to run it in self-test mode |
| 34 | 37 | */ |
| 35 | 38 | #define GRID_OPT 1 |
diff -N -r -u -X .ignore gnugo-copy/doc/dfa.texi gnugo/doc/dfa.texi
|
old
|
new
|
|
| 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. |
diff -N -r -u -X .ignore gnugo-copy/doc/dragon.texi gnugo/doc/dragon.texi
|
old
|
new
|
|
| 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()} in |
| 21 | | @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_status |
| | 276 | @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_eye |
| 347 | | |
| 348 | | The code for this type of amalgamation is in the routine |
| 349 | | @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 the |
| | 377 | 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 be |
| | 379 | @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 origin |
| | 622 | @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 size |
| | 631 | @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 size |
| | 636 | @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_status |
| | 645 | @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 status |
| | 652 | @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 origin |
| | 664 | @item @code{origin} |
| 653 | 665 | @quotation |
| 654 | 666 | The origin field is duplicated here. |
| 655 | 667 | @end quotation |
| 656 | | @item adjacent |
| 657 | 668 | @item @code{adjacent[MAX_NEIGHBOR_DRAGONS]} |
| 658 | | @cindex neighbor dragons |
| 659 | | @cindex adjacent dragons |
| 660 | | @findex find_neighbor_dragons |
| 661 | | @quotation |
| 662 | | 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 of |
| 665 | | these dragons. |
| 666 | | @end quotation |
| 667 | 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 of |
| 675 | | 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_size |
| 686 | | @item float moyo_territorial_value |
| | 683 | @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 safety |
| | 692 | @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 weakness |
| 711 | | @item weakness_pre_owl |
| | 708 | @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 genus |
| | 732 | @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 heye |
| | 750 | @item @code{heye} |
| 748 | 751 | @quotation |
| 749 | 752 | Location of a half eye attached to the dragon. |
| 750 | 753 | @end quotation |
| 751 | | @item lunch |
| | 754 | @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_status |
| 760 | | @item surround_size |
| | 762 | @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} attempts |
| | 799 | 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_point |
| | 830 | @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_code |
| | 835 | @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_certain |
| | 841 | @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_point |
| | 857 | @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_code |
| | 862 | @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_certain |
| | 868 | @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_point |
| | 874 | @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 |
diff -N -r -u -X .ignore gnugo-copy/doc/move_generation.texi gnugo/doc/move_generation.texi
|
old
|
new
|
|
| 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 this |
| 219 | | has not been implemented yet. One might also wish to list moves |
| 220 | | which increase the lead in a semeai race (removes ko threats) for use |
| 221 | | 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 finds |
| 233 | | 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 | |
diff -N -r -u -X .ignore gnugo-copy/doc/patterns.texi gnugo/doc/patterns.texi
|
old
|
new
|
|
| 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, such |
| 89 | | as its symmetry and its class. Optionally, a function called a |
| 90 | | ``helper'' can be provided to assist the matcher in deciding whether |
| 91 | | to accept move. Most patterns do not require a helper, and this field |
| 92 | | 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_function |
| | 97 | :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 of |
| 1185 | | type B, E or e. When such a function is found, the function |
| | 1183 | 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_spaces1 |
| 1190 | | @quotation |
| 1191 | | Find explicit connection patterns and amalgamate the involved dragons. |
| 1192 | | This goes through the connection database consulting only patterns |
| 1193 | | of type E (@pxref{Connections Database}). When such a function is found, the |
| 1194 | | function @code{cut_connect_callback} is invoked. |
| 1195 | | @end quotation |
| 1196 | | @item void modify_eye_spaces1(void) |
| 1197 | | @findex modify_eye_spaces1 |
| 1198 | | @quotation |
| 1199 | | Find explicit connection patterns and amalgamate the involved dragons. |
| 1200 | | This goes through the connection database consulting only patterns |
| 1201 | | of type e (@pxref{Connections Database}). When such a function is found, the |
| 1202 | | function @code{cut_connect_callback} is invoked. |
| 1203 | | @end quotation |
| 1204 | 1187 | @end itemize |
| 1205 | 1188 | |
| 1206 | 1189 | @node Tuning |
diff -N -r -u -X .ignore gnugo-copy/doc/reading.texi gnugo/doc/reading.texi
|
old
|
new
|
|
| 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{defend1}, @code{defend1} |
|