Skip to content

Facón 1.1 - Herrumbre

Choose a tag to compare

@CMCanavessi CMCanavessi released this 11 Mar 20:27
· 6 commits to main since this release

+120 Elo over 1.0 (gauntlet testing vs field Elo ~1358, 1040 games at 2min+1sec)


Search

  • Killer move heuristic: quiet moves that cause a beta cutoff are stored per-ply (two slots per node) and tried before other quiet moves in sibling nodes. Improves move ordering in quiet positions where MVV-LVA has no effect.
  • Dynamic time management: replaced the fixed time budget with a soft/hard limit model. The soft limit is extended when the PV move changes between iterations (×1.5) or the score drops by ≥30 centipawns (×1.25). The hard limit acts as an absolute ceiling.
  • seldepth tracking: maximum depth reached including quiescence search is tracked and reported in the UCI info line each iteration.

Evaluation

  • King safety: penalty for enemy pieces attacking the king zone (king square plus adjacent squares). Attack weights: Knight=2, Bishop=2, Rook=3, Queen=5 (queens counted twice — once as diagonal, once as straight attacker). Penalty grows quadratically with total weight and scales with game phase (middlegame only).

Stability

  • Abort flag (abort_search_): when the hard time limit is hit inside the search, a flag is set and every level of the call stack returns immediately. Ensures all unmake_move() calls execute, leaving the board consistent for the next search.
  • Root best move tracking (root_best_move_): the best move at ply 0 is saved directly inside negamax() whenever a new best is found. Eliminates bestmove 0000 outputs.
  • is_legal() piece ownership check: verifies that the from-square contains a piece belonging to the side to move before the expensive board copy. Eliminates ghost moves from stale TT entries.
  • TT move validation: TT moves are verified against the generated move list before use. Prevents hash collisions from inserting garbage into move ordering.
  • TT pollution prevention: if abort_search_ is set when returning from a child node, the result is discarded without storing to the TT.
  • safe_move pre-seed: the first legal move is stored as a fallback before iterative deepening begins. Guarantees bestmove is never 0000 even if depth 1 is aborted.

Cleanup

  • probe_move() removed from tt.h/tt.cpp (dead code).
  • Non-ASCII characters removed from all source files.
  • All source file headers updated to Facon 1.1 — Herrumbre.

Checksums (SHA1)

231d9973d9f1062a40b6b39c4ac3f3ea872efcd6  facon-1.1
028e1671bf4fcad4fe19c1f5876e216709daf924  facon-1.1.exe