# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# This is GNU Go, a Go program. Contact gnugo@gnu.org, or see       #
# http://www.gnu.org/software/gnugo/ for more information.          #
#                                                                   #
# Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,   #
# 2008 and 2009 by the Free Software Foundation.                    #
#                                                                   #
# This program is free software; you can redistribute it and/or     #
# modify it under the terms of the GNU General Public License       #
# as published by the Free Software Foundation - version 3,         #
# or (at your option) any later version.                            #
#                                                                   #
# This program is distributed in the hope that it will be           #
# useful, but WITHOUT ANY WARRANTY; without even the implied        #
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR           #
# PURPOSE.  See the GNU General Public License in file COPYING      #
# for more details.                                                 #
#                                                                   #
# You should have received a copy of the GNU General Public         #
# License along with this program; if not, write to the Free        #
# Software Foundation, Inc., 51 Franklin Street, Fifth Floor,       #
# Boston, MA 02111, USA                                             #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
#  The Endgame Pattern Database.
#
#  Further documentation may be found in the Texinfo documentation.
#
#  First there is a pattern title of the form: Pattern [string]. The
#  string is used for identifying the pattern while tuning or debugging.
#
#  Then a block of the following characters representing the pattern
#  itself.
#  
#  ?     : don't care
#  .     : empty
#  X     : your piece,
#  O     : my piece,
#  x     : your piece or empty
#  o     : my piece or empty
#  *     : my next move
#  -, |  : edge of board
#  +     : corner of board
#
#  If a pattern must not match at the edge of the board,
#  an extra row of ?'s in the pattern may be added. (This
#  will not add to the time taken to check the pattern.)
#
#################
#
#  After the pattern, some supplementary information in the format:
#
# :trfno, classification, [values], helper_function
#   
#  These and other aspects of the pattern database are documented
#  in the Texinfo documentation. 
#
#################
#
#  Any line beginning with #, or any part of a line following
#  whitespace is a comment. 
#
#  The patterns are classified into a number of different categories:
#  
#  EE    edge endgame
#  EF    edge followups
#  CE    center endgame
#  CF    center followups
#  EY    eye stealing/saving endgame
#
#  The patterns are grouped in the file by category. New patterns
#  should be added close to a similar pattern or at the end of the
#  category where it belongs. When a new pattern is added, the names
#  of later patterns in the category should usually not be changed.
#  This can be accomplished by introducing names like CC35b and so on.
#


######################################################################
#
# Edge endgame patterns
#
# These patterns need to be revised.
#
# Moves along the edge with small weights, intended to come into play
# in the endgame.
#
# These patterns are further subdivided into the following classes
#
# first line descents (except in corner)
# first line hanes (except in corner)
# first line pushes (except in corner)
# first line blocks (except in corner)
# first line corner moves
# miscellaneous first line moves
# second line descents
# second line hanes
# second line extensions
# second line clamps
# miscellaneous second line moves
# third line moves
#
######################################################################


attribute_map general

goal_elements none
# Several patterns here have a or d class, so we need these elements.
callback_data XOxo


# first line descents (except in corner)
########################################

Pattern EE1
# gf Removed terri(1) value because move might be inside own territory. (3.3.7)

?OOx      block on edge
..*x      1 point gote
----

:8,OXe

?ccx
ba*x
----

;marginal_eye(*) && proper_eye(a) && proper_eye(b) && !xplay_attack(*,c)


Pattern EE1a

?OOx      block on edge
..*x      2 point gote
----

:8,OXe,terri(2)

?ccx
ba*x
----

; marginal_eye(*) && proper_eye(a) && proper_eye(b)
; && xplay_attack(*,a,c) && !xplay_attack(*,c)


Pattern EE2

OXXx
xOOX      Start by backfilling
*..x      At least 1 point gote
----

:8,OX,terri(1)

OXXx
xbbX
*.ax
----

;xplay_attack(a,b)


Pattern EE2b

OXXx
*OOX      Start by backfilling
...x      At least 1 point gote
----

:8,OX,terri(1)

OXXx
*ddX
cbax
----

;marginal_eye(a) && proper_eye(b) && proper_eye(c) && xplay_attack(a,d)


