Documentation
¶
Overview ¶
Package search contains search functionality and utilities.
Index ¶
- Variables
- func EnforceTimeControl(ctx context.Context, h Handle, tc *TimeControl, turn board.Color) (time.Duration, bool)
- func IsAnyMove(ctx context.Context, m board.Move, b *board.Board) bool
- func IsClosed(ch <-chan struct{}) bool
- func IsNotUnderPromotion(ctx context.Context, m board.Move, b *board.Board) bool
- func IsQuickGain(ctx context.Context, m board.Move, b *board.Board) bool
- type AlphaBeta
- type Bound
- type Context
- type First
- type Handle
- type Iterative
- type Launcher
- type Minimax
- type MoveList
- type NoTranspositionTable
- func (n NoTranspositionTable) Read(hash board.ZobristHash) (Bound, int, eval.Score, board.Move, bool)
- func (n NoTranspositionTable) Size() uint64
- func (n NoTranspositionTable) Used() float64
- func (n NoTranspositionTable) Write(hash board.ZobristHash, bound Bound, ply, depth int, score eval.Score, ...) bool
- type Options
- type PV
- type Priority
- type Quiescence
- type QuietSearch
- type Search
- type Selection
- type TimeControl
- type TranspositionTable
- type TranspositionTableFactory
- type WriteFilter
- type WriteLimited
- type ZeroPly
Constants ¶
This section is empty.
Variables ¶
var EmptyContext = &Context{TT: NoTranspositionTable{}}
var ErrHalted = errors.New("search halted")
ErrHalted is an error indicating that the search was halted.
Functions ¶
func EnforceTimeControl ¶
func EnforceTimeControl(ctx context.Context, h Handle, tc *TimeControl, turn board.Color) (time.Duration, bool)
EnforceTimeControl enforces the time control limits, if any. Returns soft limit.
func IsClosed ¶
func IsClosed(ch <-chan struct{}) bool
IsClosed return true iff the quit channel is closed.
func IsNotUnderPromotion ¶
IsNotUnderPromotion selects any move, except under-promotions.
Types ¶
type AlphaBeta ¶
type AlphaBeta struct { Pick Selection Eval QuietSearch }
AlphaBeta implements alpha-beta pruning. Pseudo-code:
function alphabeta(node, depth, α, β, maximizingPlayer) is
if depth = 0 or node is a terminal node then return the heuristic value of node if maximizingPlayer then value := −∞ for each child of node do value := max(value, alphabeta(child, depth − 1, α, β, FALSE)) α := max(α, value) if α ≥ β then break (* β cutoff *) return value else value := +∞ for each child of node do value := min(value, alphabeta(child, depth − 1, α, β, TRUE)) β := min(β, value) if β ≤ α then break (* α cutoff *) return value
See: https://en.wikipedia.org/wiki/Alpha–beta_pruning.
type Context ¶
type Context struct {
Alpha, Beta eval.Score // Limit search to a [Alpha;Beta] Window
Ponder []board.Move // Limit search to variation, if present.
TT TranspositionTable // HashTable
}
Context holds optional context for search implementations.
type Handle ¶
type Handle interface { // Halt halts the search, if running. Idempotent. Halt() PV }
Handle is an interface for the engine to manage searches. The engine is expected to spin off searches with forked boards and close/abandon them when no longer needed. This design keeps stopping conditions and re-synchronization trivial.
type Iterative ¶
type Iterative struct {
Root Search
}
Iterative is a search harness for iterative deepening search.
type Launcher ¶
type Launcher interface { // Launch a new search from the given position. It expects an exclusive (forked) board and // returns a PV channel for iteratively deeper searches. If the search is exhausted, the // channel is closed. The search can be stopped at any time. Launch(ctx context.Context, b *board.Board, tt TranspositionTable, opt Options) (Handle, <-chan PV) }
Launcher is an interface for managing searches.
type Minimax ¶
Minimax implements naive minimax search. Useful for comparison and validation. Pseudo-code:
function minimax(node, depth, maximizingPlayer) is
if depth = 0 or node is a terminal node then return the heuristic value of node if maximizingPlayer then value := −∞ for each child of node do value := max(value, minimax(child, depth − 1, FALSE)) return value else (* minimizing player *) value := +∞ for each child of node do value := min(value, minimax(child, depth − 1, TRUE)) return value
type MoveList ¶
type MoveList struct {
// contains filtered or unexported fields
}
MoveList is move priority queue for move ordering.
func NewMoveList ¶
NewMoveList returns a new move list with the given priorities.
type NoTranspositionTable ¶
type NoTranspositionTable struct{}
NoTranspositionTable is a Nop implementation.
func (NoTranspositionTable) Read ¶
func (n NoTranspositionTable) Read(hash board.ZobristHash) (Bound, int, eval.Score, board.Move, bool)
func (NoTranspositionTable) Size ¶
func (n NoTranspositionTable) Size() uint64
func (NoTranspositionTable) Used ¶
func (n NoTranspositionTable) Used() float64
type Options ¶
type Options struct { // DepthLimit, if set, limits the search to the given ply depth. DepthLimit *int // TimeControl, if set, limits the search to the given time parameters. TimeControl *TimeControl }
Options hold dynamic search options. The user may change these on a particular search.
type PV ¶
type PV struct { Depth int // depth of search Moves []board.Move // principal variation Score eval.Score // evaluation at depth Nodes uint64 // interior/leaf nodes searched Time time.Duration // time taken by search Hash float64 // hash table used [0;1] }
PV represents the principal variation for some search depth.
type Quiescence ¶
Quiescence implements a configurable alpha-beta QuietSearch.
type QuietSearch ¶
type QuietSearch interface {
QuietSearch(ctx context.Context, sctx *Context, b *board.Board, quit <-chan struct{}) (uint64, eval.Score)
}
QuietSearch is a limited quiescence search, where standing pat is an option for evaluation purposes. Thread-safe.
type Search ¶
type Search interface {
Search(ctx context.Context, sctx *Context, b *board.Board, depth int, quit <-chan struct{}) (uint64, eval.Score, []board.Move, error)
}
Search implements search of the game tree to a given depth. Thread-safe.
type Selection ¶
Selection defines move selection. It is required by quiescence search, but optional for full search. Selection turns true if the move just made should be explored.
type TimeControl ¶
TimeControl represents time control information.
func (TimeControl) Limits ¶
Limits returns a soft and hard limit for making move with the given color. The interpretation is that after the soft limit, no new search should be conducted.
func (TimeControl) String ¶
func (t TimeControl) String() string
type TranspositionTable ¶
type TranspositionTable interface { // Read returns the bound, depth, score and best move for the given position hash, if present. Read(hash board.ZobristHash) (Bound, int, eval.Score, board.Move, bool) // Write stores the entry into the table, depending on table semantics and replacement policy. Write(hash board.ZobristHash, bound Bound, ply, depth int, score eval.Score, move board.Move) bool // Size returns the size of the table in bytes. Size() uint64 // Used returns the utilization as a fraction [0;1]. Used() float64 }
TranspositionTable represents a transposition table to speed up search performance. Caveat: evaluation heuristics that depend on the game history (notably, hasCastled or last move) may be unsuitable for position-keyed caching. If the recent history is short, then the table may only be used for depth greater than some limit. Must be thread-safe.
func NewTranspositionTable ¶
func NewTranspositionTable(ctx context.Context, size uint64) TranspositionTable
type TranspositionTableFactory ¶
type TranspositionTableFactory func(ctx context.Context, size uint64) TranspositionTable
func NewMinDepthTranspositionTable ¶
func NewMinDepthTranspositionTable(min int) TranspositionTableFactory
NewMinDepthTranspositionTable creates depth-limited TranspositionTables.
type WriteFilter ¶
type WriteFilter func(hash board.ZobristHash, bound Bound, ply, depth int, score eval.Score, move board.Move) bool
WriteFilter is a predicate on the Write operation.
type WriteLimited ¶
type WriteLimited struct { Filter WriteFilter TT TranspositionTable }
WriteLimited is a TranspositionTable wrapper that ignores certain writes, such as less than a given minimum depth. Useful if evaluation uses recent move history.
func (WriteLimited) Read ¶
func (w WriteLimited) Read(hash board.ZobristHash) (Bound, int, eval.Score, board.Move, bool)
func (WriteLimited) Size ¶
func (w WriteLimited) Size() uint64
func (WriteLimited) Used ¶
func (w WriteLimited) Used() float64