Skip to main content

Core Traits Reference

Complete API reference for every public trait, struct, and enum in the treant crate.


GameState

Defines the game rules: legal moves, state transitions, and players. See Tutorial 2 for implementation walkthrough.

pub trait GameState: Clone {
type Move: Sync + Send + Clone;
type Player: Sync;
type MoveList: IntoIterator<Item = Self::Move>;
// ...
}

Associated types

TypeBoundsPurpose
MoveSync + Send + CloneA game action
PlayerSyncIdentifies whose turn it is
MoveListIntoIterator<Item = Move>Collection returned by available_moves()

Required methods

current_player

fn current_player(&self) -> Self::Player;

Returns the player whose turn it is. Called once per node expansion.

available_moves

fn available_moves(&self) -> Self::MoveList;

Returns all legal moves from this state. An empty result signals a terminal node. Moves are expanded in the order returned -- put high-priority moves first when using progressive widening.

make_move

fn make_move(&mut self, mov: &Self::Move);

Apply a move, mutating the state in place. Called during every playout step.

Provided methods

max_children

fn max_children(&self, _visits: u64) -> usize  // default: usize::MAX

Maximum children to expand at this node given the current visit count. Override for progressive widening, e.g. (visits as f64).sqrt() as usize.

Parameters:

  • visits (u64) -- total visits to the parent node

Returns: usize -- maximum number of children to consider during selection

terminal_value

fn terminal_value(&self) -> Option<ProvenValue>  // default: None

Classify the outcome of a terminal state for MCTS-Solver. The value is from the perspective of the current player (the player who would move next but cannot).

Returns: Some(ProvenValue::Loss) if the current player has lost, Some(ProvenValue::Win) if won, Some(ProvenValue::Draw) for draws, None to skip solver classification.

terminal_score

fn terminal_score(&self) -> Option<i32>  // default: None

Exact minimax score of a terminal state for Score-Bounded MCTS. From the current player's perspective.

Returns: Some(score) to set exact bounds on this terminal, None to skip.

chance_outcomes

fn chance_outcomes(&self) -> Option<Vec<(Self::Move, f64)>>  // default: None

If the current state requires a chance event (dice roll, card draw) before the next player decision, return the possible outcomes with their probabilities. Probabilities must be positive and sum to 1.0. Outcomes are applied via make_move(). See Tutorial 5 and Chance Nodes.

Returns: Some(vec) of (move, probability) pairs for chance events, None for deterministic transitions.


Evaluator<Spec>

Evaluates game states during search. Produces state evaluations and per-move evaluations. See Tutorial 2.

pub trait Evaluator<Spec: MCTS>: Sync {
type StateEvaluation: Sync + Send;
// ...
}

Associated types

TypeBoundsPurpose
StateEvaluationSync + SendThe evaluation produced for a game state (e.g., i64 score, neural network value head output)

Required methods

evaluate_new_state

fn evaluate_new_state(
&self,
state: &Spec::State,
moves: &MoveList<Spec>,
handle: Option<SearchHandle<Spec>>,
) -> (Vec<MoveEvaluation<Spec>>, Self::StateEvaluation);

Evaluate a newly expanded leaf node. Returns per-move evaluations (one per move, in order) and a state evaluation. The handle is None for the root node.

Parameters:

  • state -- the game state to evaluate
  • moves -- legal moves from this state (same order as available_moves())
  • handle -- search context (node data, thread-local data); None at root

Returns: (move_evals, state_eval) -- move evaluations must match the length of moves

evaluate_existing_state

fn evaluate_existing_state(
&self,
state: &Spec::State,
existing_evaln: &Self::StateEvaluation,
handle: SearchHandle<Spec>,
) -> Self::StateEvaluation;

Re-evaluate a previously seen state. Called on revisits (e.g., open-loop chance nodes where the same node may be reached through different random outcomes).

interpret_evaluation_for_player

fn interpret_evaluation_for_player(
&self,
evaluation: &Self::StateEvaluation,
player: &Player<Spec>,
) -> i64;

Convert a state evaluation to a reward from the given player's perspective. Called during backpropagation for each ancestor node.


MCTS

Configuration trait for the search. Defines all associated types and tuning parameters. See Tutorial 2 and Configuration Options.

