sclass ChessPieceRecognizer { MultiMap profiles; //new Map fillGradeThresholdsByPiece; void load { long time = sysNow(); profiles = agiBlue_chessPieceProfiles(); /*for (S piece : ai_6chessPieces()) { L w = collect fillGrade(profiles.get("white " + piece)); L b = collect fillGrade(profiles.get("black " + piece)); float white = floatAverage(w); float black = floatAverage(b); print("white/black " + piece + " avg: " + white + "/" + black); print("white/black " + piece + " min/max: " + floatMax(w) + "/" + floatMin(b)); fillGradeThresholdsByPiece.put(piece, avg(white, black)); }*/ //profiles = mapMultiMapKeys lastJavaToken(profiles); // drop color done2("Loading " + n2(l(profiles), "piece profile"), time); } Pair recognize(BufferedImage img) { ChessPieceProfile1 profile = chessOCR_pieceProfileFromRawImage_1(img); new Lowest> 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); } ret lowest.pair(); } double magicCombine(double sideProfileScore, double fillGradeScore) { print("magicCombine " + sideProfileScore + " " + fillGradeScore); ret sideProfileScore+fillGradeScore; } }