Rofchade 1 has a minimal evaluation function which only uses  Material Values and asymmetrical Piece Square Tables(PST). It uses a tapered evaluation of Middlegame and Endgame Material and PST values. The parameters and tapering are tuned with Texel’s tuning method using quiet_labeled.epd created by Zurichess.

The main goal for  release 2.0 of Rofchade will be to add additional evaluation elements, mostly for pawn structure and King safety.

Move ordering

A staged movegenerator is used based on bitboards. The generation process is as follows:

  1. do hash move
  2. generate capture moves, categorised by SEE into good captures and bad captures.
  3. do good captures, sorted by MVV/LVA value
  4. do killermoves (2 plus killer1 from ply – 2)
  5. do bad captures sorted by MVV/LVA
  6. generate quiet moves including promotions
  7. do quiet moves sorted by history heuristics

When in check a special check evasion generator is used, with dedicated move ordering (capture of checking piece, regular captures, quiets, divided by SEE).

History heuristics is based on 2 history tables: good history for the quiet move that caused the cutoff and bad history for all quiet moves before that move (excluding killer moves).  The tables are incremented with (depth * depth) and are periodically halved in value(aging).

Countermove heuristics doesn’t seem to work for now.

Search techniques

  • PVS with aspiration
  • Separate searchroot function
  • Razoring
  • Futility pruning
  • Null move
  • IID
  • LMP
  • LMR
  • gives check with non negative see extension
  • Probcut doesn’t seem to work for now
  • Singular extension doesn’t seem to work for now

Multi threading

Multithreading is implemented via Lazy SMP. It’s based on a threadqueue of workers and a boss, which is also a worker.

The boss is responsible for the communication with the GUI, the determination of the best move among workers, and when it’s time to stop the current search. The stop moment is not only decided by the boss, the worker thread which is the first to finish a new depth may also decide to stop the search if there is no time left. Some workers calculate the position one deeper than the current regular depth. If 1 worker has already finished the depth of the current iteration, this depth is skipped.

Half of the workers use a different aspiration window from the regular aspiration window.

If  half plus 1 or more workers are already working on the current depth or higher, the next worker will start at depth plus 1.

Time management





By using Texel tuning with the positions quiet_labeled.epd from Zuriches Rofchade was able to tune the Material Values and PST, and gained about 75 to 80 Elo. A nice result with the little number of evaluation parameters Rofchade has.