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.
Hippo Lite, what's really going on?
Moderators: hgm, Rebel, chrisw
-
- Posts: 3196
- Joined: Fri May 26, 2006 3:00 am
- Location: WY, USA
- Full name: Michael Sherwin
Hippo Lite, what's really going on?
If you are on a sidewalk and the covid goes beep beep
Just step aside or you might have a bit of heat
Covid covid runs through the town all day
Can the people ever change their ways
Sherwin the covid's after you
Sherwin if it catches you you're through
Just step aside or you might have a bit of heat
Covid covid runs through the town all day
Can the people ever change their ways
Sherwin the covid's after you
Sherwin if it catches you you're through
-
- Posts: 41455
- Joined: Sun Feb 26, 2006 10:52 am
- Location: Auckland, NZ
Re: Hippo Lite, what's really going on?
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.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
However, I'm not a programmer, so somebody else could probably do a better job of explaining things.
Cheers,
Graham.
gbanksnz at gmail.com
-
- Posts: 3707
- Joined: Thu Mar 16, 2006 7:10 pm
Re: Hippo Lite, what's really going on?
It has nothing to do with Rybka 2.3 and everything to do with Rybka 3.
Re: Hippo Lite, what's really going on?
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.Graham Banks wrote: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.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
However, I'm not a programmer, so somebody else could probably do a better job of explaining things.
Cheers,
Graham.
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.
-
- Posts: 91
- Joined: Fri Mar 10, 2006 9:32 am
- Location: Amersfoort
Re: Hippo Lite, what's really going on?
Do you believe that "That engine's clone" is original work and not a clone or a derative? from Fruit / Rybka?Ippolit must be that engine's clone instead of Rybka's clone
-
- Posts: 186
- Joined: Mon Jan 21, 2008 2:07 pm
- Location: Russia
Re: Hippo Lite, what's really going on?
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)))))))));
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)))))))));
-
- Posts: 267
- Joined: Fri Mar 17, 2006 8:01 am
- Location: Russia
- Full name: Vladimir Medvedev
Re: Hippo Lite, what's really going on?
I'd say, not decompiler but code generator. And one can find samples of its input pseudo-code on the homepage of <censored> engine.Osipov Jury wrote:I think, it was the decompiler.
-
- Posts: 3245
- Joined: Thu Mar 09, 2006 9:10 am
Re: Hippo Lite, what's really going on?
Ippolit is a puzzle.
If this thing is a reverse-engineered Rybka 3, then Rybka 3 is NOT based on Rybka 2.3 !
Matthias.
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
http://www.chess.hylogic.de
-
- Posts: 3196
- Joined: Fri May 26, 2006 3:00 am
- Location: WY, USA
- Full name: Michael Sherwin
Re: Hippo Lite, what's really going on?
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.WinPooh wrote:I'd say, not decompiler but code generator. And one can find samples of its input pseudo-code on the homepage of <censored> engine.Osipov Jury wrote:I think, it was the decompiler.
If you are on a sidewalk and the covid goes beep beep
Just step aside or you might have a bit of heat
Covid covid runs through the town all day
Can the people ever change their ways
Sherwin the covid's after you
Sherwin if it catches you you're through
Just step aside or you might have a bit of heat
Covid covid runs through the town all day
Can the people ever change their ways
Sherwin the covid's after you
Sherwin if it catches you you're through
-
- Posts: 2684
- Joined: Sat Jun 14, 2008 9:17 pm
Re: Hippo Lite, what's really going on?
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.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.
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.