First of all, my apologies for the delay - real life has been a bit hectic recently.
Sven Schüle wrote:As also noted by Michael, I would not use SEE as part of the initial move scoring since that would require to unconditionally call it for several moves even if they would never actually be searched (due to an earlier cutoff).
My logic behind that was that it would be an optimisation to postpone the SEE until it is searched because it would not have an effect on the final ordering. I wanted to check the basic idea was sound before trying to improve it.
As a first step I think that using SEE in QS to prune losing captures (restricted to higher x lower captures) should already be sufficient to see an improvement over pure MVV/LVA.
The test is still running, but:
Code: Select all
Score of SEEPrune vs MVVLVA: 116 - 133 - 104 [0.476] 353
I would not call that an improvement so far. However, I get a 36% node count reduction even with a 15% NPS reduction. So it's definitely doing something. It's just not doing enough.
In a second step SEE could also be used to postpone losing captures (and possibly losing quiet moves).
Mmm, though I do think we should get step 1 working before step 2.
In Jumbo I do both steps (only for captures higher x lower) but not exactly with SEE but with something that is both faster and less accurate. Replacing it by SEE is on my todo list.
Because Dorpsgek keeps incrementally updated attack tables, I could easily run a defender check and perhaps Hx defended L to later in the list. It's not a SEE, but it's something, and it's fast.
What about your 'att' and 'def' values, how do you handle bishop and knight in this case? Would att=knight + def=bishop trigger an SEE() call?
Yes, it would. I can try to special-case it in this situation. Might be worth a test.
Some believe in the almighty dollar.
I believe in the almighty printf statement.