Pattern EE2c

OXX?     Start by backfilling if block is unsafe
*OO?     At least 1 point gote
...?
----

:8,OX,terri(1)

OXX?
*OOb
..ac
----

;x_alive_somewhere(b,c) && oplay_attack(a,a) && !oplay_attack(*,?,a,a)


Pattern EE4

XOO.
.X*.            one point sente
----

:8,OXe,terri(1),followup(1)

XOO.
.X*.
----

;marginal_eye(*)


Pattern EE5

???
XO?       descend to edge
.*?       may quite possibly be 0 points gote
---

:8,OXe,terri(0.1)

eab
XOc
.*d
---

;o_somewhere(a,b,c,d,e)


Pattern EE6

.OOOXX
...*..
------

:8,OXe,terri(2)

.OOOXX
..a*bc
------

; proper_eye(a) && !oplay_attack(*,*) && oplay_attack(b,*,a,c,*,a)
; && xplay_attack(*,a,b,a)


Pattern EE7
# tm New Pattern (3.1.19)
#   s classification, in case of ko (see trevorc:180)
# pp Revised (3.3.18) the pattern to match on edge only.

?.X?
O.*.
----

:8,sOXe,terri(0.75)

?.X?
O.*a
----

;proper_eye(a) && safe_omove(*)


# first line hanes (except in corner)
#####################################

Pattern EE101

OOXX     endgame move
..*.     2 points gote
----

:8,OXe,terri(2)

OOXX
b.*a
----

;proper_eye(a) && proper_eye(b)


Pattern EE102

???X?        sente hane
OXX..        1 or 2 points sente
.*..?
-----

:8,OXe,terri(2),followup(7)

???X?
OAA..
.*..?
-----

;lib(A)==3


Pattern EE103

?OX?        one point gote (and a little extra)
?.*.
----

:8,OXe

?OX?
?.*a
----

;proper_eye(a)


Pattern EE104

?OX?        two points gote
..*.
----

:8,OXe

?OX?
b.*a
----

;proper_eye(a) && proper_eye(b)


#
# If both EE105 and EE106 match, it's a double sente situation.
# (followup and reverse followup probably bigger in reality.)
#

Pattern EE105

?OX..      three points sente
..*..
-----

:8,OXe

?OE..
bc*a.
-----

;proper_eye(a) && proper_eye(b) && oplay_attack_either(*,a,c,a,E)


Pattern EE106

..OX?      three points reverse sente
...*.
-----

:8,OXe,reverse_followup(6)

..dX?
.bc*a
-----

;proper_eye(a) && proper_eye(b) && xplay_attack_either(c,b,*,b,d)
;&& !xplay_attack(c,b,*,*)


Pattern EE107
#tm New Pattern (3.1.16)
#   see trevor:163
# FIXME: move this pattern to appropriate place

+--	very special corner position
|.*
|.O
|OX

:8,Oa

+--
|.*
|.O
|OB

; defend(B) && !oplay_defend(*,B) && safe_xmove(*)


Pattern EE108
# pp New pattern (see endgame:890) (3.5.1)

?OX?	    very small endgame move
O.*.
----

:8,OXes,value(0.5)

?OX?
Oa*b
----

; proper_eye(b) && oplay_attack(*,b,a,a) && oplay_defend(a,*,a)


Pattern EE109
# gf New pattern. (3.5.3)
# Generic hane, let the territorial evaluation determine its value.

OX        hane on first line
.*
--

:8,OXe


Pattern EE110
# gf New pattern. (3.5.3)
# Followup value obviously imprecise, usually an underestimation.

OX.O        followup to save dead stones
.*..
----

:8,Xe,followup(5)

aX.b
d*c.
----

;alive(a) && dead(b) && oplay_defend(*,c,d,b)


# first line pushes (except in corner)
######################################

Pattern EE201

?XX                     push on first line.
O*.                     one point gote (and a little extra)
---

:8,OXe,terri(1)     

?XX
O*a
---

;marginal_eye(*) && proper_eye(a) && max_eye_value(a) > 0


Pattern EE201b
# nando New pattern. (3.7.11)

?XX                     push deeper on first line.
O.*
---

:8,sOXe

