Stockfish 15.1 is ready

Discussion of anything and everything relating to chess playing software and machines.

Moderators: hgm, Rebel, chrisw

Modern Times
Posts: 3557
Joined: Thu Jun 07, 2012 11:02 pm

Re: Stockfish 15.1 is ready

Post by Modern Times »

Eduard wrote: Sun Dec 18, 2022 3:28 pm The fact is that Stockfish is only optimized for Bullet. If you increase the level (or you take more cores, which is the case for me in practice) then the advantage to the previous version shrinks to zero.
It is incredibly hard to improve an engine at this level. But in line with your comments, CCRL Blitz single CPU (2'+1" games) does show steady improvement

Code: Select all

	Stockfish 15.1 64-bit	3724	+14	−14	

 	Stockfish 15 64-bit	3703	+11	−11	

 	Stockfish 14.1 64-bit	3692	+13	−13	

 	Stockfish 14 64-bit	3665	+15	−15	

     	Stockfish 13 64-bit	3639	+14	−14	
Magnum
Posts: 187
Joined: Thu Feb 04, 2021 10:24 pm
Full name: Arnold Magnum

Re: Stockfish 15.1 is ready

Post by Magnum »

Modern Times wrote: Sun Dec 18, 2022 3:42 pm
Eduard wrote: Sun Dec 18, 2022 3:28 pm The fact is that Stockfish is only optimized for Bullet. If you increase the level (or you take more cores, which is the case for me in practice) then the advantage to the previous version shrinks to zero.
It is incredibly hard to improve an engine at this level. But in line with your comments, CCRL Blitz single CPU (2'+1" games) does show steady improvement

Code: Select all

	Stockfish 15.1 64-bit	3724	+14	−14	

 	Stockfish 15 64-bit	3703	+11	−11	

 	Stockfish 14.1 64-bit	3692	+13	−13	

 	Stockfish 14 64-bit	3665	+15	−15	

     	Stockfish 13 64-bit	3639	+14	−14	
Stockfish is optimized and strong enough, if he can play always the best move with the correct evaluation and the correct wdl evaluation within 1 second.
That's not the case.
Jouni
Posts: 3315
Joined: Wed Mar 08, 2006 8:15 pm

Re: Stockfish 15.1 is ready

Post by Jouni »

Bad release timing? There is now new net nn-335a9b2d8a80.nnue, which gave +3 Elo in framework! My short test gave also gain

Code: Select all

                             
1   stockfish15.1 +net   +4  +148/=716/-136 50.60%  506.0/1000
2   stockfish15.1        -4  +136/=716/-148 49.40%  494.0/1000

Soon SF 15.1.1 :) ?
Jouni
CornfedForever
Posts: 628
Joined: Mon Jun 20, 2022 4:08 am
Full name: Brian D. Smith

Re: Stockfish 15.1 is ready

Post by CornfedForever »

Jouni wrote: Tue Dec 20, 2022 5:52 pm Bad release timing? There is now new net nn-335a9b2d8a80.nnue, which gave +3 Elo in framework! My short test gave also gain

Code: Select all

                             
1   stockfish15.1 +net   +4  +148/=716/-136 50.60%  506.0/1000
2   stockfish15.1        -4  +136/=716/-148 49.40%  494.0/1000

Soon SF 15.1.1 :) ?
Why?
Eduard
Posts: 1439
Joined: Sat Oct 27, 2018 12:58 am
Location: Germany
Full name: N.N.

Re: Stockfish 15.1 is ready

Post by Eduard »

Tested this network and it seems to work well with the latest patches (until 19 Dec 22). Maybe it's stronger than SF 15.1.
https://tests.stockfishchess.org/tests/ ... f18f86f82b
ImNotStockfish
Posts: 51
Joined: Tue Sep 14, 2021 12:29 am
Full name: .

Re: Stockfish 15.1 is ready

Post by ImNotStockfish »

Jouni wrote: Tue Dec 20, 2022 5:52 pm Bad release timing? There is now new net nn-335a9b2d8a80.nnue, which gave +3 Elo in framework! My short test gave also gain

Code: Select all

                             
1   stockfish15.1 +net   +4  +148/=716/-136 50.60%  506.0/1000
2   stockfish15.1        -4  +136/=716/-148 49.40%  494.0/1000

Soon SF 15.1.1 :) ?
If anything, a new net after 15.1 is good news so Stockfish gets a little bit closer to 15.2. Also, 15.1.1 would be a bugfix release.
Eduard
Posts: 1439
Joined: Sat Oct 27, 2018 12:58 am
Location: Germany
Full name: N.N.

Re: Stockfish 15.1 is ready

Post by Eduard »

New Master Network now
https://abrok.eu/stockfish/
mehmet123
Posts: 676
Joined: Sun Jan 26, 2020 10:38 pm
Location: Turkey
Full name: Mehmet Karaman

Re: Stockfish 15.1 is ready

Post by mehmet123 »

