bob wrote:
But razoring applies to a specific move, where null-move applies to the beginning of a ply before a move is even made.
mmmmmm....I would think a bit of clarification on naming standards would help. For what I have seen (and also from the Norman example above) we have:
Razoring: when if the evaluation is very low, we don't are in check and perhaps some other condition _on the position_ not on any move, we return with a fail low value if a quick qsearch does not rise the score enough.
If razoring is passed then we generate the moves and enter the moves loop (in any program that I have seen, also in crafty). Inside the loop we get a move and then:
Futility pruning based on value: if position has a low value and the _move_ is not interesting (capture, check, etc..) we discard without testing with do_move() / undo_move() and simply pass to the next move.
LMR: if we are at the end of the move list and move is not interesting, as example does not have a good history then we search the move with reduced depth or we discard (this is also called history pruning).
So the main difference between razoring and the other pruning techniques and a difference that is easily spottable is that:
If razoring succed we RETURN from search(), while in all the other cases we CONTINUE to the next move.
As said the above example of Norman is like this, and also all the implementations of razoring that I know, mainly Glaurung one.
Still missing something ?
Thanks
Marco