Computer Chess Club Archives


Search

Terms

Messages

Subject: Rybka - How much Fruit is inside ?

Author: Daniel Mehrmannn

Date: 17:59:08 12/11/05


Hello,

I was long thinking if i really should post that and some people giving me
warnings
to not do that, but i think i must do that to feel better.

First, don't understand me wrong, i _dont't_ say Rybka is a Fruit clone, but i'm
asking how much Fruit is inside this engine ?

Well, i tested a lot of positions and games and my result is that Rybka using at
least the PST-Tables and mobility of Fruit. Of course the author has added a lot
of additional own stuff, but basicly he's building his engine on fruit functions
or ideas.
I have no problems if someone using other ideas of programms. But i have a
problem if it so clear, in this case so much, and such engines go commercial.

Well, it's on you if you accept such commercial engines in the future or not.
Again, i don't say Rybka is a clone.

Well, you now wanna see some proves, right? I will give you only one position
where it is more clear for you. And yes there will be come a lot of people and
posting Rybka plays another style and look here and there.

Thats right so far, but i build a fruit that plays like Rybka and the output is
like rybka to show you how easy it is. (for programmers go to the bottom and
you'll see the patchfile vs Fruit 2.1 ;))

Image Fruit 2.1 with Rybka style vs Rybka:
http://www.homer-chess.com/images/fruit_r.JPG

Download Fruit 2.1 with Rybka style:
http://www.homer-chess.com/downloads.php?cat_id=8

This modified Fruit 2.1 is no new Toga or other variants. It should be only show
you how easy it is. So i don't changed the name and i don't wanna see this
engine in any rating lists or matches!

Position:

[D]r3k2r/pppppppp/8/8/8/8/PPPPPPPP/R3K2R w - -

Rybka:
CPU0: AuthenticAMD x86 Family 6 Model 10 Stepping 0 2191 MHz
GUI: Tablebases with 0 pieces found! [Cache: 64 MB + internal 0.00 MB]
Engine: Rybka 1.0 Beta 32-bit (128 MB)
by Vasik Rajlich
  3.01  0:00  +0.10  1.f3 (747) 44
  4.01  0:00  +0.03  1.f3 (1.024) 61
  5.01  0:00  +0.05  1.f3 f5 (2.674) 161
  6.01  0:00  +0.03  1.f3 f5 2.Kf2 (4.068) 126
  6.01  0:00  +0.04  1.d4 f5 2.Kd2 (6.458) 200
  7.01  0:00  +0.07  1.d4 f5 2.Kd2 Kf7 (11.620) 185
  8.01  0:00  +0.08  1.d4 f6 2.Kd2 Kf7 3.h4 (23.282) 214
  8.01  0:00  +0.10  1.f4 f6 2.a4 Kf7 3.Kf2 (47.404) 147
  9.01  0:00  +0.03  1.f4 a5 2.Kf2 d5 3.a4 Ra6 (86.735) 145
  9.01  0:00  +0.07  1.d4 f6 2.h4 Kf7 3.Kd2 Ke6 (112.356) 156
  9.01  0:01  +0.11  1.a4 e6 2.Ra3 Ke7 3.Rb3 b6 (199.745) 181
 10.01  0:02  +0.11  1.a4 h5 2.e4 Rh6 3.Ke2 e5 4.Ra3 (311.617) 150
 11.01  0:04  +0.01  1.a4 h5 2.e4 Rh6 3.Ke2 Rb6 4.Rhb1 Rc6 (531.968) 130
 11.02  0:05  +0.06  1.d4 h5 2.Kd2 f5 3.h4 Rh6 4.Rh3 Rd6 (722.902) 124
 12.01  0:10   0.00  1.d4 h5 2.Kd2 Rh6 3.h4 Rf6 4.Raf1 Ra6 5.Ra1 (1.177.495) 117
 12.03  0:14  +0.03  1.f4 h5 2.Kf2 d5 3.a4 Rh6 4.Ra3 Rf6 5.Kg3 (1.629.335) 116
 12.07  0:19  +0.11  1.h4 h5 2.Rh3 Rh6 3.Rg3 Kf8 4.Rg5 Kg8 5.d4 (2.080.151) 115
 13.01  0:22  +0.11  1.h4 h5 2.Rh3 Rh6 3.Rg3 Kf8 4.Rg5 Kg8 5.d4 Rb6 (2.430.131)
115
best move: h2-h4 time: 0:36.609 min  n/s: 107.198  nodes: 3.751.936

Fruit:
Engine: Fruit 2.1 (128 MB)
by Fabien Letouzey
  1/01  0:00   0.00  1.Rb1 (2)
  1/01  0:00  +0.01  1.Rc1 (3)
  1/01  0:00  +0.02  1.Rd1 (4)
  1/01  0:00  +0.03  1.a3 (9)
  1/01  0:00  +0.06  1.a4 (10)
  2/02  0:00   0.00  1.a4 a5 (53)
  3/04  0:00  +0.13  1.a4 a5 2.Ra3 (170)
  4/05  0:00   0.00  1.a4 a5 2.Ra3 Ra6 (332)
  5/07  0:00  +0.06  1.a4 e5 2.e4 Ke7 3.Ke2 (2.656)
  6/11  0:00   0.00  1.a4 e5 2.e4 Ke7 3.Ke2 a5 (3.661)
  7/11  0:00  +0.06  1.a4 e5 2.e4 Ke7 3.Ke2 a5 4.Ra3 (15.479)
  8/14  0:00   0.00  1.a4 e5 2.e4 Ke7 3.Ke2 a5 4.Ra3 Ra6 (23.086)
  9/15  0:00  +0.09  1.a4 e5 2.e4 Ke7 3.Ke2 a5 4.Ra3 Ra6 5.Rd3 (117.003)
 10/17  0:00  +0.05  1.a4 e5 2.e4 Ke7 3.Ke2 a5 4.Ra3 h5 5.Rc3 c6 (195.287)
 11/20  0:02  +0.12  1.a4 e5 2.e4 Ke7 3.Ra3 h5 4.Rb3 b6 5.Rc3 c6 6.Ke2 (933.172)
455
 12/24  0:03  +0.07  1.a4 d5 2.d4 Kd7 3.Ra3 a5 4.Rb3 b6 5.Kd2 h5 6.h4 e6
(1.638.551) 456
 12/24  0:06  +0.08  1.h4 d5 2.Rh3 Kd7 3.d4 a5 4.Rf3 f6 5.Kd2 e6 6.a4 h5
(2.957.473) 450
 13/24  0:11  +0.11  1.h4 h5 2.Rh3 Rh6 3.Rc3 Rc6 4.Rxc6 bxc6 5.b4 Rb8 6.Rb1 a5
7.c3 Rb5 (5.169.820) 455
 14/27  0:18  +0.11  1.h4 h5 2.Rh3 Rh6 3.Rg3 Kf8 4.Rg5 Kg8 5.d4 Rb6 6.b3 Rd6
7.Rd1 Rc6 (8.658.221) 460
best move: h2-h4 time: 0:36.469 min  n/s: 446.773  CPU 49.4%   n/s(1CPU):
904.398  nodes: 15.730.000


Fruit 2.1 patch:

diff -Pur src_org/Makefile src/Makefile
--- src_org/Makefile	2005-12-12 00:21:14.105891100 +0100
+++ src/Makefile	2005-12-12 02:04:01.806990300 +0100
@@ -30,7 +30,7 @@

 CXXFLAGS += -O3 -fstrict-aliasing
 CXXFLAGS += -fomit-frame-pointer
-CXXFLAGS += -march=i686 # SELECT ME
+#CXXFLAGS += -march=i686 # SELECT ME

 # strip

diff -Pur src_org/eval.cpp src/eval.cpp
--- src_org/eval.cpp	2005-06-17 09:41:34.000000000 +0200
+++ src/eval.cpp	2005-12-12 02:20:27.794041100 +0100
@@ -31,7 +31,7 @@

 static const int KnightUnit = 4;
 static const int BishopUnit = 6;
-static const int RookUnit = 7;
+static const int RookUnit = 6;
 static const int QueenUnit = 13;

 static const int MobMove = 1;
@@ -674,11 +674,11 @@
                if (board->pawn_file[me][rook_file] == 0) { // no friendly pawn

                   op[me] += RookSemiOpenFileOpening;
-                  eg[me] += RookSemiOpenFileEndgame;
+                  eg[me] += RookSemiOpenFileEndgame + 5;

                   if (board->pawn_file[opp][rook_file] == 0) { // no enemy pawn
                      op[me] += RookOpenFileOpening - RookSemiOpenFileOpening;
-                     eg[me] += RookOpenFileEndgame - RookSemiOpenFileEndgame;
+                     eg[me] += RookOpenFileEndgame - RookSemiOpenFileEndgame +
10;
                   }

                   if ((mat_info->cflags[opp] & MatKingFlag) != 0) {
@@ -702,7 +702,7 @@
                if ((pawn_info->flags[opp] & BackRankFlag) != 0 // opponent pawn
on 7th rank
                 || PAWN_RANK(KING_POS(board,opp),me) == Rank8) {
                   op[me] += Rook7thOpening;
-                  eg[me] += Rook7thEndgame;
+                  eg[me] += Rook7thEndgame + 30;
                }
             }

@@ -823,6 +823,7 @@

             ASSERT(piece_nb>=0&&piece_nb<16);
             op[colour] -= (attack_tot * KingAttackOpening *
KingAttackWeight[piece_nb]) / 256;
+            eg[colour] -= ((attack_tot * KingAttackOpening *
KingAttackWeight[piece_nb]) / 256) /2;
          }
       }
    }