After Stockfish 15, ~ 30 green patches had been added to Stockfish. Elo progress is ~6 elo at VLTC( 8 cores /30 sec +0.3) tests. Elo progress at rapid/ long time games most likely below 5 elo. If all these green patches are retested within at least 5 minutes of test condition, patches that weaken Stockfish may be detected as game time increases.
Eduard
Posts: 1439
Joined: Sat Oct 27, 2018 12:58 am
Location: Germany
Full name: N.N.

Re: Stockfish 15.1 is ready

Post by Eduard »

The new green net makes Stockfish a bit stronger positionally, but tactically it seems a bit weaker than the previous green net (and older nets). This is no wonder because it was trained with Lc0 games. Overall, I'm a bit disappointed with the development. Stockfish gets more and more Lc0 character.
RubiChess
Posts: 605
Joined: Fri Mar 30, 2018 7:20 am
Full name: Andreas Matthies

Re: Stockfish 15.1 is ready

Post by RubiChess »

mehmet123 wrote: Wed Dec 21, 2022 10:02 pm After Stockfish 15, ~ 30 green patches had been added to Stockfish. Elo progress is ~6 elo at VLTC( 8 cores /30 sec +0.3) tests. Elo progress at rapid/ long time games most likely below 5 elo. If all these green patches are retested within at least 5 minutes of test condition, patches that weaken Stockfish may be detected as game time increases.
Thank god we have you throwing your magic dice that show you how to tweak the Stockfish parameters for a real real strong VVVVLTC engine.
BTW: Afaik including your object files is not necessary for GPL compliance.

Code: Select all

Nur in SRC-1.1/src: benchmark.o.
Nur in SRC-1.1/src: bitbase.o.
Nur in SRC-1.1/src: bitboard.o.
Nur in SRC-1.1/src: endgame.o.
diff -ur SRC-1.0a/src/evaluate.h SRC-1.1/src/evaluate.h
--- SRC-1.0a/src/evaluate.h	2022-11-19 21:38:06.000000000 +0100
+++ SRC-1.1/src/evaluate.h	2022-12-21 17:08:53.000000000 +0100
@@ -39,7 +39,7 @@
   // The default net name MUST follow the format nn-[SHA256 first 12 digits].nnue
   // for the build process (profile-build and fishtest) to work. Do not change the
   // name of the macro, as it is used in the Makefile.
-  #define EvalFileDefaultName   "nn-154550620475.nnue"
+  #define EvalFileDefaultName   "nn-335a9b2d8a80.nnue"
 
   namespace NNUE {
 
Nur in SRC-1.1/src: evaluate_nnue.o.
Nur in SRC-1.1/src: evaluate.o.
Nur in SRC-1.1/src: half_ka_v2_hm.o.
Nur in SRC-1.1/src: main.o.
Nur in SRC-1.1/src: material.o.
diff -ur SRC-1.0a/src/misc.cpp SRC-1.1/src/misc.cpp
--- SRC-1.0a/src/misc.cpp	2022-11-21 19:41:46.000000000 +0100
+++ SRC-1.1/src/misc.cpp	2022-12-21 17:58:32.000000000 +0100
@@ -68,7 +68,7 @@
 namespace {
 
 /// Version number or dev.
-const string version = "1.0";
+const string version = "1.1";
 
 /// Our fancy logging facility. The trick here is to replace cin.rdbuf() and
 /// cout.rdbuf() with two Tie objects that tie cin and cout to a file stream. We
Nur in SRC-1.1/src: misc.o.
Nur in SRC-1.1/src: movegen.o.
Nur in SRC-1.1/src: movepick.o.
Nur in SRC-1.1/src: pawns.o.
Nur in SRC-1.1/src: polybook.o.
Nur in SRC-1.1/src: position.o.
Nur in SRC-1.1/src: psqt.o.
diff -ur SRC-1.0a/src/search.cpp SRC-1.1/src/search.cpp
--- SRC-1.0a/src/search.cpp	2022-11-21 18:31:06.000000000 +0100
+++ SRC-1.1/src/search.cpp	2022-12-21 18:27:03.000000000 +0100
@@ -787,7 +787,7 @@
     // Use static evaluation difference to improve quiet move ordering (~3 Elo)
     if (is_ok((ss-1)->currentMove) && !(ss-1)->inCheck && !priorCapture)
     {
-        int bonus = std::clamp(-19 * int((ss-1)->staticEval + ss->staticEval), -1925, 1925);
+        int bonus = std::clamp(-19 * int((ss-1)->staticEval + ss->staticEval), -1935, 1935);
         thisThread->mainHistory[~us][from_to((ss-1)->currentMove)] << bonus;
     }
 
@@ -804,7 +804,7 @@
     // If eval is really low check with qsearch if it can exceed alpha, if it can't,
     // return a fail low.
         if (   depth < 8
-            && eval < alpha - 312 - 260 * depth * depth)
+            && eval < alpha - 319 - 260 * depth * depth)
         {
         value = qsearch<NonPV>(pos, ss, alpha - 1, alpha);
         if (value < alpha)
@@ -822,7 +822,7 @@
     // The depth condition is important for mate finding.
     if (   !ss->ttPv
         &&  depth < 8
-        &&  eval - futility_margin(depth, improving) - (ss-1)->statScore / 303 >= beta
+        &&  eval - futility_margin(depth, improving) - (ss-1)->statScore / 298 >= beta
         &&  eval >= beta
         &&  eval < 28031) // larger than VALUE_KNOWN_WIN, but smaller than TB wins
         return eval;
@@ -833,7 +833,7 @@
         && (ss-1)->statScore < 16979
         &&  eval >= beta
         &&  eval >= ss->staticEval
-        &&  ss->staticEval >= beta - 20 * depth - improvement / 13 + 225 + complexity / 24
+        &&  ss->staticEval >= beta - 20 * depth - improvement / 13 + 220 + complexity / 24
         && !excludedMove
         &&  pos.non_pawn_material(us)
         && (ss->ply >= thisThread->nmpMinPly || us != thisThread->nmpColor))
@@ -877,7 +877,7 @@
         }
     }
 
