In an attempt to get more efficient search trees, I would like to remove any tactical exchanges that just delay the unavoidable (perhaps even at the cost of a sacrifice) from the ply-depth count. For capture-recapture tactics this is easy enough: both the capture and the recapture can be given an extension of 1 ply. This sounds expensive, but the exchange simplifies the situation, so that in all end-leaves of that branch the QS will be that much simpler. In fact it simply advances the moves that would have been condidered in QS anyway towards the root, which is not that bad.
Unfortunately, capture-recapture tactics is not the only way to stall for time. Threat-retreat (or other modes of dealing with the threat) are just as important. But unlike captures, there is no guarantee that threats ever run out, and usually they would not be looked at in QS. This makes awarding extensions for threat-evasion a dangerous thing, and in combination with awarding extensions for the threats themselves a recipe for disaster.
One way I am using to combat this problem is to use dual accounting of ply depth. Moves of one side can then never push moves of the other side over the horizon, and threats do not need an extension (just the threat evasions). This system is very difficult to combine with hashing, though. So I am wondering if there would not be a way to keep the threat+retreat extensions under control in a single-depth accounting scheme. Does anyone have any experience with this, perhaps in the context of check + check-evasion extensions?
I realize that a sequence of checks can potentially go on for a long time, or even forever. But if this possibility occurs in the tree, and if the ability to withdraw from the check determines on which side of the window the score ends up, it seems that there is no easy way out: any work you spend on expanding the tree elsewhere is very likely to be wasted. So making a wild guess as to how this King chase will end, and then generally deepening the search until the outcome comes within the horizon seems a really bad idea. You simply have to know the outcome of this branch first, and only then you know which remaining branches of the tree need deepening, and which can be pruned. Whatever many extensions it might take, better apply that extra depth only to this branch than to the tree in general...
Would it be a solution to be extremely selective in awarding the extension for the check-evasion? For example, rely on the ordinary search depth to find a way to a safe place, and only award the extension if the PV of the subtree from this move tells us that we can?