pub trait MCTS: Sized + Send + Sync + 'static {
type State: GameState + Send + Sync + 'static;
type Eval: Evaluator<Self> + Send + 'static;
type TreePolicy: TreePolicy<Self> + Send + 'static;
type NodeData: Default + Sync + Send + 'static;
type TranspositionTable: TranspositionTable<Self> + Send + 'static;
type ExtraThreadData: 'static;
// ...
}

Associated types

TypeBoundsPurpose
StateGameState + Send + Sync + 'staticThe game state type
EvalEvaluator<Self> + Send + 'staticThe state/move evaluator
TreePolicyTreePolicy<Self> + Send + 'staticChild selection policy (e.g., UCTPolicy, AlphaGoPolicy)
NodeDataDefault + Sync + Send + 'staticCustom per-node data accessible via SearchHandle
TranspositionTableTranspositionTable<Self> + Send + 'staticTransposition table implementation (use () for none)
ExtraThreadData'staticCustom per-thread data accessible via SearchHandle

Provided methods

All methods have defaults. See Configuration Options for a consolidated table.

virtual_loss

fn virtual_loss(&self) -> i64  // default: 0

Virtual loss for parallel search. Subtracted during descent, added back during backpropagation. Discourages multiple threads from exploring the same path.

fpu_value

fn fpu_value(&self) -> f64  // default: f64::INFINITY

First Play Urgency. Value assigned to unvisited children during selection. f64::INFINITY (default) forces all children to be tried before any revisit. Set to a finite value (e.g., 0.0) for neural-network-guided search.

visits_before_expansion

fn visits_before_expansion(&self) -> u64  // default: 1

Minimum visits to a leaf before expanding it into a tree node.

node_limit

fn node_limit(&self) -> usize  // default: usize::MAX

Maximum number of tree nodes. Search stops when reached.

fn select_child_after_search<'a>(
&self,
children: &'a [MoveInfo<Self>],
) -> &'a MoveInfo<Self>

Select the best child after search completes. Default behavior: prefer proven wins, then proven draws, then highest visit count. Override for custom post-search selection.

max_playout_length

fn max_playout_length(&self) -> usize  // default: 1_000_000

Safety cap. playout panics if a single playout exceeds this depth.

max_playout_depth

fn max_playout_depth(&self) -> usize  // default: usize::MAX

Quality knob. When exceeded, the current node is evaluated as a leaf instead of descending further. See Tutorial 7.

rng_seed

fn rng_seed(&self) -> Option<u64>  // default: None

Optional RNG seed for deterministic search. Each thread gets a reproducible RNG seeded from seed + thread_id.

dirichlet_noise

fn dirichlet_noise(&self) -> Option<(f64, f64)>  // default: None

Root exploration noise for self-play. Returns Some((epsilon, alpha)) where the noisy prior = (1 - epsilon) * prior + epsilon * Dir(alpha). Typical: epsilon=0.25, alpha=0.03 (Go), alpha=0.3 (Chess). Only effective when TreePolicy::MoveEvaluation supports noise (e.g., f64). See Tutorial 6.

selection_temperature

fn selection_temperature(&self) -> f64  // default: 0.0

Temperature for post-search move selection in best_move(). 0.0 = argmax by visits. 1.0 = proportional to visits. principal_variation() always uses argmax regardless.

solver_enabled

fn solver_enabled(&self) -> bool  // default: false

Enable MCTS-Solver. Proven game-theoretic values (win/loss/draw) propagate up the tree. Requires GameState::terminal_value(). See Tutorial 4.

score_bounded_enabled

fn score_bounded_enabled(&self) -> bool  // default: false

Enable Score-Bounded MCTS. Each node tracks [lower, upper] bounds on its minimax value. Requires GameState::terminal_score(). Independent of solver_enabled().

closed_loop_chance

fn closed_loop_chance(&self) -> bool  // default: false

Enable closed-loop chance nodes. Each chance outcome gets its own child in the tree. More accurate per-outcome statistics but larger trees. Requires GameState::chance_outcomes().

on_backpropagation

fn on_backpropagation(
&self,
_evaln: &StateEvaluation<Self>,
_handle: SearchHandle<Self>,
) // default: no-op

Called during backpropagation for each node on the playout path. Use for custom statistics accumulation.

cycle_behaviour

fn cycle_behaviour(&self) -> CycleBehaviour<Self>

How to handle graph cycles caused by transposition tables. Default: PanicWhenCycleDetected if a transposition table is configured, Ignore otherwise.


TreePolicy<Spec>

