Surprise...

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

Moderators: hgm, Rebel, chrisw

Alexander Schmidt
Posts: 1204
Joined: Thu May 10, 2007 2:49 pm

Surprise...

Post by Alexander Schmidt »

Houdini is based on Fruit.

I know, some of you don't like my kind of analysis. But after Rybka turned out to be a Fruit clone my hit rate is still 100%.

For the new readers: Based on the UCI output it is possible to compare UCI engines. The UCI output is not restricted how it sends it info strings, so the placement of the strings is completely different in nearly every UCI engine. Here I wrote some more about it: http://talkchess.com/forum/viewtopic.php?t=23029

Now to Houdini. I took a quick look on it when it appeared. I wrote here that it is a clone. Noone was really interested and I didn't care much. Now Mr. Houdart wants to earn some money with it and I publish my analysis.

For me it is clear that Houdini is based on Fruit. Just like Rybka. I will not discuss again if this is a 100% evidence. For me it is. Maybe others want to look also at it and will find more. I guess it has also parts of the ippo family included. There is no other explenation for appearing with such a strength out of nowhere. But the basis was Fruit.

Now to the comparism of the info strings. The order of the info strings is identical. Houdini sends additional nps (nodes per seconds) infos which is not really hard to implement. Some complete lines are disabled or sent at another place:

Fruit 2.1:

info depth 11
info depth 11 seldepth 24 score cp 23 time 842 nodes 861114 pv g1f3 b8c6 b1c3 g8f6 e2e3 d7d5 f1b5 c8g4 h2h3 g4f5 e1g1
info currmove c2c4 currmovenumber 15
info currmove f2f4 currmovenumber 16
info time 1014 nodes 1030000 nps 1015779 cpuload 1000

Houdini 1.0:

info depth 16
info time 4024 nodes 3314057 nps 823000 cpuload 467
info depth 16 seldepth 39 score cp 5 time 4493 nodes 3721786 nps 828000 pv e2e4 e7e5 g1f3 g8f6 b1c3 b8c6 f1c4 f8c5 e1g1 e8g8 d2d3 d7d6 c3a4 c5d4 c2c3 b7b5 c4b5
info currmove g1f3 currmovenumber 2
info currmove b1c3 currmovenumber 3
info time 5035 nodes 4172388 nps 828000 cpuload 486

(Although the depth is different, I compare only the output that appears at a special place, when the engine starts to send the currmove info)

The same without values:

Fruit 2.1:

depth
depth seldepth score cp time nodes pv
currmove currmovenumber
currmove currmovenumber
time nodes nps cpuload

Houdini 1.0:

depth
time nodes nps cpuload
depth seldepth score time nodes nps pv
currmove currmovenumber
currmove currmovenumber
time nodes nps cpuload

You can see that one line is doubled in houdini, the rest is nearly identical.

Realize that all this strings can appear at every place in the UCI output. There are no restrictions. How likely is this to happened perchance?

Also realize that this output looks different at different positions. In another position it looks like this:


Fruit 2.1:

