You continue to show you have NO IDEA how rotated bitboards work. That "attacks" variable used does not just "appear" out of the clear blue sky. It has to be computed with some expensive operations. Yet you CONTINUE to say "4 loops replaced by one instruction." Outright false. If using popcnt() makes Vas a better engineer, I was a better engineer 30 years prior to him, because we used that SAME instruction on the Cray series of computers, the first computers to have a popcnt instruction. This has NOTHING to do with "better engineering". Vas took an idea that has been around for (at the time) 40 years (bitboards). And some things are faster using them, some things are not.Rebel wrote:First, how about some common sense ?bob wrote:First, how about some correctness. On mobility, it is NOT "one instruction in Rybka." Done pointed this out a half-dozen times. Where does "attacks" come from? A pair of complex table lookups that involve taking two different 64 bit values, shifting, then anding, then indexing into two separate (and large) arrays. That is not "one instruction." Now you have the "attacks" variable that has the set of attacked squares. So how about keeping things technically accurate as opposed to distorted to make Rybka look far different than Fruit. The mobility is quite simple. Agreed. It is less simple if the multipliers are proportional. It is less simple if it is done for all pieces (where some programs do it just for one or two pieces). It is less simple if there are other ways to do mobility that are different. We are talking about the "entire picture" here. Not the 4 loops in Fruit, or the pair of rotated bitboard move generations in Rybka + a popcnt instruction. The whole picture. And they both look like a Mona Lisa.Rebel wrote:And there we go again.bob wrote: The most likely scenario is that the code was copied,
1. When you point out that Rybka evaluates different than Fruit, the most likely scenario is that it is just a speed-up.
2. When you point out it would be flat-out proof if Fruit's QUAD function would have been in Rybka but it is not, then again, a speed-up!
3. When you point out that 4 expensive loops in Fruit that calculate mobility is actually one instruction in Rybka then the explanation is bit-boards.
There is ALWAYS a most likely scenario (to use your own words) why things are different in Fruit and Rybka.
The premise is, whatever differences are found Vas copied Fruit because we will find a most likely scenario.
That's not objective.
I could go on with more than 20 of such points.
How many are needed for a different look ?
40.. 60.. ?
FRUIT:RYBKA: (taken from Zach's document)Code: Select all
case Bishop64: // mobility mob = -BishopUnit; for (to = from-17; capture=board->square[to], THROUGH(capture); to -= 17) mob += MobMove; mob += unit[capture]; for (to = from-15; capture=board->square[to], THROUGH(capture); to -= 15) mob += MobMove; mob += unit[capture]; for (to = from+15; capture=board->square[to], THROUGH(capture); to += 15) mob += MobMove; mob += unit[capture]; for (to = from+17; capture=board->square[to], THROUGH(capture); to += 17) mob += MobMove; mob += unit[capture];
Common sense states that when you write code 10-20 times faster, pack 4 expensive loops into 1 instruction you are the better engineer. Furthermore there is no copyright on chess knowledge, no copyright on commonly used concepts such as mobility especially not when it's explained in detail on the Wiki chess pages.Code: Select all
mob = popcnt(attacks & ~own_pieces);
http://chessprogramming.wikispaces.com/Mobility
OK, your version of "Occam's Razor" vs mine.Second, your goal appears to be to dream up wildly implausible explanations (0.0 is an example) as opposed to "Occam's Razor" and realizing that the simplest and most believable explanation is likely the correct one. The chance of so many implausible explanations being true is essentially zero, as you multiply all the probabilities, and the more there are, the smaller the resulting probability since all are less than .5 in reality.
http://www.top-5000.nl/evidence.htm#C6
Chapter 6 - The notorious 0.0 case.
It's about time-control and the accusation that Vasik "copied" that from FRUIT.
In a nutshell:
FRUIT's time control is fully FLOAT based;
RYBKA's time control is fully INT based.
And yet in RYBKA's time-control a FLOAT value is found -> 0.0 which is odd indeed.
The accusation is that Vasik "copied" the FRUIT time-control, converted FLOAT to INT to obfuscate (there is that pesky word again) the FRUIT origins. But in the process Vasik overlooked one instruction, the 0.0 and so a trace of copying was left.
Its rebuttal:
From the open sources I studied, some even before Rybka appeared, have a Fruit alike floating point driven time control that can deal with 1/10 or 1/100 of a second, an integer driven time control certainly can not. It's only logical to program your time control with decimals unless you want to lose long blitz games on time or make strange concessions during the very last seconds on the clock.
Interesting and silly comment (integer can not deal with .01 seconds.) You DO realize that the operating systems (both windows AND unix) use integers to report time, exclusively? My timing resolution is 0.01 seconds. I use integers. So that statement is purely nonsense. AGAIN. Why don't you look up the system calls to obtain time on windows and unix. You can get microsecond accuracy "using integers". In fact, you can ONLY use integers to access system time information. System doesn't report it in floating point values. Your entire argument, specious and irrelevant in the extreme. As usual. You make an absolute statement as fact, when it is exactly the opposite (can't use integers to measure time in .01 second intervals). You can ONLY use integers, in fact, unless you convert after obtaining the time from the system. Jeez, the stupid statements you make to try to explain away the unexplainable...
If Vas copied Fruit then why did he move from a superior (float) time control to an inferior (integer) time control with known issues? This makes absolutely no sense.
Because integers is the ONLY way to access system time, perhaps??? Anything else requires a conversion from integer to float, perhaps???
A "." that requires an incredibly implausible set of actions to introduce in the first place? Maybe a space alien slipped in and hit the "." key with a ray gun while Vas was typing, but had looked down to pick up a soft drink or something?
But far more important
Compile the following code with any of the MS compilers.
static int T=1;
void main() { if (T >= 0. ) T=5; }
It will produce the same code as 0.0
or compile
static int T=1;
void main() { if (T >= .0 ) T=5; }
It will produce the same code as 0.0
Meaning the 0.0 accusation falls apart, what was strong evidence for 4-5 years is now minimized to overlooking a dot typo.
Missing 1 pixel on a 1920 - 1080 screen.
That's no good reason to strip someone of 4 world titles and brand him as a fraud in the worldwide media.
By own experience I know the impact 0.0 had on me, an atomic bomb and from talks with other chess programmers I know they took the same road as me, after the 0.0 revelation suddenly programmers started to take the accusations more seriously.
But only a dot can be proven.
No FRUIT copying.
I recently had a discussion with Vas and on this issue and he said:
There isn't much I can help with here. I don't know where the 0.0 came from. It's definitely weird/wrong.
Rybka was UCI from the beginning, even back when everybody was using WinBoard. I would say that every two to three years I do a big cleanup of this code. This might take a few hours, and then I won't touch it until the next time. My first UCI parser actually used inheritance, I was extending UCI to do some testing, but that was gone even before Rybka 1.
Best regards,
Vas
I have checked Vas' words. Indeed the pre-Rybka version 1.6.1 which Vas entered in a tournament without permission of Crafty author Robert Hyatt is UCI. Crafty since day one is Winboard only. Meaning Vas wrote his own time control long before Fruit 2.1 appeared. Furthermore the pre-Rybka 1.16.1 contains on 18 occasions an odd kind of flag with the value "0x7fffffff" also one in the UCI time control.
Or meaning he copied an even EARLIER version of Fruit's UCI code?
Adding one line inside a block of 20 lines means the other 20 could not be copied? On which planet is that true, exactly???
As "999999" is a signature of Crafty "0x7fffffff" is a signature of Rybka. Checking Rybka 1.0 beta for "0x7fffffff" the value only appears 2 times, one again in the UCI time control. The evidence is presented here, a more detailed explanation here.
As "0x7fffffff" is not found in Crafty or Fruit it's safe to conclude Vas wrote his own time control and the accusation Vas copied Fruit's time control, converted float to int to hide the Fruit origin is pretty much debunked.