Reverse Futility Pruning

From Chessprogramming wiki
Jump to: navigation, search

Home * Search * Selectivity * Pruning * Reverse Futility Pruning

Reverse Futility Pruning, (RFP, Static Null Move Pruning)
postpones a extended futility pruning (EFP) condition applied at [pre]... pre frontier nodes to skip moves inside its move loop if material balance plus gain of the move and safety margin does not improve alpha, with the "reversed" or negamaxed fail-high condition of a more reliable score minus safety margin greater or equal than beta - after making the move, and calling the child and its static evaluation. Thus, Reverse Futility Pruning relies on the null move observation, and is a generalisation of standing pat at quiescent nodes, or a special case of null move pruning without explicitly making one [1]:

Pseudo Code

int search( int alpha, int beta, ... ) {
  int eval = evaluate(...);
  int margin = ...; // e.g. 150 * depth
  if (... && eval >= beta + margin)
    return eval; // fail soft
  ...
}

Tweaks

Conditions

It is common to skip RFP when one of the following conditions are met:

  • Position is in check
  • Node type is a PV node.
  • Position is or has been a PV node.
  • TT move does not exist or is capture.

Margin Adjustments

The base RFP margin is usually a constant multiple of depth. The following additional tweaks to the RFP margin are also common in top engines.

  • Reduce RFP margin when position is improving
  • Tweak RFP margin by the aggregate history score of previous move, divided by some factor.

Return Value

Adjusting the return value of RFP is also found to gain strength in some engines. For example, some engines return (eval + beta) / 2 or beta + (eval - beta) / 3 on successful RFP.

See also

Forum Posts

References