Selects which child to explore during tree traversal. See Tree Policies and Custom Tree Policy.

pub trait TreePolicy<Spec: MCTS<TreePolicy = Self>>: Sync + Sized {
type MoveEvaluation: Sync + Send + Default;
type ThreadLocalData: Default;
// ...
}

Associated types

TypeBoundsPurpose
MoveEvaluationSync + Send + DefaultPer-move evaluation (e.g., () for UCT, f64 prior for PUCT)
ThreadLocalDataDefaultThread-local policy data (e.g., RNG for tie-breaking)

Required methods

choose_child

fn choose_child<'a, MoveIter>(
&self,
moves: MoveIter,
handle: SearchHandle<Spec>,
) -> &'a MoveInfo<Spec>
where
MoveIter: Iterator<Item = &'a MoveInfo<Spec>> + Clone;

Select the most promising child to explore during a playout. Called at every internal node during selection.

Provided methods

validate_evaluations

fn validate_evaluations(&self, _evalns: &[Self::MoveEvaluation])  // default: no-op

Validate move evaluations after node creation (e.g., check priors sum to 1). Called once per node expansion.

seed_thread_data

fn seed_thread_data(&self, _tld: &mut Self::ThreadLocalData, _seed: u64)  // default: no-op

Seed the thread-local data for deterministic search. Called when MCTS::rng_seed() is set.

compare_move_evaluations

fn compare_move_evaluations(
&self,
_a: &Self::MoveEvaluation,
_b: &Self::MoveEvaluation,
) -> std::cmp::Ordering // default: Equal

Compare two move evaluations for ordering during progressive widening. Higher-priority moves should sort first (return Greater for higher priority a).

apply_dirichlet_noise

fn apply_dirichlet_noise(
&self,
_moves: &mut [MoveInfo<Spec>],
_epsilon: f64,
_alpha: f64,
_rng: &mut SmallRng,
) // default: no-op

Apply Dirichlet noise to root move evaluations for self-play exploration. Only meaningful when MoveEvaluation is numeric.


TranspositionTable<Spec> (unsafe trait)

Maps game states to search nodes for graph-structured search. See Transposition Tables. Use () for no transposition table.

pub unsafe trait TranspositionTable<Spec: MCTS>: Sync + Sized { ... }

Safety: If insert inserts a value, it must return None. Violating this causes memory unsafety (double-free).

Required methods

insert

fn insert<'a>(
&'a self,
key: &Spec::State,
value: &'a SearchNode<Spec>,
handle: SearchHandle<Spec>,
) -> Option<&'a SearchNode<Spec>>;

Attempt to insert a key/value pair. If the key is inserted, must return None. If the key already exists, may return Some(existing_node) or None. The table may silently drop entries or return approximate matches.

lookup

fn lookup<'a>(
&'a self,
key: &Spec::State,
handle: SearchHandle<Spec>,
) -> Option<&'a SearchNode<Spec>>;

Look up a key. Returns Some(node) if found, None otherwise. May return None even for present keys (approximate).

Provided methods

clear

fn clear(&mut self)  // default: no-op

Clear all entries. Called during tree re-rooting (advance()) to prevent dangling pointers.

Built-in implementations

  • () -- no-op transposition table. insert and lookup always return None. Zero overhead.

TranspositionHash

Hash trait for game states used with ApproxTable. See Transposition Tables.

pub trait TranspositionHash {
fn hash(&self) -> u64;
}

hash

fn hash(&self) -> u64;

Compute a hash of this game state. Equal states must produce equal hashes. Hash 0 is reserved and will not be inserted into the table.


BatchEvaluator<Spec>

Batch evaluation interface for GPU-accelerated neural networks. See Batched Evaluation.

pub trait BatchEvaluator<Spec: MCTS>: Send + Sync + 'static {
type StateEvaluation: Sync + Send + Clone;
// ...
}

Associated types

TypeBoundsPurpose
StateEvaluationSync + Send + CloneState evaluation type (must be Clone for batched path)

Required methods

evaluate_batch

fn evaluate_batch(
&self,
states: &[(Spec::State, MoveList<Spec>)],
) -> Vec<(Vec<MoveEvaluation<Spec>>, Self::StateEvaluation)>;

Evaluate a batch of newly expanded leaf nodes. Each input is a (state, moves) pair. Returns a Vec of the same length, each element being (move_evaluations, state_evaluation).