?XX
Oa*
---

;marginal_eye(a) && proper_eye(*) && max_eye_value(*) > 0
;&& (safe_omove(*) || oplay_attack(*,a,a))

>if (!safe_omove(*)) known_safe_move(*)


Pattern EE202

OXX.           endgame move
.O*.           1 point reverse sente
----

:8,OXe,terri(1),reverse_followup(1)

OXX.
.O*a
----

;marginal_eye(*) && marginal_eye(a)


Pattern EE203

OXX.           1 point double sente
.O*.
----

:8,OXe,terri(1),reverse_followup(2)

ODDc
bO*a
----

;marginal_eye(*) && marginal_eye(a) && marginal_eye(c)
;&& (oplay_attack(*,a,b,a) || oplay_attack(*,a,b,D))


Pattern EE204

?X.        endgame move
O*.        2 points gote
---

:8,OXe,terri(2)

?Cb
O*a
---

;marginal_eye(*) && proper_eye(a)
;&& (!oplay_defend(*,a,b,a) || !oplay_defend(*,a,b,C))


Pattern EE205

X.X	at least 2 points, possibly more (followup)
O*.
---

:8,OXe,terri(2)

XaX
O*b
---

;marginal_eye(*) && proper_eye(a) && proper_eye(b)


Pattern EE206
# gf New pattern. (3.1.20)

X.
O*
--

:8,OXe


# first line blocks (except in corner)
######################################

Pattern EE301

O.        endgame move
X*        1 points gote
--

:8,OXe,terri(1)

Oa
X*
--

;marginal_eye(*) && proper_eye(a) && oplay_attack(*,a,a)


Pattern EE302
# gf Revised constraint. (3.3.10)

O.        endgame move
X*        2 points reverse sente
--

:8,OXe,terri(2),reverse_followup(5)

ba
X*
--

;eye(*) && proper_eye(a) && oplay_defend_both(*,a,*,b)


Pattern EE303
# al1 Revised symmetry. (3.7.11)

OXO
.*.
---

:|,OXe,terri(2)


# first line corner moves
#########################

Pattern EE401
# gf Added n classification. (3.5.2)

|.O?        big endgame move
|.OX        at least 2 points gote
|.*x
+---

:8,nOXed,terri(2)


Pattern EE402
# May look risky, but if it is, the safe_move test will reject it.

|xxXO       big endgame move
|.XO.       at least 3 points reverse sente
|.*..
+----

:8,OXed,terri(3),reverse_followup(5)


Pattern EE403

|OX       endgame move
|.*       one point gote
+--

:8,OXe,terri(1)

|OX
|.*
+--

;marginal_eye(*)


Pattern EE404
# gf Revised constraint. (3.3.10)

|OX?       endgame move
|.*.       half point gote as sacrifice
+---

:8,sOXe,terri(0.5)

|OX?
|.*a
+---

;marginal_eye(*) && proper_eye(a)


Pattern EE404b
# gf New pattern. See nngs:1480. (3.3.7)

|.OX
|OX.       endgame move
|.*.       at least 1.5 points gote as sacrifice
+---

:8,sOXe,value(1.5)

|.OX
|OX.
|.*.
+---

;marginal_eye(*)


Pattern EE405
# gf Made main diagram consistent with constraint diagram. (3.1.18)
# gf Revised constraint. (3.3.10)

|XO?      endgame move
|.*.      one point gote
+---

:8,OXe,terri(1)

|XO?
|.*a
+---

;marginal_eye(*) && proper_eye(a)


Pattern EE406

|XO     endgame move
|.*     possibly only filling dame
+--

:8,OXe,terri(0.1)


Pattern EE407
# gf Increased value. (3.3.14)
# Give it a little more than 0.5 points in order to fill before capturing.

|OX?     fill ko at end of game
|*OX     1/2 point gote
+---

:8,X,terri(0.6)

|aX?
|*OX
+---

;!dead(a)


Pattern EE408
# gf Increased value. (3.3.14)
# Give it a little more than 0.5 points in order to fill before capturing.

|XO?     fill ko at end of game
|O*O     1/2 point gote
+---

:8,X,terri(0.6)

|Xa?
|O*O
+---