Files src_org/fruit.exe and src/fruit.exe differ
diff -Pur src_org/pst.cpp src/pst.cpp
--- src_org/pst.cpp	2005-06-17 09:41:34.000000000 +0200
+++ src/pst.cpp	2005-12-12 02:18:01.859846700 +0100
@@ -11,6 +11,7 @@
 // macros

 #define P(piece_12,square_64,stage) (Pst[(piece_12)][(square_64)][(stage)])
+#define SQUARE_FILE(square)         ((square)&0xF)

 // constants

@@ -129,13 +130,16 @@
    // file

    for (sq = 0; sq < 64; sq++) {
-      P(piece,sq,Opening) += PawnFile[square_file(sq)] * PawnFileOpening;
+      if (SQUARE_FILE(sq) != 0x7 && SQUARE_FILE(sq) != 0x8) {
+        P(piece,sq,Opening) += (PawnFile[square_file(sq)] * PawnFileOpening) +
2;
+      } else
+      	P(piece,sq,Opening) += PawnFile[square_file(sq)] * PawnFileOpening;
    }

    // centre control

-   P(piece,D3,Opening) += 10;
-   P(piece,E3,Opening) += 10;
+   P(piece,D3,Opening) += 15;
+   P(piece,E3,Opening) += 15;

    P(piece,D4,Opening) += 20;
    P(piece,E4,Opening) += 20;
