Jason,
I realize that I was looking at the IsOneSum() constructor,
which had the array lookups. My bad. I just didn't
understand how it worked.
-- M
> On Sat, 2007-11-24 at 10:36 -0700, [EMAIL PROTECTED] wrote:
> > > Since 160,000 < 2*(19*19)^2, a value well below the various possible
> > > sums of squares, I have to ask what additional work you've done to
prove
> > > that the overlap doesn't cause problems?
> >
> > 160,000 is greater than (19 * 19 + 1)^2, so the linear term does
> > not interact with the quadratic term at all. This is not a problem.
>
> I don't understand this logic, but...
>
> > The unit test code in the previous email tests all possible
> > combinations of up to 4 liberty values, so it has been
> > empirically verified.
>
> I missed that unit test in the sample code. Sorry.
>
> > > PS: Did you see the solution by Eric Boesch that used bit masking and
no
> > > random numbers?
> >
> > I saw it, but I didn't understand it. However, since it does array
> > references inside a for loop, it probably does at least as many
> > memory accesses as this solution.
>
> Below is the code Eric posted for his test. There are no loops or
> memory references.
>
> bool operator()(uint64_t codeSum) const {
> return codeSum < mThreshold && !((codeSum/(codeSum/mDivisor)) & mMask);
> }
>
> Note that there are two divisions, but these can be eliminated with some
> creativity:
>
> bool operator()(uint64_t codeSum) const {
> switch(codeSum>>XXX){
> case 1:
> return true; // 64 bit code
> return !(codeSum & mMask); // 32 bit code
> case 2:
> return !(codeSum & mMaskLeftOne);
> case 3:
> return ((codeSum&altMaskLeftOne)>>1) == (codeSum&altMask); // 64 bit
> return (((codeSum&altMaskLeftOne)>>1) == (codeSum&altMask))
> && !(codeSum & altMaskLeftTwo); // 32 bit
> case 4:
> return !(codeSum & mMaskLeftTwo);
> default:
> return false;
> }
> }
>
> where
> mMask = 0b 110 110 110 110...110 11;
> mMastLeftOne = mMask<<1 | 1;
> mMastLeftTwo = mMask<<2 | 3;
> altMask = 0b 001 001 001 001...001 00;
> altMaskLeftOne = altMask<<1;
> altMaskLeftTwo = altMask<<2;
>
> I know the definition of mMask and altMask isn't legit C, but hopefully
> the formatting gives the right idea. Eric gave real code that covers
> most of this. All variable names, when matching Eric's, would use the
> definition from his code.
>
> The two bits of padding on the right, that I previously suggested, can
> be eliminated with this alternate methodology, reducing the minimum
> number of bits from 31 to 29, but that still means that overflow is
> possible... Creating more strict tests on 32 bit machines. My code
> sample gives some duplicate lines of code, the comments indicate which
> line is for 32 bit and which is for 64 bit.
>
> _______________________________________________
> computer-go mailing list
> [email protected]
> http://www.computer-go.org/mailman/listinfo/computer-go/
>
--
_______________________________________________
computer-go mailing list
[email protected]
http://www.computer-go.org/mailman/listinfo/computer-go/