;!dead(a)


Pattern EE409

|OX?     take ko at end of game
|X*X     1/2 point
+---

:8,sO,terri(0.5)

|OA?
|X*X
+---

;!dead(A)


Pattern EE410

|XO?     take ko at end of game
|*XO     1/2 point
+---

:8,sO,terri(0.5)

|AO?
|*XO
+---

;!dead(A)


Pattern EE411

|*O     endgame ko
|XO     zero points sente or better
|.X
+--

:8,OX,terri(0.1),followup(0.5)


Pattern EE412

|.X     endgame ko
|OX     zero points reverse sente or better
|*O
+--

:8,OX,terri(0.1),reverse_followup(0.5)


Pattern EE413

|.X?    endgame ko
|OXO    1/2 point
|.O*
+---

:8,OX,terri(0.5)


Pattern EE414

|xX?        three points gote 
|*OX        plus possibly more for the eye in the corner
|.OX
|..O
+---

:8,OXed,terri(3)


Pattern EE415
# pp New pattern (3.3.18)
# Currently necessary (see trevorb:170, where N11 is otherwise rejected
# as "strategically or tactically unsafe) /ab

|*O?
|OXX
|.OX
+---

:8,X,terri(0.1),reverse_followup(2)

|*A?
|OXX
|.OX
+---

;alive(A)


Pattern EE416
# pp New pattern (3.3.18)

|.OO?
|..*X
+----

:8,OXe

|.aa?
|..*X
+----

;xplay_attack(*,a) && !oplay_attack(*,a)

>prevent_attack_threat(a)


# miscellaneous first line moves
################################

Pattern EE501
# gf Increased value. (3.3.14)
# Give it a little more than 0.5 points in order to fill before capturing.

?OX?     fill ko at end of game
O*OX     1/2 point gote
----

:8,X,terri(0.6)

?aX?
O*OX
----

;!dead(a)


Pattern EE502

?OX?     take ko at end of game
OX*X     1/2 point
----

:8,sO,terri(0.5)

?OA?
OX*X
----

;!dead(A)


Pattern EE504

...           jump on the edge
*.O
---

:8,Oe

...
*.O
---

;!omoyo(*)


# second line descents
######################

Pattern EE601
# gf Revised constraint to avoid cyclic redistribution. (3.5.1)

??O?         It's better to push down before blocking
.X*X
....
----

:8,OX,terri(3),followup(5)

??O?
aA*X
....
----

; oplay_attack(*,a,A) && !oplay_attack(a,*,A)

> replace(a,*)


# second line hanes
###################

# second line extensions
########################

Pattern EE801
# 1: not really gote and larger than 2.5 points
# 2: Well, without making the pattern more specific we should be
#    prepared that the x really is in place and that there is an X two
#    steps below * too. Then it is usually gote and about this size.
#    We certainly can and should add patterns to deal with the case
#    that there is more space below, when it very likely is sente,
#    unless such patterns already exist in the EB class.
# gf Actually this pattern doesn't even guarantee a single point, see
#    gifu03:204. Removed fixed territorial value. (3.5.3)

|.O?      endgame move
|.*X      2.5 points gote
|..x

:8,OXe


Pattern EE802

|.X             extend on second line
|.*             2 points gote
|.O

:8,OXe,terri(2)

|bX
|.*
|aO

;proper_eye(a) && proper_eye(b)


Pattern EE803

?xx?
X.*O           extend on second line
....           about 2 points gote
----

:8,OXe,terri(2)

?xx?
X.*O
b..a
----

;proper_eye(a) && proper_eye(b)


Pattern EE804
# gf Revised value. (3.3.15)

O*X            endgame move
..X            not guaranteed to be more than 0 points gote
---

:8,OXe,terri(0.1)

O*X
a.X
---

;marginal_eye(a)


Pattern EE805

XX.           extend on second line
OO*           not guaranteed to yield a single point
...
---

:8,OXe,terri(0.1)


Pattern EE806
# evand new (3.7.1)
# see kgs:70

|.O??
|.OX.
|.*X.
|....
+----

:8,OXe,terri(3)

|bO??
|.OX.
|.*Xa
|....
+----

;xmoyo(a) && omoyo(b)


