Computer Chess Club Archives


Search

Terms

Messages

Subject: About Fafis...

Author: Alex Schmidt

Date: 13:59:07 05/27/05


After Patriot 2.0 was discovered to be a Fruit clone we searched for methods to
find out Crafty clones.

After hours of testing different methods I first created a testsuite with only
two kings on the board. Since all moves are a draw the move by the engine
depends exclusively on the movegenerator.

I tested all UCI engines and only 4 did always the same moves as Crafty.
Including Fafis X 0.2 UCI.

Of course there are not so much possibility in which order the movegenerator
generates the moves, so this means nothing.

I expanded the test with positions where many different moves are a mate in 1.
The problem with this is that even different Crafty versions play different
moves here. Only 2 UCI engines played always the same move as Crafty 19.03,
including Fafis X 0.2 UCI.

Michael Diosi and Christopher Conkie had the nice idea to try illegal positions
like this:

4QNkB/1K1K1NPR/5RRR/8/8/8/7k/8 w - - 0 1

The engine has lots of possibilities to handle this position. Most capture the
king on h2, but Crafty mates the other king with Ne6 with the score +M1. Only
two engines do the same move with the same score, including Fafis X 0.2 UCI.

Or strange legal positions like this mate in 1:

1QqQqQq1/r6Q/Q6q/q6Q/B2q4/q6Q/k6K/1qQ1QqRb w - - 0 1

Crafty calculates in the background and gives no output, like Fafis.

This all made Fafis very suspicious. We contacted the author because he was
thinking about getting commercial. After what happened with Patriot we asked him
to show his source to an expert like Dann Corbit. Rafael claimed there is no
Crafty code inside Fafis and promised to show the source before the next free or
commercial release to Dann.

Two or three days later Fafis 2.0 was out, and the source was not shown to Dann.
Maybe you remember, that was the engine with the virus.

In the meantime another one looked inside Craftys code and searched for a way
for a real proof. And he found something very interesting. Crafty has a very
special feature regarding fen positions. I will show you an example, look
exactly on the wrong fen string, and on Crafty's internal position:

White(1): setboard rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBXR w - - 0 1
White(1): display

       +---+---+---+---+---+---+---+---+
    8  |<R>|<N>|<B>|<Q>|<K>|<B>|<N>|<R>|
       +---+---+---+---+---+---+---+---+
    7  |<P>|<P>|<P>|<P>|<P>|<P>|<P>|<P>|
       +---+---+---+---+---+---+---+---+
    6  |   | . |   | . |   | . |   | . |
       +---+---+---+---+---+---+---+---+
    5  | . |   | . |   | . |   | . |   |
       +---+---+---+---+---+---+---+---+
    4  |   | . |   | . |   | . |   | . |
       +---+---+---+---+---+---+---+---+
    3  | . |   | . |   | . |   | . |   |
       +---+---+---+---+---+---+---+---+
    2  |-P-|-P-|-P-|-P-|-P-|-P-|-P-|-P-|
       +---+---+---+---+---+---+---+---+
    1  |-R-|-N-|-B-|-Q-|-K-|-B-| . |   |
       +---+---+---+---+---+---+---+---+
         a   b   c   d   e   f   g   h

White(1): setboard rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKB*R w KQkq - 0 1
White(1): display

       +---+---+---+---+---+---+---+---+
    8  |<R>|<N>|<B>|<Q>|<K>|<B>|<N>|<R>|
       +---+---+---+---+---+---+---+---+
    7  |<P>|<P>|<P>|<P>|<P>|<P>|<P>|<P>|
       +---+---+---+---+---+---+---+---+
    6  |   | . |   | . |   | . |   | . |
       +---+---+---+---+---+---+---+---+
    5  | . |   | . |   | . |   | . |   |
       +---+---+---+---+---+---+---+---+
    4  |   | . |   | . |   | . |   | . |
       +---+---+---+---+---+---+---+---+
    3  | . |   | . |   | . |   | . |   |
       +---+---+---+---+---+---+---+---+
    2  |-P-|-P-|-P-|-P-|-P-|-P-|-P-|-P-|
       +---+---+---+---+---+---+---+---+
    1  |-R-|-N-|-B-|-Q-|-K-|-B-|   |-R-|
       +---+---+---+---+---+---+---+---+
         a   b   c   d   e   f   g   h

