I think you are anal about being consistentbob wrote:This is not about being "anal". It is about being consistent.Don wrote:Bob, I think you are too anal about this. Every extension in any program is arbitrary. And so is the margin Hsu uses to test for singularity. I could use your same argument and say that it doesn't make sense to extend a move just because it happens to be 50 points better than the others, but not extend it if it's 49 points better - it seems rather arbitrary but some value has to be chosen.bob wrote:I didn't say 20% were extended. I simply said that out of the total tree space of size N, only 20% of those nodes can be considered for the TT extension. The other 80% have no chance, even though many of those are relevant positions with good moves that deserve extension. This somewhat randomly chooses 20% of the search space for possible extension consideration, which seems way too ad-hoc to me.mcostalba wrote:We are now doing a test with exclusion search disabled. This is done for an unrelated aim, but it happens match is ongoing just in these daysDon wrote: I have heard that in stockfish it only make a very small difference but I don't know first-hand.
So we could provide our test results as soon test finishes.
Regarding point raisen by Bob, I agree that is not fully clear to us why SE works, but it works. It seems we are much more careful then Bob on the assumption: "If I don't understand why it should work then it does not work"but actually he has also much more experience then us.
Anyhow, just to come back to something practical, the argument of the 20% of TT hits is bogus because we should consider only the hit rate for nodes elegible for SE, and so for high depth nodes (in SF 8 plyes and higher).
In Hsu's implementation, which I mirrored (with great difficulty and effort) in the last two years of Cray Blitz, he took great pains to avoid being inconsistent about when a move is extended and when it is not. This approach (tt-extension) totally ignores any semblance of "fairness" about what gets extended vs what is not vs what can never be extended (if it isn't in the table at all).
There is also the point that the same move in the same position may get extended on this iteration but not on the next. Or not when it occurs in another part of the tree. I don't have an a pirori reason to believe that is a bad thing. If I can extend only 20% of the moves that really need to be extended that is better than zero percent isn't it?
I don't believe you can build a strong chess program that is "correct." You can solve the GHI problem, but at the expense of a much weaker program. If you want a "correct" program then you cannot use LMR either, because the first move might change, and the move ordering can be arbitrary from node to node and the window can change after any move.
I don't see any problem with this, unless of course it just doesn't test well for you which seems to be the case. I'm more interested in why it works for some and not others.

Seriously, I don't think it matters here. I believe if I were to flip a coin to determine whether to do check extensions it would still be much stronger than not doing them. If I can be consistent of course I would try to be. But you take what you can get.
The reason you use the hash table move is because it provides you with a score - to test for singularity you don't have to first evaluate the move you are testing and then the siblings. The hash table move is not special except for the fact that a score is available that you can work with.
It's not random, it's just not perfect. In fact it's far from random. It's a proven best move. It's like hiring someone to work for you. You check their references and make a judgement and hope you picked the best candidate. That's not random, but it's not perfect either. But it's far better than actually picking a candidate randomly.Any reasonable criterion could work for selecting moves to extend or reduce. But what about a random one?
In PV nodes what is found in the TT is very likely to be the best move - especially if it's singular.
Nobody says everything has to be correct, but when you extend checks, do you extend them all, or just the ones that were TT hits? I don't extend 'em all, but I am consistent in why (SEE score). But something tells me that it would be much less effective to extend a random check here and there as opposed to extending some consistent set of checks (possibly all). Extending random checks might provide some very small benefit, or it might hurt in the cases where you extend a bad one and don't extend an important one...
That was my point. What is found in the TT is pretty random. That certainly doesn't seem like a reasonable way to select a set of positions for potential extension.
I tried testing the first move always for singularity, by first doing a reduced depth search to get a score (IID style) and then using a zero window search on the siblings. That's a consistent way to do it, but it did not seem to work for me. I don't know why it's better to just use the hash table score.
Again, an opinion based on testing, with some supporting results, but still just an opinion, not a statement of fact. It might work for some. It didn't do anything for Crafty (didn't hurt, but didn't help). Was a minimal improvement for stockfish. Not much else I can say...