-    probCutBeta = beta + 189 - 49 * improving;
+    probCutBeta = beta + 189 - 51 * improving;
 
     // Step 10. ProbCut (~4 Elo)
     // If we have a good enough capture and a reduced search returns a value
@@ -946,7 +946,7 @@
 moves_loop: // When in check, search starts here
 
     // Step 12. A small Probcut idea, when we are in check (~0 Elo)
-    probCutBeta = beta + 424;
+    probCutBeta = beta + 428;
     if (   ss->inCheck
         && !PvNode
         && depth >= 2
@@ -1041,7 +1041,7 @@
                   && !PvNode
                   && lmrDepth < 7
                   && !ss->inCheck
-                  && ss->staticEval + 204 + 195 * lmrDepth + PieceValue[EG][pos.piece_on(to_sq(move))]
+                  && ss->staticEval + 224 + 188 * lmrDepth + PieceValue[EG][pos.piece_on(to_sq(move))]
                    + captureHistory[movedPiece][to_sq(move)][type_of(pos.piece_on(to_sq(move)))] / 6 < alpha)
                   continue;
 
@@ -1065,7 +1065,7 @@
               // Futility pruning: parent node (~9 Elo)
               if (   !ss->inCheck
                   && lmrDepth < 13
-                  && ss->staticEval + 120 + 139 * lmrDepth + history / 52 <= alpha)
+                  && ss->staticEval + 135 + 133 * lmrDepth + history / 52 <= alpha)
                   continue;
 
               // Prune moves with negative SEE (~3 Elo)
@@ -1106,7 +1106,7 @@
 
                   // Avoid search explosion by limiting the number of double extensions
                   if (  !PvNode
-                      && value < singularBeta - 21
+                      && value < singularBeta - 32
                       && ss->doubleExtensions <= 9)
                       extension = 2;
               }
@@ -1131,7 +1131,7 @@
           // Check extensions (~1 Elo)
           else if (   givesCheck
                    && depth > 9
-                   && abs(ss->staticEval) > 81)
+                   && abs(ss->staticEval) > 84)
               extension = 1;
 
           // Quiet ttMove extensions (~0 Elo)
@@ -1204,14 +1204,14 @@
               r--;
 
           // Increase reduction if next ply has a lot of fail high
-          if ((ss+1)->cutoffCnt > 2 && !PvNode)
+          if ((ss+1)->cutoffCnt > 4 && !capture)
               r++;
 
           ss->statScore =  2 * thisThread->mainHistory[us][from_to(move)]
                          + (*contHist[0])[movedPiece][to_sq(move)]
                          + (*contHist[1])[movedPiece][to_sq(move)]
                          + (*contHist[3])[movedPiece][to_sq(move)]
-                         - 4433;
+                         - 4388;
 
           // Decrease/increase reduction for moves with a good/bad history (~30 Elo)
           r -= ss->statScore / (16434 - 5880 / depth);
@@ -1229,9 +1229,11 @@
               // Adjust full depth search based on LMR results - if result
               // was good enough search deeper, if it was bad enough search shallower
               const bool doDeeperSearch = value > (alpha + 64 + 11 * (newDepth - d));
+              const bool doEvenDeeperSearch = value > alpha + 582 && ss->doubleExtensions <= 5;
               const bool doShallowerSearch = value < bestValue + newDepth;
-              newDepth += doDeeperSearch - doShallowerSearch;
+              ss->doubleExtensions = ss->doubleExtensions + doEvenDeeperSearch;
 
+              newDepth += doDeeperSearch - doShallowerSearch + doEvenDeeperSearch;
 
             if(newDepth>d)
               value = -search<NonPV>(pos, ss+1, -(alpha+1), -alpha, newDepth, !cutNode);
Nur in SRC-1.1/src: search.o.
Nur in SRC-1.1/src: tbprobe.o.
Nur in SRC-1.1/src: thread.o.
Nur in SRC-1.1/src: timeman.o.
Nur in SRC-1.1/src: tt.o.
Nur in SRC-1.1/src: tune.o.
Nur in SRC-1.1/src: uci.o.