# second line extensions
########################

Pattern EE851

Ox.           clamp on second line
OX*           almost too big to be classified as endgame move
...
---

:8,OXe,terri(8)

Ox.
OX*
.a.
---

;oplay_attack(*,a,a)


# miscellaneous second line moves
#################################


Pattern EE901
# al1 Revised symmetry. (3.7.11)

?.?       endgame move
X*X       one point reverse sente
O.O
---

:|,OXe,terri(1),reverse_followup(2)

?a?
X*X
O.O
---

;marginal_eye(*) && proper_eye(a)


Pattern EE902
# al1 Revised symmetry. (3.7.11)
# Why does this have followup value? -ab

?.?       endgame move
O*O       one point sente
X.X
---

:|,OXe,terri(1),followup(2)

?a?
O*O
X.X
---

;marginal_eye(*) && proper_eye(a)


Pattern EE903
# gf New pattern. (3.1.23)

??XO?
?OO*.
X....
-----

:8,OXe

??XO?
?OO*.
Xa...
-----

;!safe_omove(a)


# third line moves
##################


Pattern EE1002

??X?           endgame move
?X*O           at least one point reverse sente
OO..
....
----

:8,OXe,terri(1),reverse_followup(4)

??X?
?X*O
aa..
....
----

;lib(a)>3


Pattern EE1003
# gf New pattern. (3.1.12)

O*X?           at least one point and usually sente
?X.o
?X.o
----

:8,OXe,terri(1)

O*X?
?Abo
?A.o
----

;lib(A)==3 && proper_eye(b)


# reverse followups
######################################


Pattern EF101
# This is the least value for the followup. A more precise value can
# only be had by dynamic reading.

O..
X*.
---

:8,OX,reverse_followup(4)

Oa.
X*.
---

;marginal_eye(*) && proper_eye(a) && oplay_attack(*,a,a)


Pattern EF102
# tm New Pattern (3.1.16)
# tm modified (3.1.17)
# tm modified (3.1.20)
# gf Removed terri(1) value. (3.1.29)
# FIXME: see endgame:218, trevord:1030, trevorc:430
# FIXME: This is no edge pattern, move it.

O.
*O

:8,O,reverse_followup(3)

ac
*b

;proper_eye(c) && oterri(c) && !oplay_attack(*,*)
;&& !xplay_attack(*,*) && xplay_attack_either(*,a,b)


######################################################################
#
# Center endgame patterns
#
# Moves in the center with small weights, intended to come into play
# in the endgame.
#
######################################################################

Pattern CE1
# gf Increased value. (3.3.14)
# Give it a little more than 0.5 points in order to fill before capturing.

?OX?     fill ko at end of game
O*OX     1/2 point gote
?OX?

:-,X,terri(0.6)

?OX?
a*OX
?OX?

;!dead(a)


Pattern CE2

?OX?     take ko at end of game
OX*X     1/2 point
?OX?

:-,sO,terri(0.5)

?OX?
OX*A
?OX?

;!dead(A)


Pattern CE3
# al1 Revised symmetry. (3.7.11)

...           push against opponent
O*X           about 1 point gote
...

:-,OXe,terri(1)


Pattern CE4a
# gf Split and revised pattern. (3.3.10)
# gf Revised constraint. (3.3.16)

??X     endgame move
O*.     about 1 point reverse sente
?.O

:8,OXe,terri(1),reverse_followup(1)

??X
O*.
?aO

;marginal_eye(*) && proper_eye(a) && (!halfeye(a) || false_eye_territory(a))


Pattern CE4b
# gf Split and revised pattern. (3.3.10)

??X     endgame move
O*.     about 1 point reverse sente
x.O

:8,OXe,terri(1),reverse_followup(2)

??X
O*.
baO

;marginal_eye(*) && proper_eye(a) && proper_eye(b)


Pattern CE6

X?        push in
*O        0 points gote

:8,OXe,terri(0.1)


Pattern CE9
# gf Revised constraint. (3.3.15)

.X        push in
*O        1 points gote

:8,nOXe,terri(1)

aX
*O

;marginal_eye(*) && max_eye_value(*)>0
;&& !safe_omove(a) && !obvious_false_xeye(a)


