Hippo Lite, what's really going on?

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

Moderators: hgm, Harvey Williamson, bob

Forum rules
This textbox is used to restore diagrams posted with the [d] tag before the upgrade.
Post Reply
Michael Sherwin
Posts: 2799
Joined: Fri May 26, 2006 1:00 am
Location: OH, USA

Hippo Lite, what's really going on?

Post by Michael Sherwin » Tue Oct 20, 2009 4:33 am

I found a 64bit version of Ippolit and compared its play, node rate (adjusted), depth of search and other factors to Rybka232a32 (well that is the latest version that I have) and determined to the best of my ability that they are not even close to being the same.

Subjective first conclusion: not a clone

Based on what I have read about Ippolit's parameters, it is my experience as a programmer that if you take an engine based on soundness of play and make it more aggressive and do wild pruning to gain depth, etc, you end up with a weaker engine. Not a stronger one. Is Ippolit really so "poorly tuned" that it can be this strong.

Subjective second conclusion: not a clone

I scanned both Strelka's and Ippolit's source code. Assuming that Vas has not done a complete rewrite then I give the following opinion. Nothing is the same in the two sources. The data structures are different. The style is extremely different. The move generation is very different. The search functions are not in the style of Fruit/Strelka. The utility functions are very different. The two sources do not look like they are from the same planet let alone the same country!

Objective third opinion: not a clone

---

I did this analysis quickly, so I could be wrong. But, I will be very surprised if I am.

---

The dilemma is, now anyone wishing to be competitive at the highest level, has a new starting place or a moral reason to not even try. Why? What is the injury to the honest author? Well, simple. It is the fact that others will use this source to create even stronger engines in record time. So, even if Ippolit is a clone, that will not change this moral dilemma one darn bit. All engine authors have a right to compete with each other on equal ground. That ground has just become a lot higher.

There are those that do not want the ground to be elevated. That might be the true reason behind the attempt to squash this hippo in our backyard before it's noticed.
Regards,
Mike

User avatar
Graham Banks
Posts: 30733
Joined: Sun Feb 26, 2006 9:52 am
Location: Auckland, NZ

Re: Hippo Lite, what's really going on?

Post by Graham Banks » Tue Oct 20, 2009 5:22 am

Michael Sherwin wrote:I found a 64bit version of Ippolit and compared its play, node rate (adjusted), depth of search and other factors to Rybka232a32 (well that is the latest version that I have) and determined to the best of my ability that they are not even close to being the same.

Subjective first conclusion: not a clone
It's a Rybka 3 clone, not a Rybka 2.3.2a clone. They've reverse engineered Rybka 3 as best they can. They've then tried to "fix" it and make it stronger.
However, I'm not a programmer, so somebody else could probably do a better job of explaining things.

Cheers,
Graham.
My email addresses:
gbanksnz at gmail.com
gbanksnz at yahoo.co.nz

User avatar
M ANSARI
Posts: 3278
Joined: Thu Mar 16, 2006 6:10 pm

Re: Hippo Lite, what's really going on?

Post by M ANSARI » Tue Oct 20, 2009 5:41 am

It has nothing to do with Rybka 2.3 and everything to do with Rybka 3.

Bence Laundon

Re: Hippo Lite, what's really going on?

Post by Bence Laundon » Tue Oct 20, 2009 5:49 am

Graham Banks wrote:
Michael Sherwin wrote:I found a 64bit version of Ippolit and compared its play, node rate (adjusted), depth of search and other factors to Rybka232a32 (well that is the latest version that I have) and determined to the best of my ability that they are not even close to being the same.

Subjective first conclusion: not a clone
It's a Rybka 3 clone, not a Rybka 2.3.2a clone. They've reverse engineered Rybka 3 as best they can. They've then tried to "fix" it and make it stronger.
However, I'm not a programmer, so somebody else could probably do a better job of explaining things.

Cheers,
Graham.
i don't think so, Mr. Banks. It's obviously not a Rybka 3 clone, but i am afraid to claim that Ippolit absolutely is a clone.

As we all know, some super strong engine has leaked a couple of days ago, and Ippolit must be that engine's clone instead of Rybka's clone.

Cheers again,
Bence.

Andre van Ark
Posts: 84
Joined: Fri Mar 10, 2006 8:32 am
Location: Amersfoort
Contact:

Re: Hippo Lite, what's really going on?

Post by Andre van Ark » Tue Oct 20, 2009 6:37 am

