Since you’re here...

We hope you will consider supporting us today. We need your support to continue to exist, because good entries are more and more work time. Every reader contribution, however big or small, is so valuable. Support "Chess Engines Diary" even a small amount– and it only takes a minute. Thank you.
============================== My email: jotes@go2.pl



Facón 1.4 - Hoja, new version chess engine


Facón is a chess engine built from scratch in C++17, designed as a learning project and long-term development platform. The name comes from the facón — a traditional Argentine gaucho knife, forged by hand, raw and functional.
Each version carries a codename that follows the knife-making process: from rough rusty iron to a sharp, precise blade.
Author: Carlos M. Canavessi

Facón 1.4 - what's new?

+430 Elo over 1.3 (Ordo ~2330, gauntlet 1040 games at 2min+1sec). NPS: +53% (Linux), +92% (Windows).

Search

  • Check extension: when in check, extend search depth by 1. Check evasions are now resolved at full depth instead of dropping into quiescence. +30 Elo.
  • Static Exchange Evaluation (SEE): full exchange simulation with x-ray discovery. Losing captures pruned in quiescence search. Shortcut: skip SEE for captures where the victim is worth >= the attacker.
  • Reverse futility pruning: at depth 1-3, if the static evaluation already exceeds beta by a margin, prune the node without searching. Like NMP without the null search cost.
  • Move-level futility pruning: at depth 1-2, skip quiet moves when the static evaluation plus a margin is still below alpha.
  • Make/unmake legality: the per-move board copy in is_legal() (~700 bytes per pseudo-legal move) replaced with make, check, unmake. NPS: +130%.
  • Move scores computed once: parallel scoring array eliminates O(n^2) move_score() calls during selection sort. NPS: +9%.
  • LMR table precalculated: startup-initialized LMR_table[MAX_PLY][MAX_MOVES] replaces per-node log() calls.
  • Quiet queen promotions in qsearch: pawn pushing to the 8th rank without capturing is now visible to quiescence search.
  • Forced move instant-play: only one legal move = play immediately with zero search time.

Evaluation

  • Piece mobility: pseudo-legal squares per piece, excluding own pieces and enemy pawn attacks. Knight 4cp, bishop 5cp, rook 2cp, queen 1cp per square.
  • Open/semi-open files: rook bonuses for files with no pawns (+20cp) or no friendly pawns (+10cp).
  • Rook on 7th rank: +20cp bonus.
  • Bishop pair: +30cp when both bishops present.
  • Knight outposts: +20cp for knights on ranks 4-6 that cannot be attacked by enemy pawns.

Transposition Table

  • Depth-preferred replacement: shallow entries for different positions no longer evict deeper entries.
  • TTEntry::depth int8_t to uint8_t: fixes overflow at MAX_PLY (128).

Time Management

  • Base time budget increased (MOVES_TO_GO 30 to 25).
  • Progressive easy-move reduction (x0.95 per stable iteration, cumulative, cancellable).
  • AW fail-high time extension (proportional to fail-high count, capped at x1.50).
  • Time cap relaxed (remaining/3 to remaining*2/5).
  • Mate reduction only when winning (no longer triggers when being mated).
  • TM extensions now always run before checking soft_stop().
  • go depth X without clock no longer activates TM.
  • movestogo UCI parameter now parsed and used.

Infrastructure

  • bench command: 10 positions, depth 15 default. Quiet by default, bench verbose for full output.
  • FACON_DEBUG build mode: diagnostic counters compiled only with -DFACON_DEBUG=ON.


Comments