interpret_evaluation_for_player

fn interpret_evaluation_for_player(
&self,
evaluation: &Self::StateEvaluation,
player: &Player<Spec>,
) -> i64;

Convert a state evaluation to a score from a specific player's perspective.

Provided methods

evaluate_existing_state

fn evaluate_existing_state(
&self,
_state: &Spec::State,
existing_evaln: &Self::StateEvaluation,
) -> Self::StateEvaluation // default: existing_evaln.clone()

Re-evaluate a node that has already been evaluated. Called synchronously (not batched). Default clones the existing evaluation.


MCTSManager<Spec>

Main entry point for running MCTS search. Owns the search tree and provides methods for running playouts and extracting results. See Tutorial 2.

Constructor

new

pub fn new(
state: Spec::State,
manager: Spec,
eval: Spec::Eval,
tree_policy: Spec::TreePolicy,
table: Spec::TranspositionTable,
) -> Self

Create a new search manager.

Parameters:

  • state -- initial game state (becomes the root)
  • manager -- MCTS configuration (the Spec impl)
  • eval -- evaluator instance
  • tree_policy -- tree policy instance
  • table -- transposition table instance (use () for none)

Search methods

playout

pub fn playout(&mut self)

Run a single playout (single-threaded). Descends from root, expands a leaf, evaluates, and backpropagates.

playout_n

pub fn playout_n(&mut self, n: u64)

Run n playouts sequentially on the calling thread.

playout_n_parallel

pub fn playout_n_parallel(&mut self, n: u32, num_threads: usize)

Run n playouts distributed across num_threads using scoped threads. Blocks until all playouts complete.

Parameters:

  • n (u32) -- total number of playouts
  • num_threads (usize) -- number of search threads (must be > 0)

playout_parallel_for

pub fn playout_parallel_for(&mut self, duration: Duration, num_threads: usize)

Run parallel search for the given duration. Blocks until time expires.

Parameters:

  • duration (Duration) -- how long to search
  • num_threads (usize) -- number of search threads (must be > 0)

playout_until

pub fn playout_until<Predicate: FnMut() -> bool>(&mut self, pred: Predicate)

Run single-threaded playouts until the predicate returns true. Checked between each playout.

playout_parallel_async

pub fn playout_parallel_async<'a>(
&'a mut self,
num_threads: usize,
) -> AsyncSearch<'a, Spec>

Start asynchronous parallel search. Returns an AsyncSearch handle; search stops when the handle is dropped or .halt() is called.

into_playout_parallel_async

pub fn into_playout_parallel_async(
self,
num_threads: usize,
) -> AsyncSearchOwned<Spec>

Like playout_parallel_async, but takes ownership. Call .halt() on the returned AsyncSearchOwned to recover the manager.

Result methods

best_move

pub fn best_move(&self) -> Option<Move<Spec>>

The best move found by search. Uses temperature-based selection if selection_temperature() > 0. Returns None if no moves were explored.

principal_variation

pub fn principal_variation(&self, num_moves: usize) -> Vec<Move<Spec>>

The best sequence of moves found by search, up to num_moves deep. Always uses argmax (ignores temperature).

principal_variation_states

pub fn principal_variation_states(&self, num_moves: usize) -> Vec<Spec::State>

The principal variation as a sequence of game states. Returns num_moves + 1 states (starting with the root state).

principal_variation_info

pub fn principal_variation_info(
&self,
num_moves: usize,
) -> Vec<MoveInfoHandle<'_, Spec>>

The principal variation with full MoveInfo handles for inspecting visit counts and rewards.

root_child_stats

pub fn root_child_stats(&self) -> Vec<ChildStats<Spec>>
where
MoveEvaluation<Spec>: Clone

Visit counts, average rewards, move evaluations, proven values, and score bounds for all root children.

root_proven_value

pub fn root_proven_value(&self) -> ProvenValue

The proven game-theoretic value of the root node. Meaningful only when solver_enabled() is true.

root_score_bounds

pub fn root_score_bounds(&self) -> ScoreBounds

The score bounds of the root node. Meaningful only when score_bounded_enabled() is true.

tree

pub fn tree(&self) -> &SearchTree<Spec>

Access the underlying SearchTree for diagnostics (num_nodes(), diagnose(), debug_moves()).

Lifecycle methods

reset

pub fn reset(self) -> Self

Reset the search tree, keeping the same game state and configuration. Consumes and returns self. Panics if async search is running.

