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-nodelog()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 Xwithout clock no longer activates TM.movestogoUCI parameter now parsed and used.
Infrastructure
benchcommand: 10 positions, depth 15 default. Quiet by default,bench verbosefor full output.FACON_DEBUGbuild mode: diagnostic counters compiled only with-DFACON_DEBUG=ON.

Comments
Post a Comment