Code: Select all
2 +0.76 8602 0:00.01 d5e4 f3e5
1 +0.77 8334 0:00.01 d5e4
Moderator: Ras
Code: Select all
2 +0.76 8602 0:00.01 d5e4 f3e5
1 +0.77 8334 0:00.01 d5e4
That is not the point. Captures are futile because you know the opponent would stand pat on them. And he would even do that if there was such a fork against his dangerous passers. So searching the futile move would achieve nothing, other than wasting time. It would still fail low, no matter how good it actually is. You just haven't enough depth to see it is good.Henk wrote:By the way what margin can you give in qsearch for futility. A capture may end in a fork or a connected dangerous passed pawn pair that may promote into a queen soon. So you never know if a capture is futile.
If opponent stands pat then a fork and a connected passer can still be evaluated if you don't do delta pruning. But engine must support fork recognition in evaluation.hgm wrote:That is not the point. Captures are futile because you know the opponent would stand pat on them. And he would even do that if there was such a fork against his dangerous passers. So searching the futile move would achieve nothing, other than wasting time. It would still fail low, no matter how good it actually is. You just haven't enough depth to see it is good.Henk wrote:By the way what margin can you give in qsearch for futility. A capture may end in a fork or a connected dangerous passed pawn pair that may promote into a queen soon. So you never know if a capture is futile.
Maybe best is to do the move and evaluate it but then stop and not search it further if move is futile. But you have to do that for all captures to be certain so perhaps not much gain.hgm wrote:I guess in theory it could. But it is very hard to get that right statically. (E.g. the forking piece could be soft-pinned by a Rook attacking a Knight protected only by a Knight that is overloaded by protecting another Rook against a Queen attack.) And getting it not exactly right usually does more harm than good.
But if your evaluation does contain terms like that, and they are large, you would efinitely need a large futility margin. That margin basically represents the maximum change in eval that could be brought about by move in addition to the material it captures (which you can takeinto account explicitly in a trivial way).
Of course you can use the margin as a tunable parameter, not really setting it to the worst-case eval change, but to an empirically determined optimal value. This might than prune a very small fraction of nodes that would have failed high in reality, but so many extra nodes that would have failed low that you get to search an extra ply. So that you would seach the nodes that otherwise would have unjustly been futility-pruned (plus a lot of others) at d=1 now at d=2.
Ouch just find out that tests are running only the same engine ( same source code x same source code). No wonder that nothing seems to give much improvement last weeks (or perhaps last months). So before doing any test first test your test.Henk wrote: [At least looks like SEE pruning in qSearch doe not work for Skipper. Perhaps because it's implementation is too slow. If it is not promising I remove the code. I am not interested in long test runs or small elo gains]
SEE only makes sense if it is much faster than search. Otherwise you might as well run QS.Henk wrote:At least looks like SEE pruning in qSearch doe not work for Skipper. Perhaps because it's implementation is too slow. If it is not promising I remove the code. I am not interested in long test runs or small elo gains]