advance

pub fn advance(&mut self, mov: &Move<Spec>) -> Result<(), AdvanceError>
where
Move<Spec>: PartialEq

Commit to a move: advance the root and preserve the subtree below it. See Tree Reuse. Panics if async search is running.

Errors:

  • AdvanceError::MoveNotFound -- the move does not exist among root children
  • AdvanceError::ChildNotExpanded -- the child node was never expanded during search
  • AdvanceError::ChildNotOwned -- the child is a transposition table alias
pub fn print_on_playout_error(&mut self, v: bool) -> &mut Self

Control whether node-limit messages are printed to stderr. Default: true.

Benchmarking

perf_test

pub fn perf_test<F>(&mut self, num_threads: usize, f: F)
where
F: FnMut(usize)

Run a 10-second performance benchmark, calling f with nodes/sec each second.

perf_test_to_stderr

pub fn perf_test_to_stderr(&mut self, num_threads: usize)

Run perf_test and print results to stderr.


ProvenValue

Game-theoretic proven value for MCTS-Solver. Stored from the perspective of the player who moved to reach this node.

#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum ProvenValue {
Unknown = 0,
Win = 1,
Loss = 2,
Draw = 3,
}
VariantMeaning
UnknownNot yet proven
WinCurrent player wins with perfect play
LossCurrent player loses with perfect play
DrawGame is drawn with perfect play

Methods

from_u8

pub fn from_u8(v: u8) -> Self

Convert from raw u8. Returns Unknown for unrecognized values.


ScoreBounds

