Page 1 of 1

CookieCat's early search termination

Posted: Sat Jan 07, 2012 11:14 am
by sje
CookieCat has a pair of early search termination conditions based on score and applied at the end of each completed iteration past the second iteration. The idea is to stop early if the last two iterations produced a mating score or if they produced a getting mated score.

Two questions:

1) Should the last three (or more) results be tested instead of only two?

2) Should the mate/lose distances be considered?

Code: Select all

    procedure SpookyIterationSequence;
    begin
      with ssc do
        begin

          { Initialize the iteration index }

          iter := itermin;

          { Loop with one iteration per cycle }

          while SscIsGoing&#40;ssc&#41; and &#40;iter <= itermax&#41; do
            begin

              &#123; Run one iteration &#125;

              SpookyIterate;

              &#123; Handle early mate detection &#125;

              if SscIsGoing&#40;ssc&#41; and &#40;iter > 1&#41; then
                if IsSvMating&#40;iirvec&#91;iter&#93;.sv&#41; and IsSvMating&#40;iirvec&#91;iter - 1&#93;.sv&#41; then
                  SscStop&#40;ssc, stforcedmate&#41;;

              &#123; Handle early lose detection &#125;

              if SscIsGoing&#40;ssc&#41; and &#40;iter > 1&#41; then
                if IsSvLosing&#40;iirvec&#91;iter&#93;.sv&#41; and IsSvLosing&#40;iirvec&#91;iter - 1&#93;.sv&#41; then
                  SscStop&#40;ssc, stforcedlose&#41;;

              &#123; Next iteration &#125;

              Inc&#40;iter&#41;

            end;

          &#123; Ensure search termination &#125;

          if SscIsGoing&#40;ssc&#41; then
            SscStop&#40;ssc, stlimitdepth&#41;

        end
    end; &#123; SpookyIterationSequence &#125;

Re: CookieCat's early search termination

Posted: Sat Jan 07, 2012 3:40 pm
by mcostalba
sje wrote: The idea is to stop early if the last two iterations produced a mating score or if they produced a getting mated score.
Interesting but they have no impact in engine play, when first iterations show mate/mated score is too late for anything interesting: you arrive at party ended !

Re: CookieCat's early search termination

Posted: Sun Jan 08, 2012 1:45 am
by lucasart
sje wrote:CookieCat has a pair of early search termination conditions based on score and applied at the end of each completed iteration past the second iteration. The idea is to stop early if the last two iterations produced a mating score or if they produced a getting mated score.

Two questions:

1) Should the last three (or more) results be tested instead of only two?

2) Should the mate/lose distances be considered?

Code: Select all

    procedure SpookyIterationSequence;
    begin
      with ssc do
        begin

          &#123; Initialize the iteration index &#125;

          iter &#58;= itermin;

          &#123; Loop with one iteration per cycle &#125;

          while SscIsGoing&#40;ssc&#41; and &#40;iter <= itermax&#41; do
            begin

              &#123; Run one iteration &#125;

              SpookyIterate;

              &#123; Handle early mate detection &#125;

              if SscIsGoing&#40;ssc&#41; and &#40;iter > 1&#41; then
                if IsSvMating&#40;iirvec&#91;iter&#93;.sv&#41; and IsSvMating&#40;iirvec&#91;iter - 1&#93;.sv&#41; then
                  SscStop&#40;ssc, stforcedmate&#41;;

              &#123; Handle early lose detection &#125;

              if SscIsGoing&#40;ssc&#41; and &#40;iter > 1&#41; then
                if IsSvLosing&#40;iirvec&#91;iter&#93;.sv&#41; and IsSvLosing&#40;iirvec&#91;iter - 1&#93;.sv&#41; then
                  SscStop&#40;ssc, stforcedlose&#41;;

              &#123; Next iteration &#125;

              Inc&#40;iter&#41;

            end;

          &#123; Ensure search termination &#125;

          if SscIsGoing&#40;ssc&#41; then
            SscStop&#40;ssc, stlimitdepth&#41;

        end
    end; &#123; SpookyIterationSequence &#125;
the way i do this in double-check is as follows:
if mate in X or mated in X was returned by the root search, then stop the iterative deepening look at depth X. Indeed if a search at depth 5 returns a mate in 8 (due to search extensions and/or quiescent search) we don't want to trust it. We know there is a mate, but searching up to ply 8 may refine the mating line and find a mate in 7, let's say. On the other hand if we have a mate in 4, there's no need to search to depth 15. Of course this will probably not impact elo strength, but it just makes your engine look a bit more professional...

Re: CookieCat's early search termination

Posted: Sun Jan 08, 2012 2:41 am
by sje
lucasart wrote:the way i do this in double-check is as follows:
if mate in X or mated in X was returned by the root search, then stop the iterative deepening look at depth X. Indeed if a search at depth 5 returns a mate in 8 (due to search extensions and/or quiescent search) we don't want to trust it. We know there is a mate, but searching up to ply 8 may refine the mating line and find a mate in 7, let's say. On the other hand if we have a mate in 4, there's no need to search to depth 15. Of course this will probably not impact elo strength, but it just makes your engine look a bit more professional...
Back in 1987, my program Spector used a similar scheme with the added refinement of a premature termination of an iteration if a "sufficiently fast" mate was found.

The risk, which increases with an increase in selectivity, is that what was found on one search may not be found on a another search two ply later. There are several reasons for this including an unexpected opponent reply, a tricky extension which in granted in the first search but not in the second, and a difference in time allocation.