White(1): go
ERROR!  board[6]=-4, should be 0

In the first position everything after the x in the fen string is cut off, in
the second position the x is replaced by a * and now just one piece is missing.
The * is handled as a special case in Crafty.

I tested this now with Fafis X 0.2 UCI and a corrupted fen with the
startposition:

973500>1:setboard
xnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w - - 0 1
977295>1:go
977420<1:info depth 1 seldepth 4 score cp 1 time 0 nodes 7
pv e1f2
977425<1:info nps 7 cpuload 100 tbhits 0
977429<1:info depth 2 seldepth 7 score cp 1 time 1 nodes 14
pv e1f2 e8d7
977434<1:info nps 1400 cpuload 100 tbhits 0
977437<1:info depth 3 seldepth 10 score cp 1 time 2 nodes 32
pv e1f2 e8d7 f2g3

I placed the x at the beginning of the fen string. Fafis handles this now like
an empty board, moveing the two kings -> Everything after the x is cut off.

2425051>1:setboard
*nbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w - - 0 1
2426315>1:go
2426437<1:info depth 1 seldepth 4 score cp 775 time 0 nodes
27 pv e2e4
2426442<1:info nps 27 cpuload 100 tbhits 0
2426446<1:info depth 2 seldepth 7 score cp 716 time 1 nodes
68 pv e2e4 d7d5
2426451<1:info nps 6800 cpuload 100 tbhits 0
2426456<1:info depth 3 seldepth 10 score cp 744 time 2 nodes
172 pv e2e4 d7d5 b1c3 d5e4 c3e4

After replaceing the x with the * Fafis plays now from the startposition, the
score is +7 so probably just the black rook is missing.

I did the tests with the older UCI version of Fafis because the free releases
don't support the setboard command. It is not possible to analyse positions. I
only tested the kingmoves with the free Fafis and they are the same as in
Crafty.

The strings are hidden in all Fafis versions, but a friend of us found a way to
see the strings and compared Fafis 2.1 with Crafty 18.01:

For example:

fafis.exe has : "Fafis> Error! feature %s rejected by xboard"
crafty1801n.exe has : "ERROR.  feature %s rejected by xboard".

fafis.exe has : "Fafis> Error captured a king!!"
crafty has : "captured a king"

Here is the tool:

http://www.sysinternals.com/ntw2k/freeware/procexp.shtml

I checked all UCI engines with this methods and they seem to be all clean of
Crafty code. Just with one or two I am not sure yet...

If one of you want to test WB engines, here is my epd test:

4k3/8/8/8/8/8/8/4K3 w - - 0 0 bm e1f2;
4k3/8/8/8/8/8/5K2/8 b - - 1 1 bm e8d7;
8/8/2k5/8/8/6K1/8/8 w - - 0 0 bm g3h4;
8/8/8/1k6/7K/8/8/8 w - - 0 0 bm h4h5;
8/8/8/1k5K/8/8/8/8 b - - 1 1 bm b5a4;
8/8/7K/8/k7/8/8/8 b - - 1 1 bm a4a3;
8/7K/8/8/8/8/k7/8 w - - 0 0 bm h7h8;
7K/8/8/8/8/8/k7/8 b - - 1 1 bm a2a1;
7K/8/8/8/8/8/8/k7 w - - 0 0 bm h8g8;
6K1/8/8/8/8/8/8/k7 b - - 1 1 bm a1b1;
6K1/8/8/8/8/8/8/1k6 w - - 0 0 bm g8h8;
7K/8/8/8/8/8/8/1k6 b - - 1 1 bm b1a1;
8/8/5k2/8/3K4/8/8/8 b - - 1 1 bm f6f5;
8/8/5k2/8/3K4/8/8/8 w - - 0 0 bm d4d5;
2k5/8/1K6/8/8/8/8/8 w - - 0 0 bm b6a7;
2k5/8/2K5/8/8/8/8/8 w - - 0 0 bm c6d6;
8/3k4/8/1K6/8/8/8/8 w - - 0 0 bm b5b6;

You can test an engine automatically with it, a few seconds/move are enough.

But remember: If an engine 'solves' all positions it is no evidence at all for a
clone!! It's just a little hint to take a closer look on it.

Many thanks to all helping people!!

Best,
Alex



This page took 0.06 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.