2011-09-06 21:56:57,318<--1:info depth 34
2011-09-06 21:56:57,333<--1:info time 1014 nodes 3280000 nps 3234714 cpuload 1000
2011-09-06 21:56:57,349<--1:info depth 34 seldepth 33 score mate 10 time 1029 nodes 3342737 pv b7b6 h7g7 b6c6 g7f7 b5b6 f7e7 b6b7 e7f7 b7b8q f7g7 c6c5 g7f7 c5d6 f7g7 d6e6 g7h7 e6f6 h7h6 b8h8
2011-09-06 21:56:57,365<--1:info currmove b7c6 currmovenumber 2
2011-09-06 21:56:57,365<--1:info currmove b7c7 currmovenumber 3
2011-09-06 21:56:57,380<--1:info currmove b7a6 currmovenumber 4
2011-09-06 21:56:57,380<--1:info currmove b7c8 currmovenumber 5
2011-09-06 21:56:57,380<--1:info currmove b7a7 currmovenumber 6
2011-09-06 21:56:57,396<--1:info currmove b7b8 currmovenumber 7
2011-09-06 21:56:57,396<--1:info currmove b7a8 currmovenumber 8
2011-09-06 21:56:57,396<--1:info depth 34 seldepth 33 time 1029 nodes 3343751 nps 3249515
2011-09-06 21:56:57,411<--1:info depth 35
2011-09-06 21:56:57,411<--1:info currmove b7b6 currmovenumber 1
2011-09-06 21:56:57,411<--1:info depth 35 seldepth 33 score mate 10 time 1076 nodes 3520447 pv b7b6 h7g7 b6c6 g7f7 b5b6 f7e7 b6b7 e7f7 b7b8q f7g7 c6c5 g7f7 c5d6 f7g7 d6e6 g7h7 e6f6 h7h6 b8h8
2011-09-06 21:56:57,427<--1:info currmove b7c6 currmovenumber 2
2011-09-06 21:56:57,443<--1:info currmove b7c7 currmovenumber 3
2011-09-06 21:56:57,443<--1:info currmove b7a6 currmovenumber 4
2011-09-06 21:56:57,443<--1:info currmove b7c8 currmovenumber 5
2011-09-06 21:56:57,443<--1:info currmove b7a7 currmovenumber 6
2011-09-06 21:56:57,458<--1:info currmove b7b8 currmovenumber 7
2011-09-06 21:56:57,458<--1:info currmove b7a8 currmovenumber 8
2011-09-06 21:56:57,458<--1:info depth 35 seldepth 33 time 1076 nodes 3521461 nps 3272733
2011-09-06 21:56:57,474<--1:info depth 36

Houdini 1.0:

2011-09-06 21:57:21,681<--1:info depth 61
2011-09-06 21:57:21,747<--1:info time 4007 nodes 10707165 nps 2672000 cpuload 482
2011-09-06 21:57:21,779<--1:info depth 61 seldepth 45 score mate 10 time 4040 nodes 10798666 nps 2672000 pv b7b6 h7g7 b6c5 g7f7 c5d6 f7g7 d6e7 g7h7 b5b6 h7h6 e7f6 h6h7 b6b7 h7h6 b7b8q h6h7 b8a7 h7h6 a7g7
2011-09-06 21:57:21,794<--1:info currmove b7c6 currmovenumber 2
2011-09-06 21:57:21,799<--1:info currmove b7c7 currmovenumber 3
2011-09-06 21:57:21,804<--1:info currmove b7c8 currmovenumber 4
2011-09-06 21:57:21,809<--1:info currmove b7a6 currmovenumber 5
2011-09-06 21:57:21,814<--1:info currmove b7b8 currmovenumber 6
2011-09-06 21:57:21,819<--1:info currmove b7a7 currmovenumber 7
2011-09-06 21:57:21,824<--1:info currmove b7a8 currmovenumber 8
2011-09-06 21:57:21,829<--1:info depth 62
2011-09-06 21:57:21,834<--1:info currmove b7b6 currmovenumber 1
2011-09-06 21:57:21,898<--1:info depth 62 seldepth 45 score mate 10 time 4158 nodes 11088289 nps 2666000 pv b7b6 h7g7 b6c5 g7f7 c5d6 f7g7 d6e7 g7h7 b5b6 h7h6 e7f6 h6h7 b6b7 h7h6 b7b8q h6h7 b8a7 h7h6 a7g7
2011-09-06 21:57:21,913<--1:info currmove b7c6 currmovenumber 2
2011-09-06 21:57:21,918<--1:info currmove b7c7 currmovenumber 3
2011-09-06 21:57:21,923<--1:info currmove b7c8 currmovenumber 4
2011-09-06 21:57:21,928<--1:info currmove b7a6 currmovenumber 5
2011-09-06 21:57:21,933<--1:info currmove b7b8 currmovenumber 6
2011-09-06 21:57:21,938<--1:info currmove b7a7 currmovenumber 7
2011-09-06 21:57:21,943<--1:info currmove b7a8 currmovenumber 8
2011-09-06 21:57:21,948<--1:info depth 63

(Although the depth is different, I compare only the output that appears at a special place, when the engine starts to send the currmove info)


And again without the values:


Fruit 2.1:

depth
time nodes nps cpuload
depth seldepth score time nodes pv
currmove currmovenumber 2
currmove currmovenumber 3
currmove currmovenumber 4
currmove currmovenumber 5
currmove currmovenumber 6
currmove currmovenumber 7
currmove currmovenumber 8
depth seldepth time nodes nps
depth
currmove currmovenumber 1
depth seldepth score time nodes pv
currmove currmovenumber 2
currmove currmovenumber 3
currmove currmovenumber 4
currmove currmovenumber 5
currmove currmovenumber 6
currmove currmovenumber 7
currmove currmovenumber 8
depth seldepth time nodes nps
depth


Houdini 1.0:

depth
time nodes nps cpuload
depth seldepth score time nodes nps pv
currmove currmovenumber 2
currmove currmovenumber 3
currmove currmovenumber 4
currmove currmovenumber 5
currmove currmovenumber 6
currmove currmovenumber 7
currmove currmovenumber 8
depth
currmove currmovenumber 1
depth seldepth score time nodes nps pv
currmove currmovenumber 2
currmove currmovenumber 3
currmove currmovenumber 4
currmove currmovenumber 5
currmove currmovenumber 6
currmove currmovenumber 7
currmove currmovenumber 8
depth

Realize that the info strings in Fruit come in a different order in and after a different ammount of currmove infos in different position. In Houdini they still come in the same order as in Fruit.
User avatar
Matthias Gemuh
Posts: 3245
Joined: Thu Mar 09, 2006 9:10 am

Re: Surprise...

Post by Matthias Gemuh »

Are you saying that Robbolito borrowed its UCI output from Fruit ?
Or has original Robbolito UCI output been replaced by Fruit output ?

BTW, some people say it is acceptable that Houdini has gone commercial because Robbolito is public domain open source. See OpenChess forum, amongst others.

Houdini's output could have been coded from scratch, even if it matches Fruit output.

Matthias.
My engine was quite strong till I added knowledge to it.
http://www.chess.hylogic.de
Alexander Schmidt
Posts: 1204
Joined: Thu May 10, 2007 2:49 pm

Re: Surprise...

Post by Alexander Schmidt »

Matthias Gemuh wrote:Are you saying that Robbolito borrowed its UCI output from Fruit ?
Or has original Robbolito UCI output been replaced by Fruit output ?

BTW, some people say it is acceptable that Houdini has gone commercial because Robbolito is public domain open source. See OpenChess forum, amongst others.

Matthias.
No, the Robbo output is completely different to Fruit and Rybka.
kgburcham
Posts: 2016
Joined: Sun Feb 17, 2008 4:19 pm

Re: Surprise...

Post by kgburcham »

Alexander Schmidt wrote:
Matthias Gemuh wrote:Are you saying that Robbolito borrowed its UCI output from Fruit ?
Or has original Robbolito UCI output been replaced by Fruit output ?

BTW, some people say it is acceptable that Houdini has gone commercial because Robbolito is public domain open source. See OpenChess forum, amongst others.

Matthias.
No, the Robbo output is completely different to Fruit and Rybka.
How can that be if Robbo is from RE Rybka?
kgburcham
Uri Blass
Posts: 10306
Joined: Thu Mar 09, 2006 12:37 am
Location: Tel-Aviv Israel

Re: Surprise...

Post by Uri Blass »

Alexander Schmidt wrote:Houdini is based on Fruit.

I know, some of you don't like my kind of analysis. But after Rybka turned out to be a Fruit clone my hit rate is still 100%.
Rybka was never a fruit clone even if rybka has some code from fruit.

Rybka clearly share with fruit less than toga and I even do not see Toga as a fruit clone.
Alexander Schmidt
Posts: 1204
Joined: Thu May 10, 2007 2:49 pm

Re: Surprise...

Post by Alexander Schmidt »

Uri Blass wrote:Rybka was never a fruit clone even if rybka has some code from fruit.
.
I forgot that some have a different definition. For me is an engine that started as Fruit still a clone even if every single line is rewritten.

But OK, I don't care how you call it. You know what I mean :)
Alexander Schmidt
Posts: 1204
Joined: Thu May 10, 2007 2:49 pm