Proven score interval for Score-Bounded MCTS. Tracks [lower, upper] bounds on the true minimax value.

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ScoreBounds {
pub lower: i32,
pub upper: i32,
}
FieldTypeMeaning
loweri32Lower bound on minimax value (current player's perspective)
upperi32Upper bound on minimax value (current player's perspective)

Constants

UNBOUNDED

pub const UNBOUNDED: Self = Self { lower: i32::MIN, upper: i32::MAX };

No bounds known.

Methods

exact

pub fn exact(v: i32) -> Self

Create bounds where lower == upper == v.

is_proven

pub fn is_proven(&self) -> bool

Returns true when bounds have converged (lower == upper).


CycleBehaviour<Spec>

Strategy for handling graph cycles caused by transposition tables.

pub enum CycleBehaviour<Spec: MCTS> {
Ignore,
UseCurrentEvalWhenCycleDetected,
PanicWhenCycleDetected,
UseThisEvalWhenCycleDetected(StateEvaluation<Spec>),
}
VariantBehavior
IgnoreNo cycle detection. May cause infinite loops without depth limits.
UseCurrentEvalWhenCycleDetectedBreak the cycle and evaluate the current node as a leaf.
PanicWhenCycleDetectedPanic on cycle detection. Useful for debugging.
UseThisEvalWhenCycleDetected(eval)Break the cycle and use the provided evaluation.

ChildStats<Spec>

Summary statistics for a root child, returned by MCTSManager::root_child_stats().

pub struct ChildStats<Spec: MCTS> {
pub mov: Move<Spec>,
pub visits: u64,
pub avg_reward: f64,
pub move_evaluation: MoveEvaluation<Spec>,
pub proven_value: ProvenValue,
pub score_bounds: ScoreBounds,
}
FieldTypeMeaning
movMove<Spec>The move
visitsu64Number of times this move was selected
avg_rewardf64Average backpropagated reward
move_evaluationMoveEvaluation<Spec>Tree policy's evaluation (e.g., prior probability)
proven_valueProvenValueProven value of the child node
score_boundsScoreBoundsScore bounds of the child node

UCTPolicy

Classic UCB1 tree policy. Balances exploitation and exploration using Q(a) + C * sqrt(2 * ln(N) / n(a)). Move evaluations are () -- all moves start equal. See Tree Policies.

Constructor

new

pub fn new(exploration_constant: f64) -> Self

Create a UCT policy with the given exploration constant C. Typical values: 0.5--2.0. Higher values explore more. Panics if C <= 0.

Methods

exploration_constant

pub fn exploration_constant(&self) -> f64

Returns the exploration constant C.

TreePolicy impl

Associated typeValue
MoveEvaluation()
ThreadLocalDataPolicyRng

AlphaGoPolicy

PUCT tree policy used by AlphaGo/AlphaZero. Selects children using (Q(a) + C * P(a) * sqrt(N)) / (1 + n(a)), where P(a) is the prior probability from a neural network. See Tree Policies and Tutorial 6.

Constructor

new

pub fn new(exploration_constant: f64) -> Self

Create a PUCT policy with the given exploration constant C. Typical values: 1.0--2.5. Panics if C <= 0.

Methods

exploration_constant

pub fn exploration_constant(&self) -> f64

Returns the exploration constant C.

TreePolicy impl

Associated typeValue
MoveEvaluationf64 (prior probability, must be non-negative, should sum to ~1.0)
ThreadLocalDataPolicyRng

validate_evaluations asserts all priors are non-negative and sum to approximately 1.0. compare_move_evaluations sorts higher priors first (for progressive widening). apply_dirichlet_noise blends priors with Dirichlet noise: (1 - epsilon) * prior + epsilon * Dir(alpha).


ApproxTable<Spec>

Lock-free approximate transposition table using quadratic probing. Type alias for ApproxQuadraticProbingHashTable<Spec::State, SearchNode<Spec>>.

Requires Spec::State: TranspositionHash.

Constructor

new

pub fn new(capacity: usize) -> Self

Create a table with the given capacity. Capacity must be a power of 2. Panics otherwise.

enough_to_hold

pub fn enough_to_hold(num: usize) -> Self

Create a table large enough to hold num entries with room to spare (approximately 1.5x capacity).


BatchedEvaluatorBridge<Spec, B>

Adapter that wraps a BatchEvaluator into an Evaluator. Search threads enqueue leaf states and block until the batch collector processes them. See Batched Evaluation.

Constructor

new

pub fn new(batch_eval: B, config: BatchConfig) -> Self

Create a bridge with the given batch evaluator and configuration. Spawns a dedicated collector thread.

Parameters:

  • batch_eval (B) -- the batch evaluator implementation
  • config (BatchConfig) -- batch size and timing configuration

BatchConfig

Configuration for batched evaluation.

pub struct BatchConfig {
pub max_batch_size: usize,
pub max_wait: Duration,
}
FieldTypeDefaultPurpose
max_batch_sizeusize8Maximum leaves per batch
max_waitDuration1msMaximum time to wait for a full batch after the first request

MoveInfo<Spec>

Information about a single move edge in the search tree. Provides access to visit statistics, rewards, and the child node.

Methods

get_move

pub fn get_move(&self) -> &Move<Spec>

The move this edge represents.

move_evaluation

pub fn move_evaluation(&self) -> &MoveEvaluation<Spec>

The tree policy's evaluation of this move (e.g., prior probability for PUCT, () for UCT).

visits

pub fn visits(&self) -> u64

Number of times this move has been selected during search.

sum_rewards

pub fn sum_rewards(&self) -> i64

Sum of backpropagated rewards through this move.

child

pub fn child(&self) -> Option<NodeHandle<'_, Spec>>

The child node reached by this move, if expanded.

child_proven_value

pub fn child_proven_value(&self) -> ProvenValue

Proven value of the child node. Returns ProvenValue::Unknown if unexpanded.

child_score_bounds

pub fn child_score_bounds(&self) -> ScoreBounds

Score bounds of the child node. Returns ScoreBounds::UNBOUNDED if unexpanded.


SearchHandle<'a, Spec>

Handle passed to evaluators and callbacks during search. Provides access to the current node, thread-local data, and MCTS configuration.

Methods

node

pub fn node(&self) -> NodeHandle<'a, Spec>

The current search node.

thread_data

pub fn thread_data(&mut self) -> &mut ThreadData<Spec>

Mutable access to thread-local data (policy_data + extra_data).

mcts

pub fn mcts(&self) -> &'a Spec

The MCTS configuration.


NodeHandle<'a, Spec>

Immutable handle to a search node.

Methods

data

pub fn data(&self) -> &'a Spec::NodeData

User-defined node data.

moves

pub fn moves(&self) -> Moves<'_, Spec>

Iterator over this node's MoveInfo entries.

proven_value

pub fn proven_value(&self) -> ProvenValue

The proven game-theoretic value of this node.

score_bounds

pub fn score_bounds(&self) -> ScoreBounds

The proven score bounds of this node.


AdvanceError

Error returned by MCTSManager::advance().

pub enum AdvanceError {
MoveNotFound,
ChildNotExpanded,
ChildNotOwned,
}
VariantMeaning
MoveNotFoundThe move does not exist among root children
ChildNotExpandedThe child node was never expanded during search
ChildNotOwnedThe child is a transposition table alias and cannot be detached

Type aliases

AliasExpands toPurpose
MoveEvaluation<Spec><Spec::TreePolicy as TreePolicy<Spec>>::MoveEvaluationPer-move evaluation type
StateEvaluation<Spec><Spec::Eval as Evaluator<Spec>>::StateEvaluationState evaluation type
Move<Spec><Spec::State as GameState>::MoveMove type
MoveList<Spec><Spec::State as GameState>::MoveListMove list type
Player<Spec><Spec::State as GameState>::PlayerPlayer type
TreePolicyThreadData<Spec><Spec::TreePolicy as TreePolicy<Spec>>::ThreadLocalDataPolicy thread-local data type
MoveInfoHandle<'a, Spec>&'a MoveInfo<Spec>Borrowed reference to a MoveInfo

treant-gumbel Crate Reference

The treant-gumbel crate provides Gumbel MuZero search as a standalone search engine. It reuses GameState from the core crate but has its own evaluator trait, search manager, and result types. See Gumbel Search tutorial and Tree Policies.


GumbelEvaluator<G>

Evaluator providing policy logits and value estimates. Simpler than the core crate's Evaluator -- returns a (Vec<f64>, f64) tuple.

pub trait GumbelEvaluator<G: GameState>: Send {
fn evaluate(&self, state: &G, moves: &[G::Move]) -> (Vec<f64>, f64);
}

Required methods

evaluate

fn evaluate(&self, state: &G, moves: &[G::Move]) -> (Vec<f64>, f64);

Evaluate a game state. Returns (logits, value).

Parameters:

  • state -- the game state to evaluate
  • moves -- available moves (same order as GameState::available_moves())

Returns: (logits, value) where:

  • logits: one f64 per move, unnormalized log-probabilities (policy head output)
  • value: state value for the current player, in [-1.0, 1.0] (value head output)

GumbelConfig

Configuration for Gumbel search. Derives Clone, Copy, Debug.

pub struct GumbelConfig {
pub m_actions: usize,
pub c_puct: f64,
pub max_depth: usize,
pub value_scale: f64,
pub seed: u64,
}
FieldTypeDefaultPurpose
m_actionsusize16Number of actions after Gumbel-Top-k sampling
c_puctf641.25PUCT exploration constant for below-root traversal
max_depthusize200Maximum search depth per simulation
value_scalef6450.0Scale factor mapping Q-values to logit scale (c_visit in the paper)
seedu6442RNG seed for Gumbel noise sampling

GumbelSearch<G, E>

Gumbel MCTS search engine. Single-threaded, two-player zero-sum (negamax).

Constructor

new

pub fn new(evaluator: E, config: GumbelConfig) -> Self

Create a new search engine.

Methods

pub fn search(&mut self, state: &G, n_simulations: u32) -> SearchResult<G::Move>

Run Gumbel search from the given state. Panics if the state is terminal.

Parameters:

  • state -- root game state (not modified)
  • n_simulations -- total simulation budget

Returns: SearchResult with best move, value, and per-move statistics.

set_seed

pub fn set_seed(&mut self, seed: u64)

Reset the RNG for reproducible searches.

evaluator

pub fn evaluator(&self) -> &E

Access the evaluator.

config

pub fn config(&self) -> &GumbelConfig

Access the configuration.


SearchResult<M>

Result of a Gumbel search. #[must_use].

pub struct SearchResult<M: Clone> {
pub best_move: M,
pub root_value: f64,
pub move_stats: Vec<MoveStats<M>>,
pub simulations_used: u32,
}
FieldTypePurpose
best_moveMBest move found by search
root_valuef64Value estimate for root state's current player
move_statsVec<MoveStats<M>>Per-move statistics (one per legal move)
simulations_usedu32Total simulations actually used

MoveStats<M>

Per-move statistics from Gumbel search.

pub struct MoveStats<M: Clone> {
pub mov: M,
pub visits: u32,
pub completed_q: f64,
pub improved_policy: f64,
}
FieldTypePurpose
movMThe move
visitsu32Simulations allocated to this move
completed_qf64Completed Q-value (empirical mean if visited, root value estimate otherwise)
improved_policyf64Gumbel-improved policy probability (sums to 1.0 across all moves)