delphi_coder wrote:No, I mean any move that caused alpha raise without checking to see if its capture or not.
Well, when you use a heuristic for picking a move after the captures have been searched, whether this is wht the CPW calls killer or history, indicating a capture would completely useless, right? Because these would have already been searched anyway. In the killer heuristic this would just put a useless duplicat in the killer slot, possibly erasing a useful non-capture. In the case of history, suggesting that a move between two given squares might be good in case the destination is empty just because it was good when the destination was occupied by a Queen also seems an invalid deduction, which will likely confuse the engine.
Yes, this is the exact thing I'm thinking about but a little bit difference is I'm considering to separate them from the good captures and put them on the end of the list because they likely seems to be the worst moves that cause material lost.
Well, 'after the non-captures' is at the end of the list, right?
TT and IID already implemented, but to be honest I'm disappointed from using TT and looking some other optimization to flee from using it. It clearly improves the search performance but sometimes I see bad failures from the engine, for example putting the queen or rook under direct attack of pawn. Its hard to investigate such bugs For me seems there is a same hash for 2 different positions sometimes.
It is not possible to measure the effect of new features when you still have bugs. The bugs will limit the performance to a certain level no matter how much you improve all other aspects of the engine. If an engine obviously blunders in a reproducible way, you should always figure out what causes it to play the move it played.
I'm wondering if implementing a bit detailed and accurate evaluation function and constructing attack maps for both side could improve move ordering. Lets say we have an square which attacked by a pawn a knight and 2 rook (or double rook) from opponent and attacked by a queen and a bishop and a rook from our side, so (by having attack maps available) we already know any move to that square is bad move and put the move to end of the move list (Or even as a higher expectation just calculate the score by material and avoid using Quiescence search at terminal nodes. Not sure if its possible to do correctly or not, Just an idea. But in case of positive answer this may help to avoid calling QS which could improve the performance significantly). Thanks for time/reply
Well, if there was a Queen on that square moving to it (i.e. capturing that Queen) would not be so bad.
What you describe is what SEE does, though. And you do need to know which pieces attack the target square, for both players, including X-ray attacks. Whether you would need a complete attack map for that is questionable: such a map would contain the information for every square (possibly even empty squares). And the first move in your static ordering for a certain position might be RxQ, gaining at least Q for R and causing a beta cutoff irrespective of what was protecting that Queen. So at which point would you calculate the attack map? If you encounter RxR amongst the captures, you would still want to search that before captures of any lesser valued piece, irrespective of what protects the Rook. Only when you encounter a move QxR amongst the captures it becomes relevant to know whether the Rook was protected. But if it was not, you gain a full Rook by it, and this would likely cause a beta cutoff. There might be a much cheaper way to figure out whether that one Rook is protected than constructing a complete attack map for the opponent.
Not that there is anything intrinsically wrong with attack maps. In fact the fastest engine design I know is based on an attack map. But even obtaining such a map through incremental update is quite expensive. So it usually only pays off if you exploit it well. E.g. you could set it up such that you could generate captures in MVV/LVA order by extracting them from the attack map, so that you could directly search them without storing in a list or sorting. And you could make a very fast SEE by indexing a table with the attacker and protector sets obtained from the map, which then tells you how much you stand to lose after the capture to it.