RootSearchStats
One move's root telemetry from ExpectimaxSearch: how wide the decision node really was.
candidatesCompleted < candidatesSelected means the wall-clock deadline truncated the anytime loop — the move was chosen among fewer candidates than ExpectimaxConfig.candidateLimit allowed. Persistently tiny completion counts on production hardware mean the effective search degenerates toward "play the pre-ranker's first pick", which no amount of candidate-limit tuning can fix — that evidence is exactly what this type exists to surface.
An immediate king-capture win reports 0/0 selected/completed: no candidate was pre-ranked or expanded, so counting it as a completed candidate would overstate the searched width. A forced pass (no legal turn for the roll) reports all-zero — legalTurns == 0 is what tells the two apart, keeping the sink's contract at exactly one record per findBestMove call.
Value parameters
- candidatesAbandoned
-
candidates whose chance node was cut mid-expansion by the deadline (at most one: the search stops afterwards). Their partial expectation is discarded rather than ranked, so this counts work paid for and thrown away — a persistent non-zero value means the per-move budget is too small for even one candidate at this width.
- candidatesCompleted
-
how many selected candidates were fully expanded through the chance node. Ranking needs comparable values, and a full expansion is one way to get one; a transposition-table hit (RootSearchStats.ttHits) and a collapsed candidate (RootSearchStats.candidatesCollapsed) are the other two, and are counted separately because they did no expansion work
- candidatesSelected
-
how many turns survived pre-ranking (at most the candidate limit)
- legalTurns
-
size of the full legal-turn list before pre-ranking
Attributes
- Source
- ExpectimaxSearch.scala
- Graph
-
- Supertypes
-
trait Serializabletrait Producttrait Equalsclass Objecttrait Matchableclass Any