@@ -221,6 +225,21 @@
       P(piece,sq,Endgame) = (P(piece,sq,Endgame) * PieceActivityWeight) / 256;
    }

+   P(piece,G2,Opening) += 10;
+   P(piece,B2,Opening) += 10;
+   P(piece,G7,Opening) += 10;
+   P(piece,B7,Opening) += 10;
+
+   P(piece,C4,Opening) += 2;
+   P(piece,C5,Opening) += 2;
+   P(piece,D6,Opening) += 2;
+   P(piece,E6,Opening) += 2;
+   P(piece,F4,Opening) += 2;
+   P(piece,E3,Opening) += 2;
+   P(piece,F3,Opening) += 2;
+
+
+
    // rooks

    piece = WhiteRook12;
diff -Pur src_org/search.cpp src/search.cpp
--- src_org/search.cpp	2005-06-17 09:41:34.000000000 +0200
+++ src/search.cpp	2005-12-12 01:35:08.848141800 +0100
@@ -215,7 +215,7 @@
       search_update_current();

       if (DispDepthEnd) {
-         send("info depth %d seldepth %d time %.0f nodes " S64_FORMAT " nps
%.0f",depth,SearchCurrent->max_depth,SearchCurrent->time*1000.0,SearchCurrent->node_nb,SearchCurrent->speed);
+         send("info depth %d time %.0f nodes " S64_FORMAT " nps
%.0f",depth,SearchCurrent->time*1000.0,SearchCurrent->node_nb,SearchCurrent->speed);
       }

       // update search info
@@ -309,11 +309,11 @@

          if (false) {
          } else if (flags == SearchExact) {
-            send("info depth %d seldepth %d score cp %d time %.0f nodes "
S64_FORMAT " pv %s",depth,max_depth,value,time*1000.0,node_nb,pv_string);
+            send("info depth %d score cp %d time %.0f nodes " S64_FORMAT " pv
%s",depth,value > 0 ? value - 20 : value + 20,time*1000.0,node_nb,pv_string);
          } else if (flags == SearchLower) {
-            send("info depth %d seldepth %d score cp %d lowerbound time %.0f
nodes " S64_FORMAT " pv
%s",depth,max_depth,value,time*1000.0,node_nb,pv_string);
+            send("info depth %d score cp %d lowerbound time %.0f nodes "
S64_FORMAT " pv %s",depth,value > 0 ? value - 20 : value +
20,time*1000.0,node_nb,pv_string);
          } else if (flags == SearchUpper) {
-            send("info depth %d seldepth %d score cp %d upperbound time %.0f
nodes " S64_FORMAT " pv
%s",depth,max_depth,value,time*1000.0,node_nb,pv_string);
+            send("info depth %d score cp %d upperbound time %.0f nodes "
S64_FORMAT " pv %s",depth,value > 0 ? value - 20 : value +
20,time*1000.0,node_nb,pv_string);
          }

       } else {
@@ -322,11 +322,11 @@

          if (false) {
          } else if (flags == SearchExact) {
-            send("info depth %d seldepth %d score mate %d time %.0f nodes "
S64_FORMAT " pv %s",depth,max_depth,mate,time*1000.0,node_nb,pv_string);
+            send("info depth %d score mate %d time %.0f nodes " S64_FORMAT " pv
%s",depth,mate,time*1000.0,node_nb,pv_string);
          } else if (flags == SearchLower) {
-            send("info depth %d seldepth %d score mate %d lowerbound time %.0f
nodes " S64_FORMAT " pv %s",depth,max_depth,mate,time*1000.0,node_nb,pv_string);
+            send("info depth %d score mate %d lowerbound time %.0f nodes "
S64_FORMAT " pv %s",depth,mate,time*1000.0,node_nb,pv_string);
          } else if (flags == SearchUpper) {
-            send("info depth %d seldepth %d score mate %d upperbound time %.0f
nodes " S64_FORMAT " pv %s",depth,max_depth,mate,time*1000.0,node_nb,pv_string);
+            send("info depth %d score mate %d upperbound time %.0f nodes "
S64_FORMAT " pv %s",depth,mate,time*1000.0,node_nb,pv_string);
          }
       }
    }
diff -Pur src_org/search_full.cpp src/search_full.cpp
--- src_org/search_full.cpp	2005-06-17 09:41:34.000000000 +0200
+++ src/search_full.cpp	2005-12-12 02:10:10.508310300 +0100
@@ -578,7 +578,7 @@

       // futility pruning

-      if (UseFutility && depth == 1 && node_type != NodePV) {
+      if (depth < 4 && node_type != NodePV) {

          if (!in_check && new_depth == 0 && !move_is_tactical(move,board) &&
!move_is_dangerous(move,board)) {

@@ -587,7 +587,12 @@
             // optimistic evaluation

             if (opt_value == +ValueInf) {
-               opt_value = eval(board) + FutilityMargin;
+			   if (depth == 1)
+               	 opt_value = eval(board) + FutilityMargin;
+               else if (depth == 2)
+                 opt_value = eval(board) + FutilityMargin * 6;
+               else
+                 opt_value = eval(board) + FutilityMargin * 12;
                ASSERT(opt_value<+ValueInf);
             }

@@ -602,7 +607,10 @@
                   PV_CLEAR(pv);
                }

-               continue;
+			   if (depth < 3)
+               	continue;
+               else
+                depth--;
             }
          }
       }
@@ -807,7 +815,7 @@

    // init

-   SearchCurrent->node_nb++;
+   //SearchCurrent->node_nb++;
    SearchInfo->check_nb--;
    PV_CLEAR(pv);

@@ -940,7 +948,7 @@

       if (value > best_value) {
          best_value = value;
-         pv_cat(pv,new_pv,move);
+         //pv_cat(pv,new_pv,move);
          if (value > alpha) {
             alpha = value;
             best_move = move;
diff -Pur src_org/trans.cpp src/trans.cpp
--- src_org/trans.cpp	2005-06-17 09:41:34.000000000 +0200
+++ src/trans.cpp	2005-12-12 02:01:46.014217800 +0100
@@ -398,7 +398,7 @@
    // hit = double(trans->read_hit) / double(trans->read_nb);
    // collision = double(trans->write_collision) / double(trans->write_nb);

-   send("info hashfull %.0f",full*1000.0);
+   //send("info hashfull %.0f",full*1000.0);
 }

 // trans_entry()





This page took 0.03 seconds to execute

Last modified: Thu, 07 Jul 11 08:48:38 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.