1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-04-30 00:33:09 +00:00

Better document Binomial[]

Now, Binomial[k][n] = Bin(k, n), instead of Binomial[k-1][n] = Bin(k, n).

Better document the Pascal triangle:
* Sum the above and the one to the left of it.
* Values outside the triangle are zero. This was not checked for k=n previously,
and the code implicitly relied on zero initialization of Binomial[]. That
reliance was made more confusing by the initial assignment before the loop.

No functional change.
This commit is contained in:
lucasart 2016-04-27 18:48:23 +08:00
parent f83a6f54e4
commit 369c7f416f

View file

@ -341,7 +341,7 @@ std::string TBPaths;
std::deque<WDLEntry> WDLTable;
std::list<DTZEntry> DTZTable;
int Binomial[5][64];
int Binomial[6][64];
int Pawnidx[5][24];
int Pfactor[5][4];
@ -661,7 +661,7 @@ uint64_t encode_piece(uint8_t hasUniquePieces, uint8_t* norm, Square* pos, int*
for (int k = 0; k < i; ++k)
j += pos[l] > pos[k];
s += Binomial[l - i][pos[l] - j];
s += Binomial[l - i + 1][pos[l] - j];
}
idx += s * factor[i];
@ -702,7 +702,7 @@ uint64_t encode_pawn(uint8_t pawns[], uint8_t *norm, Square *pos, int *factor, i
uint64_t idx = Pawnidx[t][Flap[pos[0]]];
for (i = t; i > 0; --i)
idx += Binomial[t - i][Ptwist[pos[i]]];
idx += Binomial[t - i + 1][Ptwist[pos[i]]];
idx *= factor[0];
@ -721,7 +721,7 @@ uint64_t encode_pawn(uint8_t pawns[], uint8_t *norm, Square *pos, int *factor, i
for (int k = 0; k < i; ++k)
j += pos[m] > pos[k];
s += Binomial[m - i][pos[m] - j - 8];
s += Binomial[m - i + 1][pos[m] - j - 8];
}
idx += s * factor[i];
@ -741,7 +741,7 @@ uint64_t encode_pawn(uint8_t pawns[], uint8_t *norm, Square *pos, int *factor, i
for (int k = 0; k < i; ++k)
j += pos[l] > pos[k];
s += Binomial[l - i][pos[l] - j];
s += Binomial[l - i + 1][pos[l] - j];
}
idx += s * factor[i];
@ -763,7 +763,7 @@ uint64_t set_factors(T& p, int num, int order)
result *= p.hasUniquePieces ? 31332 : 462;
} else {
p.factor[i] = (int)result;
result *= Binomial[p.norm[i] - 1][n];
result *= Binomial[p.norm[i]][n];
n -= p.norm[i];
i += p.norm[i];
}
@ -790,10 +790,10 @@ uint64_t calc_factors_pawn(int *factor, int num, int order, int order2, uint8_t
result *= Pfactor[norm[0] - 1][f];
} else if (k == order2) {
factor[norm[0]] = (int)result;
result *= Binomial[norm[norm[0]] - 1][48 - norm[0]];
result *= Binomial[norm[norm[0]]][48 - norm[0]];
} else {
factor[i] = (int)result;
result *= Binomial[norm[i] - 1][n];
result *= Binomial[norm[i]][n];
n -= norm[i];
i += norm[i];
}
@ -1835,14 +1835,13 @@ void Tablebases::init(const std::string& paths)
if (TBPaths.empty() || TBPaths == "<empty>")
return;
// Fill binomial[] with the Binomial Coefficents using pascal triangle
// so that binomial[k-1][n] = Binomial(n, k).
for (int k = 0; k < 5; ++k) {
Binomial[k][0] = 0;
// Fill binomial[] with the Binomial Coefficents using Pascal triangle
Binomial[0][0] = 1;
for (int n = 1; n < 64; ++n)
Binomial[k][n] = (k ? Binomial[k-1][n-1] : 1) + Binomial[k][n-1];
}
for (int n = 1; n < 64; n++)
for (int k = 0; k < 6 && k <= n; ++k)
Binomial[k][n] = (k > 0 ? Binomial[k-1][n-1] : 0)
+ (k < n ? Binomial[k][n-1] : 0);
for (int i = 0; i < 5; ++i) {
int k = 0;
@ -1852,7 +1851,7 @@ void Tablebases::init(const std::string& paths)
for ( ; k < 6 * j; ++k) {
Pawnidx[i][k] = s;
s += (i ? Binomial[i - 1][Ptwist[Invflap[k]]] : 1);
s += Binomial[i][Ptwist[Invflap[k]]];
}
Pfactor[i][j - 1] = s;