Pattern CE12

X*O                               worth a point in chinese rules

:-,OXe,terri(0.1)


Pattern CE13
# al1 Revised symmetry. (3.7.11)

X.X      sometimes double sente endgame move
.*.      one point gote
O.O

:|,OXe,terri(1)

XbX
.*.
OaO

;proper_eye(a) || proper_eye(b)


Pattern CE14
# al1 Revised symmetry. (3.7.11)

X.X      sometimes double sente endgame move
.*.      two points gote
O.O

:|,OXe,terri(2)

XbX
.*.
OaO

;proper_eye(a) && proper_eye(b)


Pattern CE15

.X?       sente endgame move
.*.       one point sente
X.O

:8,OXe,terri(1)

.X?
a*.
X.O

;marginal_eye(*) && proper_eye(a)


Pattern CE15b

XX?       gote endgame move
.*.       one point gote
X.O

:8,OXe,terri(1)

XX?
a*.
X.O

;marginal_eye(*) && proper_eye(a)


Pattern CE16

.X?       sente endgame move
.*O       one point sente
X??

:8,OXe,terri(1)

.X?
a*O
X??

;marginal_eye(*) && proper_eye(a) && olib(*)>2


Pattern CE16b
# gf Revised constraint. (3.3.15)

.O?       sente endgame move
.*X       one point reverse sente
O??

:8,OXe,terri(1),reverse_followup(2)

.O?
a*X
O??

;marginal_eye(*) && proper_eye(a) && max_eye_value(a)>0 && xlib(*)>2


Pattern CE17
# gf Revised constraint. (3.3.20)

XO          endgame move
.*          one point sente
xX

:8,OXe,terri(1)

XO
a*
xX

;marginal_eye(*) && proper_eye(a) && max_eye_value(a)>0 && olib(*)>2


Pattern CE18
# tm removed reverse_followup value
#   see trevorb:700
# gf Revised constraint. (3.3.15)

OX          endgame move
.*          one point gote.
oO

:8,OXe,terri(1)

OX
a*
oO

;marginal_eye(*) && proper_eye(a) && max_eye_value(a)>0


Pattern CE19
# gf Revised constraint. (3.3.15)

?.?       endgame move
X*X       one point gote
O.O

:|,OXe,terri(1)

?b?
X*X
OaO

;marginal_eye(*) && proper_eye(b) && max_eye_value(b)>0 && oplay_attack(*,a,a)


Pattern CE20a
# gf Split and revised pattern. (3.3.10)
# gf Revised constraint. (3.3.15)

?.?         Smallish endgame
O*O         one point, possibly reverse sente
?X?

:|,nOXe,terri(1),reverse_followup(1)

?a?
O*O
?X?

;marginal_eye(*) && proper_eye(a) && max_eye_value(a)>0


Pattern CE20b
# gf Split and revised pattern. (3.3.10)

?.x         Smallish endgame
O*O         one point reverse sente
?X?

:8,nOXe,terri(1),reverse_followup(2)

?ab
O*O
?X?

;marginal_eye(*) && proper_eye(a) && proper_eye(b)


Pattern CE20c
# gf Split and revised pattern. (3.3.10)

x.x         Smallish endgame
O*O         one point reverse sente
?X?

:|,nOXe,terri(1),reverse_followup(3)

cab
O*O
?X?

;marginal_eye(*) && proper_eye(a) && proper_eye(b) && proper_eye(c)


Pattern CE21
# gf Constraint revised. (3.1.8)

*OX         Smallish endgame
O.O         one point reverse sente

:8,nOXe,terri(1),reverse_followup(2)

*bX
OaO

;proper_eye(a) && lib(b)==2 && !oterri(*)


Pattern CE22
# gf Territory not guaranteed by pattern. Removed terri(1). (3.7.2)
# al1 Revised symmetry. (3.7.11)

?X?
.*.      one point gote
O.O
ooo

:|,OXe


Pattern CE23

O??
*Xx      endgame move
..X      two points gote
xXO

:8,OXe,terri(2)

O??
*Xx
baX
xXO

;proper_eye(a) && proper_eye(b)