Re: Surprise...

Post by Alexander Schmidt »

kgburcham wrote:[How can that be if Robbo is from RE Rybka?
kgburcham
I never said that. Robbo started not as a decompiled Rybka imho.

http://talkchess.com/forum/viewtopic.php?t=31527
User avatar
marcelk
Posts: 348
Joined: Sat Feb 27, 2010 12:21 am

Re: Surprise...

Post by marcelk »

Matthias Gemuh wrote:BTW, some people say it is acceptable that Houdini has gone commercial because Robbolito is public domain open source. See OpenChess forum, amongst others.
I think you are referring to this thread on open-chess.

Indeed it would depend which version of RobboLito Houdini is based on. Houdini 1.5a or 2 doesn't matter that much. If one is a derived work from Robbo 0.085 and the resulting work still contains copyrightable elements, then users are entitled to the modified sources of that entire version; and the FSF would support that with their means if required. The request for sources can be made by the users, not just by the original copyright holders btw.

Otherwise there is no basis for such request and distributing binaries-only, commercially or for free, is perfectly ok. Entering in ICGA tournaments is still problematic though.

All assuming that the original RobboLito 0.084 (public domain release) is legit in the first place (I tend to believe that part), and assuming that Houdini hasn't transformed into a completely original program (that would be a harder sell).

Marcel

PS: I'm not convinced that UCI output order matching is a strong sign of copying. A quite natural explanation could be that the matching is on purpose by construction. Eg. making the UCI code by observing output of a known compliant engine instead of trying to interpret the UCI specs.
tpetzke
Posts: 686
Joined: Thu Mar 03, 2011 4:57 pm
Location: Germany

Re: Surprise...

Post by tpetzke »

I don't know whether identical UCI strings are strong evidence. My engine will look suspicious too then because when implementing the UCI protocol I was looking at the output of other engines to understand what is required (or expected) at which time in which format.

I found that easier than to make up my own mind how to interpret the UCI specification which is good but leaves room for interpretation. So I decided to follow the interpretation of fellow authors.

So the output format of my engine looks familiar although I still never copied a single line of code from somewhere else.

Thomas...
Alexander Schmidt
Posts: 1204
Joined: Thu May 10, 2007 2:49 pm

Re: Surprise...

Post by Alexander Schmidt »

tpetzke wrote:So the output format of my engine looks familiar although I still never copied a single line of code from somewhere else.
That is of course right although Fruit is very unique. And I doubt one would implement cpuload from beginning :)

But maybe you want to answer this question:

One looks at the output of Fruit. The info strings of his engine have the same order as Fruit's.

But Fruits Info strings come at a different place when analysing different positions. Would this engine still do it in the same way?

Would info string X come in one position after 2 of 20 currmoves, and in another position after 8 of 8? Or would infostring Y come in one position before the currmoves, in another not? Again: It's different with every position, but the same between Fruit and Houdini.



Fruit 2.1:

depth
time nodes nps cpuload
depth seldepth score time nodes pv
currmove currmovenumber 2
currmove currmovenumber 3
currmove currmovenumber 4
currmove currmovenumber 5
currmove currmovenumber 6
currmove currmovenumber 7
currmove currmovenumber 8
depth seldepth time nodes nps
depth
currmove currmovenumber 1
depth seldepth score time nodes pv
currmove currmovenumber 2
currmove currmovenumber 3
currmove currmovenumber 4
currmove currmovenumber 5
currmove currmovenumber 6
currmove currmovenumber 7
currmove currmovenumber 8
depth seldepth time nodes nps
depth


Houdini 1.0:

depth
time nodes nps cpuload
depth seldepth score time nodes nps pv
currmove currmovenumber 2
currmove currmovenumber 3
currmove currmovenumber 4
currmove currmovenumber 5
currmove currmovenumber 6
currmove currmovenumber 7
currmove currmovenumber 8
depth
currmove currmovenumber 1
depth seldepth score time nodes nps pv
currmove currmovenumber 2
currmove currmovenumber 3
currmove currmovenumber 4
currmove currmovenumber 5
currmove currmovenumber 6
currmove currmovenumber 7
currmove currmovenumber 8
depth