Ticket #180: draqo-doc.diff

File draqo-doc.diff, 73.7 kB (added by arend, 17 months 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
     
    7171@group 
    7272 
    7373int           board_size; 
    74 Intersection  board[MAXSIZE]; 
     74Intersection  board[BOARDSIZE]; 
    7575int           board_ko_pos; 
    7676 
    7777float         komi; 
    7878int           white_captured; 
    7979int           black_captured; 
    8080 
    81 Hash_data     hashdata; 
     81Hash_data     board_hash; 
    8282@end group 
    8383@end example 
    8484 
    85 The description of the @code{Position} struct is applicable to these 
     85The description of the @code{board_state} struct is applicable to these 
    8686variables also, so we won't duplicate it here.  All these variables are 
    8787globals for performance reasons.  Behind these variables, there are a 
    8888number of other private data structures.  These implement incremental 
    8989handling of strings, liberties and other properties  
    90 (@pxref{Incremental Board}). The variable @code{hashdata} contains information 
     90(@pxref{Incremental Board}). The variable @code{board_hash} contains information 
    9191about the hash value for the current position (@pxref{Hashing}). 
    9292 
    9393These variables should never be manipulated directly, since they are 
     
    181181#define NS           (MAX_BOARD + 1) 
    182182#define WE           1 
    183183#define SOUTH(pos)   ((pos) + NS) 
    184 #define WEST(pos)    ((pos) - 1) 
     184#define WEST(pos)    ((pos) - WE) 
    185185#define NORTH(pos)   ((pos) - NS) 
    186 #define EAST(pos)    ((pos) + 1) 
     186#define EAST(pos)    ((pos) + WE) 
    187187@end example 
    188188 
    189189There are also shorthand macros @code{SW}, @code{NW}, @code{NE}, 
     
    209209often one computation is sufficient for 1D-coordinate where we would need 
    210210two with two 2D-coordinates: If we, for example, want to have the 
    211211coordinate of the upper right of @code{pos}, we can do this with 
    212 @code{NORTH(EAST(pos))} instead of @code{(i+1, j-1)}. 
     212@code{NE(pos)} instead of @code{(i+1, j-1)}. 
    213213 
    214214@strong{Important}: The 2D coordinate @code{(-1,-1)}, which is used for 
    215215pass and sometimes to indicate no point, maps to the 1D coordinate 
     
    240240a point on the board.  
    241241 
    242242Often 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: 
     243at every vertex. Here are the best way of doing this (other 
     244implemantations were tested and are slower on 19x19 board): 
    254245 
    255246@example 
    256247  int pos; 
     
    273264@item Number of stones in the string. 
    274265@item Origin of the string, i.e. a canonical reference point, defined 
    275266to 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). 
    277268@item Number of liberties. 
    278269@item A list of the liberties. If there are too many liberties the list is 
    279270truncated. 
     
    281272@item A list of the neighbor strings. 
    282273@end itemize 
    283274 
    284 The basic data structure is 
     275The basic data structures are 
    285276 
    286277@example 
    287278struct string_data @{ 
     
    290281  int origin;                      /* Coordinates of "origin", i.e. */ 
    291282                                   /* "upper left" stone. */ 
    292283  int liberties;                   /* Number of liberties. */ 
    293   int libs[MAX_LIBERTIES];         /* Coordinates of liberties. */ 
    294284  int neighbors;                   /* Number of neighbor strings */ 
    295   int neighborlist[MAXCHAIN];      /* List of neighbor string numbers. */ 
    296285  int mark;                        /* General purpose mark. */ 
    297286@}; 
    298287 
    299 struct string_data string[MAX_STRINGS]; 
     288struct string_liberties_data @{ 
     289  int list[MAX_LIBERTIES];         /* Coordinates of liberties. */ 
     290@}; 
     291 
     292struct string_neighbors_data @{ 
     293  int list[MAXCHAIN];              /* List of neighbor string numbers. */ 
     294@}; 
     295 
     296static struct string_data string[MAX_STRINGS]; 
     297static struct string_liberties_data string_libs[MAX_STRINGS]; 
     298static struct string_neighbors_data string_neighbors[MAX_STRINGS]; 
    300299@end example 
    301300 
    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 
     301It should be clear that almost all information is stored in these 
     302arrays. They are splitted because of caching purposes - if one doesn't 
     303need libs or neighbors, accessing string_data is faster, because @code{list} 
     304arrays are quite big. 
     305 
     306To get a mapping from the board coordinates to these arrays we have 
    305307 
    306308@example 
    307309static int string_number[BOARDMAX]; 
    308310@end example 
    309311 
    310312@noindent 
    311 which contains indices into the @code{string} array. This information is only 
     313which contains indices into these arrays. This information is only 
    312314valid at nonempty vertices, however, so it is necessary to first 
    313315verify that @code{board[pos] != EMPTY}. 
    314316 
    315 The @code{string_data} structure does not include an array of the stone 
    316 coordinates. This information is stored in a separate array: 
     317A string stones coordinates are stored in a separate array: 
    317318 
    318319@example 
    319320static int next_stone[BOARDMAX]; 
     
    335336static int liberty_mark; 
    336337static int string_mark; 
    337338static int next_string; 
    338 static int strings_initialized = 0; 
    339339@end example 
    340340 
    341341The @code{ml} array and @code{liberty_mark} are used to "mark" liberties on 
     
    349349individual strings. 
    350350 
    351351@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 
     354To initialize all the structures of the incremental board one need to 
     355call @code{new_position} function, which builds all information based 
     356on the actual state of the board (in @code{board} variable). 
    358357 
    359358The interesting part of the code is the incremental update of the data 
    360359structures when a stone is played and subsequently removed. To 
    361360understand the strategies involved in adding a stone it is necessary 
    362361to 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: 
     362some piece of information is about to be changed, the old value (or 
     363an intersection state) is pushed onto a stack which stores the value 
     364and its address. The stack is built from the following structures (we 
     365have two stacks really, because Intersection can have different type 
     366than int): 
    366367 
    367368@example 
    368369struct change_stack_entry @{ 
     
    370371  int value; 
    371372@}; 
    372373 
    373 struct change_stack_entry change_stack[STACK_SIZE]; 
    374 int change_stack_index; 
     374struct vertex_stack_entry @{ 
     375  Intersection *address; 
     376  int value; 
     377@}; 
     378 
     379static struct change_stack_entry change_stack[STACK_SIZE]; 
     380static struct change_stack_entry *change_stack_pointer; 
     381 
     382static struct vertex_stack_entry vertex_stack[STACK_SIZE]; 
     383static struct vertex_stack_entry *vertex_stack_pointer; 
    375384@end example 
    376385 
    377386@noindent 
    378387and manipulated with the macros 
    379388 
    380389@example 
     390CLEAR_STACKS() 
    381391BEGIN_CHANGE_RECORD() 
    382392PUSH_VALUE(v) 
     393PUSH_VERTEX(v) 
    383394POP_MOVE() 
    384395@end example 
    385396 
    386397Calling @code{BEGIN_CHANGE_RECORD()} stores a null pointer in the address 
    387398field to indicate the start of changes for a new move. As mentioned 
    388 earlier @code{PUSH_VALUE()} stores a value and its corresponding address. 
     399earlier @code{PUSH_VALUE()} and @code{PUSH_VERTEX()} stores a value and its 
     400corresponding address. 
    389401Assuming that all changed information has been duly pushed onto the 
    390402stack, undoing the move is only a matter of calling @code{POP_MOVE()}, 
    391403which 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. 
     404until the null pointer is reached. 
    397405 
    398406When a new stone is played on the board, first captured opponent 
    399407strings, if any, are removed. In this step we have to push the board 
     
    438446The often used construction 
    439447 
    440448@example 
    441     pos = FIRST_STONE(s); 
     449    first_stone = FIRST_STONE(s); 
     450    pos = first_stone; 
    442451    do @{ 
    443452        ... 
    444453        pos = NEXT_STONE(pos); 
    445     @} while (!BACK_TO_FIRST_STONE(s, pos)); 
     454    @} while (pos != first_stone); 
    446455@end example 
    447456 
    448457@noindent 
    449458traverses the stones of the string with number @samp{s} exactly once, 
    450459with @code{pos} holding the coordinates. In general @code{pos} is 
    451460used 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. 
    454462 
    455463@node Some Board Functions 
    456464@section Some Board Functions 
     
    489497the komaster scheme (@pxref{Ko}). 
    490498 
    491499@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)} 
    493501@findex trymove 
    494502@quotation 
    495503Returns true if @code{(pos)} is a legal move for @code{color}. In that 
     
    498506with @option{--decide-string} or with @option{-o}), the string 
    499507@code{*message} will be inserted in the SGF file as a comment. The 
    500508comment 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 
     510not needed but otherwise the location of @code{str} is included in the 
     511comment. @strong{NOTE}: including str in comment isn't implemented for 
     512now 
    503513@end quotation 
    504514@item @code{int tryko(int pos, int color, const char *message)} 
    505515@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
     
    11In this chapter, we describe the principles of the GNU Go DFA 
    22pattern 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 
     3pattern matching. Since GNU Go 3.2, this is enabled 
    54by default. You can still get back the traditional pattern matcher 
    65by running @command{configure --disable-dfa} and then recompiling 
    76GNU 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
     
    1717Later routines called by @code{genmove()} will then have access to this 
    1818information. This document attempts to explain the philosophy and 
    1919algorithms 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}. 
     20two routines @code{make_worms()} (in @file{worm.c}) and 
     21@code{make_dragons()} (in @file{dragon.c}). 
    2222 
    2323@cindex dragon 
    2424@cindex worm 
     
    8383  int unconditional_status; 
    8484  int attack_points[MAX_TACTICAL_POINTS]; 
    8585  int attack_codes[MAX_TACTICAL_POINTS]; 
     86  int discarded_attacks[MAX_TACTICAL_POINTS]; 
    8687  int defense_points[MAX_TACTICAL_POINTS]; 
    8788  int defend_codes[MAX_TACTICAL_POINTS]; 
     89  int discarded_defenses[MAX_TACTICAL_POINTS]; 
    8890  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]; 
    9093  int defense_threat_points[MAX_TACTICAL_POINTS]; 
    9194  int defense_threat_codes[MAX_TACTICAL_POINTS]; 
     95  int discarded_def_threats[MAX_TACTICAL_POINTS]; 
    9296@}; 
    9397@end example 
    9498 
     
    109113other worm. Intersections that are shared are counted with equal 
    110114fractional values for each worm. This measures the direct territorial 
    111115value of capturing a worm. @dfn{effective_size} is a floating point number. 
    112 Only intersections at a distance of 4 or less are counted. 
     116Only intersections at a distance (empty vertices between a worm and an 
     117intersection) of 5 or less are counted. 
    113118@end quotation 
    114119@item @code{origin} 
    115120@quotation 
     
    220225@end quotation 
    221226@item @code{cutstone2}  
    222227@quotation 
    223 Cutting points are identified by the patterns in the connections 
    224 database. Proper cuts are handled by the fact that attacking and 
     228Number of potential cuts involving the worm. Cutting points are 
     229identified by the patterns in the connections database. Proper 
     230cuts are handled by the fact that attacking and 
    225231defending moves also count as moves cutting or connecting the 
    226232surrounding dragons.  The @code{cutstone2} field is set during  
    227233@code{find_cuts()}, called from @code{make_domains()}. 
     
    248254opposite color can be killed. More precisely an 
    249255@dfn{inessential string} is a string S of genus zero, 
    250256not adjacent to any opponent string which can be easily 
    251 captured, and which has no edge liberties or second 
     257captured, which is not cutstone, and which has up to 
     2582 edge liberties and no second 
    252259order liberties, and which satisfies the following 
    253260further property: If the string is removed from the 
    254261board, then the remaining cavity only borders worms of the 
     
    266273even if the opponent is allowed an arbitrary number of consecutive 
    267274moves. 
    268275@end quotation 
    269 @item unconditional_status 
     276@item @code{unconditional_status} 
    270277@quotation 
    271278Unconditional status is also set by the function 
    272279@code{unconditional_life}. This is set @code{ALIVE} for stones which are 
     
    285292transformed into an invincible group by some number of consecutive 
    286293moves. Well, this is not entirely true because there is a rare class of 
    287294seki 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. 
     295shown in a comment in @file{unconditional.c}. 
    293296@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];} 
    296299@item @code{int defense_points[MAX_TACTICAL_POINTS];} 
    297300@item @code{int defend_codes[MAX_TACTICAL_POINTS];} 
    298301@quotation 
     
    310313@quotation 
    311314These are points that threaten to attack or defend a worm. 
    312315@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 
     321These are checked points that haven't led to any positive result. 
     322Used to not check the same point more than once. 
     323@end quotation 
    313324@end itemize 
    314325 
    315326The function @code{makeworms()} will generate data for all worms. 
     
    343354XXX...        
    344355 
    345356@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. 
    350357 
    351358Next, we amalgamate strings which seem uncuttable. We amalgamate dragons 
    352359which either share two or more common liberties, or share one liberty 
     
    367374@section Connection 
    368375@cindex connections 
    369376 
    370 The fields @code{black_eye.cut} and @code{white_eye.cut} are set where the 
     377The fields in @code{cutting_points} are set where the 
    371378opponent 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 
    373380accessed by the autohelper functions @code{xcut()} and @code{ocut()}. The 
    374381first use is to stop amalgamation in positions like 
    375382 
     
    534541  int safety; 
    535542  float weakness; 
    536543  float weakness_pre_owl; 
     544  float strategic_size; 
    537545  int escape_route; 
    538546  struct eyevalue genus; 
    539547  int heye; 
     
    541549  int surround_status; 
    542550  int surround_size; 
    543551  int semeais; 
    544   int semeai_margin_of_safety; 
     552  int semeai_defense_code; 
    545553  int semeai_defense_point; 
    546   int semeai_defense_certain;   
     554  int semeai_defense_certain; 
     555  int semeai_defense_target; 
     556  int semeai_attack_code; 
    547557  int semeai_attack_point; 
    548558  int semeai_attack_certain; 
     559  int semeai_attack_target; 
    549560  int owl_threat_status; 
    550561  int owl_status; 
    551562  int owl_attack_point; 
    552563  int owl_attack_code; 
    553564  int owl_attack_certain; 
     565  int owl_attack_node_count; 
    554566  int owl_second_attack_point; 
    555567  int owl_defense_point; 
    556568  int owl_defense_code; 
     
    607619@quotation 
    608620The dragon number, used as a key into the @code{dragon2} array. 
    609621@end quotation 
    610 @item origin 
     622@item @code{origin} 
    611623@cindex dragon origin 
    612624@quotation 
    613625The origin of the dragon is a unique particular vertex 
     
    616628copied to the dragon origins. Amalgamation of two dragons 
    617629amounts to changing the origin of one. 
    618630@end quotation 
    619 @item size 
     631@item @code{size} 
    620632@cindex dragon size 
    621633@quotation 
    622634The number of stones in the dragon. 
    623635@end quotation 
    624 @item effective size 
     636@item @code{effective size} 
    625637@cindex effective size 
    626638@quotation 
    627639The sum of the effective sizes of the constituent worms. 
     
    630642cardinality of the dragon plus the number of empty vertices which are 
    631643nearer this dragon than any other. 
    632644@end quotation 
    633 @item crude_status 
     645@item @code{crude_status} 
    634646@quotation 
    635647(ALIVE, DEAD, UNKNOWN, CRITICAL). An early measure of the life 
    636648potential of the dragon. It is computed before the owl code is 
    637649run and is superceded by the status as soon as that becomes 
    638650available. 
    639651@end quotation 
    640 @item status 
     652@item @code{status} 
    641653@cindex dragon status 
    642654@quotation 
    643655The dragon status is the best measure of the dragon's health. 
     
    649661Here are definitions of the fields in the @code{dragon2} array. 
    650662 
    651663@itemize @bullet 
    652 @item origin 
     664@item @code{origin} 
    653665@quotation 
    654666The origin field is duplicated here. 
    655667@end quotation 
    656 @item adjacent 
    657668@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 
    667669@item @code{neighbors} 
    668670@cindex neighbor dragons 
    669671@cindex adjacent dragons 
     
    671673@quotation 
    672674Dragons of either color near the given one are called @dfn{neighbors}. 
    673675They are computed by the function @code{find_neighbor_dragons()}. 
    674 The @code{dragon2.adjacent} array gives the dragon numbers of 
    675 these dragons. 
     676The @code{adjacent} array gives the dragon numbers of 
     677these dragons and @code{neighbors} gives the number of them. 
    676678@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} 
    682680@quotation 
    683681The number of neighbor dragons of the opposite color. 
    684682@end quotation 
    685 @item moyo_size 
    686 @item float moyo_territorial_value 
     683@item @code{moyo_size} 
     684@item @code{moyo_territorial_value} 
    687685@findex compute_surrounding_moyo_sizes 
    688686@quotation 
    689687The function @code{compute_surrounding_moyo_sizes()} assigns 
     
    691689each dragon (@pxref{Territory and Moyo}). This is the  
    692690moyo size. They are recorded in these fields. 
    693691@end quotation 
    694 @item safety 
     692@item @code{safety} 
    695693@cindex dragon safety 
    696694@quotation 
    697695The dragon safety can take on one of the values 
     
    707705@item INESSENTIAL - the dragon is unimportant (e.g. nakade stones) and dead 
    708706@end itemize 
    709707@end quotation 
    710 @item weakness 
    711 @item weakness_pre_owl 
     708@item @code{weakness} 
     709@item @code{weakness_pre_owl} 
    712710@cindex dragon weakness 
    713711@cindex weakness 
    714712@quotation 
     
    717715dragons in greater need of safety. The field @code{weakness_pre_owl} 
    718716is a preliminary computation before the owl code is run. 
    719717@end quotation 
    720 @item escape_route 
     718@item @code{strategic_size} 
     719@cindex strategic_size 
     720@quotation 
     721An effective size including weakness of neighbors. 
     722@end quotation 
     723@item @code{escape_route} 
    721724@cindex dragon escape_route 
    722725@cindex escape_route 
    723726@findex compute_escape 
     
    726729in case it cannot make two eyes locally. Documentation 
    727730may be found in @ref{Escape}. 
    728731@end quotation 
    729 @item struct eyevalue genus 
     732@item @code{genus} 
    730733@cindex dragon genus 
    731734@cindex genus 
    732735@quotation 
     
    744747 
    745748@end example 
    746749@end quotation 
    747 @item heye 
     750@item @code{heye} 
    748751@quotation 
    749752Location of a half eye attached to the dragon. 
    750753@end quotation 
    751 @item lunch 
     754@item @code{lunch} 
    752755@cindex dragon lunch 
    753756@cindex lunch 
    754757@quotation 
     
    756759can be captured. In contrast with worm lunches, a dragon 
    757760lunch must be able to defend itself. 
    758761@end quotation 
    759 @item surround_status 
    760 @item surround_size 
     762@item @code{surround_status} 
     763@item @code{surround_size} 
    761764@cindex surround_status 
    762765@cindex surround_size 
    763766@cindex surround 
     
    766769it is @dfn{surrounded}. See @ref{Surrounded Dragons} and 
    767770the comments in @file{surround.c} for more information about the 
    768771algorithm.  Used in computing the escape_route, and also callable 
    769 from patterns (currently used by CB258) 
     772from patterns 
    770773@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 
    777785@cindex semeai_defense_point 
    778786@cindex semeai_defense_certain 
     787@cindex semeai_defense_target 
     788@cindex semeai_attack_code 
    779789@cindex semeai_attack_point 
    780790@cindex semeai_attack_certain 
     791@cindex semeai_attack_target 
    781792@quotation 
    782793If two dragons of opposite color both have the status CRITICAL 
    783794or DEAD they are in a @dfn{semeai} (capturing race), and their 
     
    785796@code{owl_analyze_semeai()} in @file{owl.c}, which attempts to 
    786797determine which is alive, which dead, or if the result is 
    787798seki, and whether it is important who moves first. The 
    788 function @file{new_semeai()} in @file{semeai.c} attempts 
     799function @code{semeai()} in @file{semeai.c} attempts 
    789800to revise the statuses and to generate move reasons based 
    790801on these results. The field @code{dragon2.semeais} is nonzero 
    791802if the dragon is an element of a semeai, and equals the 
    792803number of semeais (seldom more than one). The semeai defense 
    793804and 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 
     805must move to win the semeai and the result code of these moves is 
     806also stored. In @code{semeai_defense_target} and 
     807@code{semeai_attack_target} an origin of an opponent dragon in 
     808semeai, on which the move has impact, is stored. The fields 
    797809@code{semeai_defense_certain} and @code{semeai_attack_certain} 
    798810indicate that the semeai code was able to finish analysis 
    799811without running out of nodes. 
    800812@end quotation 
    801 @item owl_status 
     813@item @code{owl_threat_status} 
     814@quotation 
     815Informs, 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} 
    802819@quotation 
    803820This is a classification similar to @code{dragon.crude_status}, but 
    804821based on the life and death reading in @file{owl.c}. 
     
    810827@code{owl_defend()} is run, and if it can be defended it 
    811828is classified as @code{CRITICAL}, and if not, as @code{DEAD}. 
    812829@end quotation 
    813 @item owl_attack_point 
     830@item @code{owl_attack_point} 
    814831@cindex owl_attack_point 
    815832@quotation 
    816833If the dragon can be attacked this is the point to attack the dragon. 
    817834@end quotation 
    818 @item owl_attack_code 
     835@item @code{owl_attack_code} 
    819836@cindex owl_attack_code 
    820837@quotation 
    821 The owl attack code, It can be WIN, KO_A, KO_B or 0 (@pxref{Return Codes}). 
     838The owl attack code, It can be WIN, KO_A, GAIN, LOSS, 
     839KO_B or 0 (@pxref{Return Codes}). 
    822840@end quotation 
    823 @item owl_attack_certain 
     841@item @code{owl_attack_certain} 
    824842@cindex owl_attack_certain 
    825843@quotation 
    826844The owl reading is able to finish analyzing the attack 
    827845without running out of nodes. 
    828846@end quotation 
    829 @item owl_second_attack_point 
     847@item @code{owl_attack_node_count} 
     848@cindex owl_attack_node_count 
     849@quotation 
     850Number of nodes used during analyze of attack move. 
     851@end quotation 
     852@item @code{owl_second_attack_point} 
    830853@cindex owl_second_attack_point 
    831854@quotation 
    832855A second attack point. 
    833856@end quotation 
    834 @item owl_defense_point 
     857@item @code{owl_defense_point} 
    835858@cindex owl_defense_point