Pattern CE24
#tm revised terri from 5 to 4 (3.1.20) (see trevord:180 O6)

??OX        rescue one stone making territory
X*.O
?O..

:8,X,terri(4)

??OX
X*.A
?Ob.

; omoyo(b) && lib(A)==2


# Pattern CE25
# # tm New pattern (3.1.15)  (see trevora:320)
# # gf Bad pattern, see olympiad2004:121.
# # gf Also no longer needed in trevora:320, removed. (3.7.1)
# 
# O*X
# XX.
# 
# :8,OX,terri(1)
# 
# O*X
# Xa.
# 
# ;lib(a)==2


Pattern CE26
# gf New pattern. (3.1.18)  (see trevorb:870)

O*O
X.X

:|,OXe


Pattern CE27
# tm New Pattern (3.1.18)
# al1 Revised symmetry. (3.7.11)

...   moyo breakin worth a lot.
X*X
?O?

:|,-,terri(3)

.b.
A*C
?O?

; xmoyo(b) && oplay_break_through(*,b,A,b,C) == WIN


Pattern CE28
# tm New Pattern (3.1.20)
# gf Revised constraint. (3.3.10)

OX
.*
O.

:8,nOXe,terri(1)

OX
A*
OB

;proper_eye(A) && oplay_attack(*,B,B)


Pattern CE28b
# gf New pattern. (3.3.10)

OX
.*
O.

:8,nOXe


Pattern CE29
# tm New Pattern (3.1.20)  (see trevord:950)
# FIXME: this pattern better in patterns.db?
# gf Added constraint. (3.3.13) (see gunnar:18)
# nando Added s classification and action. (3.7.11)

X*X	Wedge
O.X

:8,sOXe

B*X
OaX

;oplay_attack_either(*,a,a,B)

>if (!safe_omove(*)) known_safe_move(*)


Pattern CE31
# gf New pattern. (3.3.6)

X.X
?*?
?O?

:|,OXe,terri(0.1)


Pattern CE32
# gf New pattern. (3.3.17)

X*X
O.o
?O?

:8,OXe


Pattern CE33
# gf New pattern. (3.5.3)
# If both colors are alive this does at best fill a dame.

OOO
O*O
?X?

:8,OX,maxterri(0.1)


Pattern CE34
# gf New pattern. (3.7.4)
# See gunnar:77.

X.*
?O.
??X

:/,OXe


######################################################################
#
# Center followup patterns
#
# Patterns in the center which enhance the precision of the CE patterns.
#
######################################################################

# Pattern CF3
# # tm New Pattern (3.1.23) (see arend:36)
# # FIXME: Perhaps better in patterns.db?
# # gf This pattern is redundant because the followup has already been
# #    found by find_worm_threats(). (This was broken in 3.1.23 and 3.1.24.)
# # al1 Remove pattern. (3.7.11)
# 
# O*.O  threaten to save
# 
# :-,-
# 
# b*ca
# 
# ; dead(a) && !dead(b) && oplay_disconnect(*,*,a) && !oplay_attack(*,?,c,a)
# 
# > threaten_to_save(a)


######################################################################
#
# Eye patterns
#
# Moves which steal or save a few points by making eye points false.
#
######################################################################


Pattern EY1
# gf Revised constraint. (3.3.10)

X*O
.X?

:8,nOXe,terri(1)

X*b
aX?

;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a) && !weak(b)


Pattern EY2
# gf Revised constraint. (3.3.10)

?.O
X*.
.X?

:/,nOXe,terri(1)

?.b
X*.
aX?

;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a) && !weak(b)


Pattern EY3
# gf Revised constraint. (3.3.10)

O*X
.O?

:8,nOXe,terri(1)

O*X
aO?

;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a)


Pattern EY4
# gf Revised constraint. (3.3.10)

?.X
O*.
.O?

:/,nOXe,terri(1)

?.X
O*.
aO?

;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a)


Pattern EY5
# gf Revised constraint. (3.3.10)

?.X
O.*
.O?

:8,nOXe,terri(1)

?.X
Ob*
aO?

;halfeye(a) && max_eye_value(a)>0 && !false_eye_territory(a)
;&& oplay_attack(*,b,b) == WIN


# END OF FILE