Next: Pattern Classification, Up: Patterns
Several pattern databases are in the patterns directory. This chapter
primarily discusses the patterns in patterns.db, patterns2.db,
and the pattern files hoshi.db etc. which are compiled from the SGF
files hoshi.sgf (see Joseki Compiler). There is no essential
difference between these files, except that the ones in patterns.db and
patterns2.db are hand written. They are concatenated before being
compiled by mkpat
into patterns.c. The purpose of the separate
file patterns2.db is that it is handy to move patterns into a new
directory in the course of organizing them. The patterns in patterns.db
are more disorganized, and are slowly being moved to patterns2.db.
During the execution of genmove()
, the patterns are matched in
shapes.c in order to find move reasons.
The same basic pattern format is used by attack.db, defense.db, conn.db, apats.db and dpats.db. However these patterns are used for different purposes. These databases are discussed in other parts of this documentation. The patterns in eyes.db are entirely different and are documented elsewhere (see Eyes).
The patterns described in the databases are ascii representations, of the form:
Pattern EB112
?X?.? jump under O.*oo O.... o.... ----- :8,ed,NULL
Here `O' marks a friendly stone, `X' marks an enemy stone, `.' marks an empty vertex, `*' marks O's next move, `o' marks a square either containing `O' or empty but not `X'. (The symbol `x', which does not appear in this pattern, means `X' or `.'.) Finally `?' Indicates a location where we don't care what is there, except that it cannot be off the edge of the board.
The line of `-''s along the bottom in this example is the edge of the board itself—this is an edge pattern. Corners can also be indicated. Elements are not generated for `?' markers, but they are not completely ignored - see below.
The line beginning `:' describes various attributes of the pattern, such as its symmetry and its class. Optionally, a function called a “helper” can be provided to assist the matcher in deciding whether to accept move. Most patterns do not require a helper, and this field is filled with NULL.
The matcher in matchpat.c searches the board for places where this
layout appears on the board, and the callback function
shapes_callback()
in shapes.c registers the appropriate move
reasons.
After the pattern, there is some supplementary information in the format:
:trfno, classification, [values], helper_function
Here trfno represents the number of transformations of the pattern to consider, usually `8' (no symmetry, for historical reasons), or one of `|', `\', `/', `-', `+', `X', where the line represents the axis of symmetry. (E.g. `|' means symmetrical about a vertical axis.)
The above pattern could equally well be written on the left edge:
|oOO? |...X |..*? |..o. |..o? :8,ed,NULL
The program mkpat
is capable of parsing patterns written this
way, or for that matter, on the top or right edges, or in any
of the four corners. As a matter of convention all the edge patterns
in patterns.db are written on the bottom edge or in the lower left
corners. In the patterns/ directory there is a program called
transpat
which can rotate or otherwise transpose patterns.
This program is not built by default—if you think you need it,
make transpat
in the patterns/ directory and
consult the usage remarks at the beginning of patterns/transpat.c.