Warning: session_start(): open(/var/lib/php/sessions/sess_k7fftjpbl83q4ee0oa47vaddfv, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass ChessPieceRecognizer {
MultiMap profiles;
double magicCombineFactor = 0.0012589254117941495;
int version = 1;
// for analysis
transient Pair, Double> runnerUp;
void load {
long time = sysNow();
profiles = agiBlue_chessPieceProfiles(agiBlue_chessPieceImages_loadedMultiMap(), +version);
compact();
done2("Loading " + n2(l(profiles), "piece profile"), time);
}
void compact {
int n = l(profiles);
profiles = uniquifyMultiMapValues(profiles);
int m = l(profiles);
if (m < n)
print("Compacted ChessPieceRecognizer " + n + " => " + m);
}
Pair recognize(BufferedImage img) {
ChessPieceProfile1 profile = chessOCR_pieceProfileFromRawImage_1(img);
new Lowest_withRunnerUp> lowest;
for (unpair S piece, ChessPieceProfile1 p : multiMapToPairs(profiles)) {
float sideProfileDiff = floatRatio(byteArraysTotalDiff(profile.sideProfile, p.sideProfile), l(p.sideProfile));
float fillGradeDiff = abs(profile.fillGrade-p.fillGrade);
double score = magicCombine(sideProfileDiff, fillGradeDiff);
lowest.put(pair(piece, p), score);
}
runnerUp = lowest.runnerUpPair();
ret !lowest.has() ? null : pair(pairA(lowest!), errorToPercent(lowest.score()));
}
// for humans
double errorToPercent(double d) {
ret 100-d;
}
double magicCombine(double sideProfileScore, double fillGradeScore) {
double sum = sideProfileScore+fillGradeScore/magicCombineFactor;
//print("magicCombine " + sideProfileScore + "*" + magicCombineFactor + "+" + fillGradeScore + " = " + sum);
ret sum;
}
toString {
ret shortClassName(this) + "(v" + version + ", " + nProfiles(l(profiles)) + ")";
}
}