syzygy wrote:User923005 wrote:Do you know what it means that an algorithm is not protected by a copyright?
I certainly do understand that mere ideas are not copyrightable and that only the expression is. Maybe we have a misunderstanding: for me the "blueprint" of a sailboat are the drawings based on which the sailboat is constructed.
It means that I can use exactly the same algorithm as long as I did not simply copy your original one. So, for instance, if I study an algorithm I can write my own version of it. Even though it is extremely similar to the original algorithm, it is not any sort of a violation.
I don't think anybody is disagreeing here.
However, when you go from a highly non-trivial algorithm to the actual source code, there are many choices to be made. Those make the resulting source code copyrightable. I you do a conversion of let's say C into Java based on a line-by-line understanding, you will copy enough of those choices to infringe the copyright. If you study the C source code long enough to actually fully grasp the algorithm, and implement that algorithm in your own programming style, you will probably be fine from the point of view of copyright.
Yes, but the code is not identical. It is only highly similar. And those highly similar patches are tiny.
If, for instance, you studies a simple string reversal algorithm and wrote your own version the assembly language might look extremely similar even though it really is your own implementation {see below}
Yes, these are the accusations. However, any intelligent examination of the evidence will reveal that this standard has not been met. There were a few tiny patches of assembly that were shown to be similar. Even those tiny patches of assembly were necessarily different than the original programs. It takes magical clairvoyance to determine that the bitboard routines of Rybka have been obtained via cut and paste and not by understanding the algorithms and typing in his own version.
I haven't studied the evidence myself, so I can't say too much about this. What I do know is that Vas didn't really attempt to cooperate where there seems to have been a case to answer. There are also these other things such as obfuscating the node count.
If, as you seem to say, it is more or less mathematically impossible to show guilt based on the reverse engineering of the Rybka executable, it seems to me that Vas had an obligation to cooperate (or bear the consequences). There is nothing justified in being able to hide behind obscurity. (It might be different in a real criminal trial, but this is a civil matter.)
If you were to use alpha-beta in your program is it original? In some very real sense, the answer is 'No."
Why come back to this when there is absolutely no disagreement that everybody is free to reuse high-level ideas? If I respond by "if it rains you might get wet", do I win the argument?
We are in agreement, then that algorithms are fair game?
Chess programming has become a cesspool of petty, mean-spirited, selfish jerks. Or maybe it was always that way and I simply failed to recognize it.
Well, among the *programmers* (as opposed to the religious fanatics that seem to be crowding some of the fora), there seem to be a great many that are willing to discuss and share ideas in the open. Btw, I don't think Vas was ever one of them? (Feel free to correct me on this, since I might really be wrong here.)
It is possible for algorithms that look very different but accomplish the same purpose to produce remarkably similar assembly language. If you looked at the assembly routines below, you might very well conclude that we have copying going on (there are two pairs that are highly similar to each other {E,5}, {B,9}). But if you look at the C code that generated the assembly language, you can see that each routine is different from the others (they are actually taken from different author’s attempts to reverse a string in an old news:comp.lang.c posting). It is also true that different compilers or different optimization settings can generate different assembly from the same source code. In other words, to look at two patches of assembly language generated from a higher order language and assume that the high order language has been directly copied is not verifiable. It is possible, of course, to see that the same *algorithm* has been used. See below.
To say that high level language has been directly copied by examination of assembly language *requires* a great deal of poetic license. You can clearly say that the same *algorithms* have been used, but that is neither here nor there.
From the following old CCC thread:
http://talkchess.com/forum/viewtopic.ph ... 18&t=35128
We have this:
Code: Select all
/*
* Various methods to reverse a string, cobbled from ancient clc posts.
*/
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
char *reverse9 (char *string)
{
char *start, *end;
for (end = start = string; *end && *(end + 1); ++end);
while (end > start)
{
char temp;
temp = *start;
*start = *end;
*end = temp;
++start;
--end;
}
return string;
}
char *reverseE (char *sp)
{
char *cp, *ep;
char ch;
if (!*sp)
return (sp); /* need this so we can do 1st ep-- below */
for (ep = sp; *ep; ep++);
for (ep--, cp = sp; cp < ep; cp++, ep--)
{
ch = *cp;
*cp = *ep;
*ep = ch;
}
return (sp);
}
char *reverseB (char *s)
{
char t, *e, *ps;
ps = s;
e = s;
while (*e) /* go to end of string */
e++;
*e--;
while (e > s)
{
t = *s;
*s = *e;
*e = t;
e--;
s++;
}
s = ps;
return s;
}
char *reverse5 (char *string)
{
char *backward = string;
char *forward = string;
char temp;
/* * Set 'backward' to the null byte * terminating the string: */
while (*backward)
backward++;
/* * Move 'forward' towards end of string * and 'backward' towards
* start of string * until 'forward' and 'backward' meet, * swapping
* characters as we go: */
while (forward < backward)
{
--backward;
temp = *backward;
*backward = *forward;
*forward = temp;
++forward;
}
return string;
}
reverseE PROC ; COMDAT
cmp BYTE PTR [rcx], 0
mov r8, rcx
je SHORT $LN1@reverseE
mov rdx, rcx
npad 5
$LL6@reverseE:
inc rdx
cmp BYTE PTR [rdx], 0
jne SHORT $LL6@reverseE
dec rdx
mov r9, rcx
cmp rcx, rdx
jae SHORT $LN1@reverseE
npad 13
$LL3@reverseE:
movzx eax, BYTE PTR [rdx]
movzx ecx, BYTE PTR [r9]
dec rdx
mov BYTE PTR [r9], al
mov BYTE PTR [rdx+1], cl
inc r9
cmp r9, rdx
jb SHORT $LL3@reverseE
$LN1@reverseE:
mov rax, r8
ret 0
reverseE ENDP
_TEXT ENDS
reverseB PROC ; COMDAT
cmp BYTE PTR [rcx], 0
mov r9, rcx
mov rax, rcx
mov r8, rcx
je SHORT $LN3@reverseB
npad 2
$LL4@reverseB:
inc r8
cmp BYTE PTR [r8], 0
jne SHORT $LL4@reverseB
$LN3@reverseB:
dec r8
cmp r8, rcx
jbe SHORT $LN11@reverseB
$LL2@reverseB:
movzx ecx, BYTE PTR [r8]
movzx edx, BYTE PTR [r9]
dec r8
mov BYTE PTR [r9], cl
mov BYTE PTR [r8+1], dl
inc r9
cmp r8, r9
ja SHORT $LL2@reverseB
$LN11@reverseB:
fatret 0
reverseB ENDP
_TEXT ENDS
reverse5 PROC ; COMDAT
cmp BYTE PTR [rcx], 0
mov r8, rcx
mov rdx, rcx
mov r9, rcx
je SHORT $LN12@reverse5
npad 2
$LL4@reverse5:
inc rdx
cmp BYTE PTR [rdx], 0
jne SHORT $LL4@reverse5
cmp rcx, rdx
jae SHORT $LN12@reverse5
npad 3
$LL2@reverse5:
movzx eax, BYTE PTR [r9]
movzx ecx, BYTE PTR [rdx-1]
dec rdx
mov BYTE PTR [rdx], al
mov BYTE PTR [r9], cl
inc r9
cmp r9, rdx
jb SHORT $LL2@reverse5
$LN12@reverse5:
mov rax, r8
ret 0
reverse5 ENDP
_TEXT ENDS
reverse9 PROC ; COMDAT
cmp BYTE PTR [rcx], 0
mov r8, rcx
mov r9, rcx
mov rdx, rcx
je SHORT $LN13@reverse9
npad 2
$LL5@reverse9:
cmp BYTE PTR [rdx+1], 0
lea rax, QWORD PTR [rdx+1]
je SHORT $LN9@reverse9
mov rdx, rax
jmp SHORT $LL5@reverse9
$LN9@reverse9:
cmp rdx, rcx
jbe SHORT $LN13@reverse9
npad 12
$LL2@reverse9:
movzx eax, BYTE PTR [rdx]
movzx ecx, BYTE PTR [r9]
dec rdx
mov BYTE PTR [r9], al
mov BYTE PTR [rdx+1], cl
inc r9
cmp rdx, r9
ja SHORT $LL2@reverse9
$LN13@reverse9:
mov rax, r8
ret 0
reverse9 ENDP
_TEXT ENDS