Razoring


 * Home * Search * Selectivity * Reductions * Razoring**
 * [[image:William_of_Ockham_-_Logica_1341.jpg link="https://commons.wikimedia.org/wiki/File:William_of_Ockham_-_Logica_1341.jpg"]] ||~  || Unlike Alpha-Beta, classical **Razoring** prunes branches forward, if the static evaluation of a move is less than or equal to Alpha. It assumes that from any given position my opponent will be able to find at least one move that improves his position, the Null Move Observation.

There are various implementations of Razoring, somehow diminishing pruning and reductions near the horizon. Razoring either prunes forward based on a reduced search, even the quiescence search, or it reduces based on evaluation or quiescence search as well. || toc =Razoring at Pre Frontier Nodes= The idea introduced by John Birmingham and Peter Kent was applied at so-called pre frontier ( depth = 2 ) expected All-Nodes. Before searching deeper, all moves were generated, made, evaluated, unmade and then inserted inside a sorted move list. While fetching the sorted moves in decreasing order - as long as the evaluation of each move exceeds alpha - they were tried as usual. Once a move statically does no longer improve alpha, this and all further moves (sorted below) are pruned without any further investigation.
 * [|Occam's razor] ||~  ||^   ||

=Deep Razoring= There is even a more aggressive pruning technique at depth = 4 nodes, called Deep Razoring. The weaker assumption is my opponent will be able to improve his position with a //yourmove-mymove-yourmove// sequence.  =Limited Razoring= Ernst A. Heinz introduced //Limited Razoring//, pushing the idea of futility pruning one step further to pre-pre-frontier nodes ( depth = 3 ), he combines it with the depth-reduction mechanism of deep razoring. code format="cpp" fscore = mat_balance(current) + razor_margin; if (!extend && (depth == PRE_PRE_FRONRIER) && (fscore <= alpha) && (opposing_pieces(current) > 3)  ) depth = PRE_FRONRIER; code

=Amir Ban's Definition= Amir Ban in a CCC discussion with Robert Hyatt on Razoring versus Pruning :

=Implementations=

Crafty 15.17
This code snippet appears in Crafty 15.17 (~1998) with fractional reductions based on evaluation at pre frontier nodes ( depth = 2 ), already controversially discussed between Vincent Diepeveen and Robert Hyatt in 2002 : code format="cpp" /* -- --     if (depth<3*INCREMENT_PLY && depth>=2*INCREMENT_PLY &&          !tree->in_check[ply] && extensions == -60) { register int value=-Evaluate(tree,ply+1,ChangeSide(wtm),                                    -(beta+51),-(alpha-51)); if (value+50 < alpha) extensions-=60; } code
 * now we toss in the "razoring" trick, which simply says |
 * if we are doing fairly badly, we can reduce the depth |
 * an additional ply, if there was nothing at the current |
 * ply that caused an extension.                         |
 * ply that caused an extension.                         |

Dropping into Q-search
A different razoring approach was proposed by Robert Hyatt in CCC based on an idea by Tord Romstad, and abandoned in Crafty after cluster testing. Dropping into the quiescence search is intended inside a PVS framework at strong expected All-nodes near the tips (pre-pre-frontier nodes or below, depth <= 3 ), that is a null window ( alpha = beta - 1 ) is passed, and the static evaluation is by a margin (~three pawns) below beta (or <= alpha). If under these conditions the quiescence search confirms the fail-low characteristics, its score is trusted and returned. code format="cpp" /* if (razoring_allowed && depth <= razor_depth) { if (alpha == beta - 1) { // null window ? if (Evaluate(tree, ply, wtm, alpha, beta) + razor_margin < beta) { // likely a fail-low node ? value = QuiesceChecks(tree, alpha, beta, wtm, ply); if (value < beta) return value; // fail soft }  } } code
 * now we try a quick Razoring test. If we are within 3    *
 * plies of a tip, and the current eval is 3 pawns (or     *
 * more) below beta, then we just drop into a q-search     *
 * to try to get a quick cutoff without searching more in  *
 * a position where we are way down in material.           *
 * to try to get a quick cutoff without searching more in  *
 * a position where we are way down in material.           *

Strelka
Similar code appears in Jury Osipov's open source engine Strelka 2.0, failing a bit harder. The interesting thing is the missing new_value < beta condition in the depth = 1 case. If the static evaluation indicates a fail-low node, but q-search fails high, the score of the reduced fail-high search is returned, since there was obviously a winning capture raising the score, and one assumes a quiet move near the horizon will not do better.

//Strelka.c line 393// (slightly modified for clarification) user:GerdIsenberg code format="cpp" value = eval + 125; if (value < beta) { if (depth == 1) { new_value = qsearch(...); return max(new_value, value); }   value += 175; if (value < beta && depth <= 3) { new_value = qsearch(...); if (new_value < beta) return max(new_value, value); } } code In the Rybka Forum thread on Strelka 2.0, Anthony Cozzie states on this feature :

=See also= Classical Razoring is known for being risky. It likely was a progress in Shannon Type-B programs and a fixed width. Todays programs more likely rely on:
 * Futility Pruning
 * Extended Futility Pruning
 * AEL-Pruning
 * Null Move Pruning
 * and various Reductions (and Extensions) depending on depth left, and probably expected node type.

=Publications=
 * John Birmingham, Peter Kent (**1977**). //Tree-searching and tree-pruning techniques//. Advances in Computer Chess 1, reprinted 1988 in Computer Chess Compendium
 * Ernst A. Heinz (**1998**). //[|Extended Futility Pruning].// ICCA Journal, Vol. 21, No. 2, including [|Limited Razoring at Pre-Pre-Frontier Nodes]

=Forum Posts=

1995 ...

 * [|limited razoring question] by Werner Inmann, CCC, October 03, 1998
 * [|Razoring?] by Steve Maughan, CCC, January 26, 1999
 * [|razoring?] by Scott Gasch, CCC, August 16, 1999

2000 ...

 * [|razoring in crafty version 16.9, mid 1999] by Vincent Diepeveen, August 21, 2002

2005 ...

 * [|Razoring...] by Robert Hyatt, CCC, October 09, 2008
 * [|futility pruning - razoring] by Don Dailey, CCC, September 16, 2009 » Futility Pruning
 * [|Futility pruning, Ext futility pruning and Limited Razoring] by Jesper Nielsen, CCC, November 26, 2009

2010 ...

 * [|Bad Pruning] by Onno Garms, CCC, March 13, 2011 » Onno
 * [|Re: Still waiting on Ed] by Robert Hyatt, OpenChess Forum, July 07, 2011 » on Crafty 22.1 vs. 23.4. differences
 * [|futility pruning, razoring question] by Marco Belli, CCC, April 04, 2012 » Futility Pruning
 * [|Razoring / Lazy eval question] by Jerry Donald, CCC, November 24, 2012 » Lazy Evaluation
 * [|Null move, razoring and mate threats] by Jon Dart, CCC, October 28, 2013 » Null Move Pruning

2015 ...

 * [|Razoring vs Futility pruning] by Shawn Chidester, CCC, August 16, 2015 » Futility Pruning
 * [|Verification of pruning techniques] by Shawn Chidester, CCC, October 04, 2015 » Pruning

=External Links= > Frank Zappa, [|Warren Cuccurullo], [|Denny Walley], [|Ike Willis], [|Tommy Mars], [|Peter Wolf], [|Arthur Barrow], Vinnie Colaiuta, [|Ed Mann] > media type="youtube" key="dp93bcp4HCM" width="560"
 * [|Razor from Wikipedia]
 * [|Razor Blade from Wikipedia]
 * [|Razor (hair) cut from Wikipedia]
 * [|Razoring] from [|Library and Information Science Wiki]
 * [|UNISYS-History - A 1955 Remington Rand electric shaver]
 * [|Philishave from Wikipedia]
 * [|Occam's razor from Wikipedia]
 * Frank Zappa - [|Occam's Razor] from [|One Shot Deal], [|YouTube] Video

=References= =What links here?= include page="Razoring" component="backlinks" limit="80"
 * Up one Level**