Ippolit must be that engine's clone instead of Rybka's clone
Do you believe that "That engine's clone" is original work and not a clone or a derative? from Fruit / Rybka? :roll:

Osipov Jury
Posts: 186
Joined: Mon Jan 21, 2008 1:07 pm
Location: Russia

Re: Hippo Lite, what's really going on?

Post by Osipov Jury » Tue Oct 20, 2009 7:43 am

I think, it was the decompiler.
See:

if ((tower_dynamics->flag & 128))
{
if (score > 0)
{
if (position_fixed.bitboard[enumerated_white_bright])
score -= 20 * (((((((((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) >= (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) : (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))))) <= (((((((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) >= (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) : (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3))))))))) ? (((((((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) >= (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) : (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))))) : (((((((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) >= (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) : (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3))))))))) + 10 * (((((((((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) <= (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) : (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))))) <= (((((((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) <= (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) : (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3))))))))) ? (((((((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) <= (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((A8) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((A8) & 7) - ((position_fixed.black_king) & 7)) : -(((A8) & 7) - ((position_fixed.black_king) & 7))))) : (((((((A8) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((A8) >> 3) - ((position_fixed.black_king) >> 3)) : -(((A8) >> 3) - ((position_fixed.black_king) >> 3)))))))) : (((((((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) <= (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))) ? (((((((H1) & 7) - ((position_fixed.black_king) & 7)) >= 0) ? (((H1) & 7) - ((position_fixed.black_king) & 7)) : -(((H1) & 7) - ((position_fixed.black_king) & 7))))) : (((((((H1) >> 3) - ((position_fixed.black_king) >> 3)) >= 0) ? (((H1) >> 3) - ((position_fixed.black_king) >> 3)) : -(((H1) >> 3) - ((position_fixed.black_king) >> 3)))))))));

User avatar
WinPooh
Posts: 217
Joined: Fri Mar 17, 2006 7:01 am
Contact:

Re: Hippo Lite, what's really going on?

Post by WinPooh » Tue Oct 20, 2009 7:58 am

Osipov Jury wrote:I think, it was the decompiler.
I'd say, not decompiler but code generator. And one can find samples of its input pseudo-code on the homepage of <censored> engine.

User avatar
Matthias Gemuh
Posts: 3234
Joined: Thu Mar 09, 2006 8:10 am
Contact:

Re: Hippo Lite, what's really going on?

Post by Matthias Gemuh » Tue Oct 20, 2009 7:59 am

Ippolit is a puzzle.
If this thing is a reverse-engineered Rybka 3, then Rybka 3 is NOT based on Rybka 2.3 !

Matthias.
My engine was quite strong till I added knowledge to it.
http://www.chess.hylogic.de

Michael Sherwin
Posts: 2799
Joined: Fri May 26, 2006 1:00 am
Location: OH, USA

Re: Hippo Lite, what's really going on?

Post by Michael Sherwin » Tue Oct 20, 2009 8:22 am

WinPooh wrote:
Osipov Jury wrote:I think, it was the decompiler.
I'd say, not decompiler but code generator. And one can find samples of its input pseudo-code on the homepage of <censored> engine.
The engine was originally written in "chesslanguage b" by the author. It was decompiled, probably with the symbols intact, into a Russian language C program. Then it was translated into English. The reason was to quell the cloning accusations AND/OR to make it public domain for the entire world, rather than just in Russia. This is what I gathered from their site.
Regards,
Mike

mcostalba
Posts: 2679
Joined: Sat Jun 14, 2008 7:17 pm

Re: Hippo Lite, what's really going on?

Post by mcostalba » Tue Oct 20, 2009 8:27 am

Matthias Gemuh wrote:Ippolit is a puzzle.
If this thing is a reverse-engineered Rybka 3, then Rybka 3 is NOT based on Rybka 2.3 !

Matthias.
I have looked at this engine source. I know how to program and I am almost sure it is the reverse engineered product of some other engine.

No programmer sane of mind could have ever written something like that: function factoring is horrid, variable names is misleading when not even wrong most of the times, data structures have many fields named as numeric constants (_5, _6, etc.. this is a clear sign that the "author" was not able to identify the correct meaning of the original field and so was forced to use a placeholder instead), coding style is non existing to say the least, and I could continue.

Just to make it clear for non programmers out there is like you read a Shakespeare poem full of grammatical errors and with some dumb and trivial line here and there: you can understand you are reading a very high quality material, but you also can clearly understand that this is not the original but a trivially translated copy.

Post Reply