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