Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Rybka - How much Fruit is inside ?

Author: P L Patodia

Date: 19:18:59 12/11/05

Go up one level in this thread


On December 11, 2005 at 20:59:08, Daniel Mehrmannn wrote:

>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.

As Fruit 2.1 is open source, anybody can study it and borrow idea from it. There
is no problem in borrowing ideas but if somebody borrows the code, it is wrong
ethically. It is also legally wrong if the engine go commercial.

>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 ;))

It require lot of effort and deep research to prove the point. You accept that
author has added lot of stuff inside. In the absence of source code from Vasik,
it requires lot of effort to prove anything. I don't mean it is impossible but
it is very hard. The few changes done by you in Fruit 2.1 to prove your point is
interesting but not sufficient.

Vasik can respond this message and make the things clearer.

Regards,

P L Patodia
>
>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 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

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