#include #include #include #include typedef struct { char fen[100]; int leftFenNumber; int rightFenNumber; int leftEval; char leftMove[10]; int leftRank; int rightEval; char rightMove[10]; int rightRank; } position_t; position_t *gPosition = NULL; int gPositions; void StripTrailingNewline(char *str) { int sl = strlen(str); if (sl == 0) return; if (str[sl - 1] == '\n') str[sl - 1] = 0; } uint32_t MyHashString(const char *s) { uint32_t hash = 2166136261u; while (*s) { hash ^= (unsigned char)*s++; hash *= 16777619u; } return hash; } int CompareLeftEvals(const void *a, const void *b) { position_t *pa = (position_t *)a; position_t *pb = (position_t *)b; if (pa->leftEval == pb->leftEval) return pa->leftFenNumber - pb->leftFenNumber; return pb->leftEval - pa->leftEval; } int CompareRightEvals(const void *a, const void *b) { position_t *pa = (position_t *)a; position_t *pb = (position_t *)b; if (pa->rightEval == pb->rightEval) return pa->rightFenNumber - pb->rightFenNumber; return pb->rightEval - pa->rightEval; } void PrintCorrelation() { double accuracy; double totalAccuracy = 0; double sameMove = 0; int i; for (i = 0; i < gPositions; ++i) { accuracy = abs(gPosition[i].leftRank - gPosition[i].rightRank); accuracy /= (double)gPositions; accuracy = 1.0 - accuracy; totalAccuracy += accuracy; if (gPosition[i].leftMove[0] != 0 && !strcmp(gPosition[i].leftMove, gPosition[i].rightMove)) sameMove += 1.0; } printf(" Positions: %d\n", gPositions); printf(" Eval correlation: %0.3f percent\n", (totalAccuracy / (double)gPositions) * 100.0); printf(" Move correlation: %0.3f percent\n", (sameMove / (double)gPositions) * 100.0); } void StoreFileEval(char *fen, int fenNumber, int eval, char *moveString, bool isLeftFile) { int fenHash = (int)MyHashString(fen); int i; i = abs(fenHash) % 1500000; for (;;) { if (gPosition[i].fen[0] == 0) { strcpy(gPosition[i].fen, fen); break; } if (!strcmp(gPosition[i].fen, fen)) break; i++; } if (isLeftFile) { gPosition[i].leftFenNumber = fenNumber; gPosition[i].leftEval = eval; strcpy(gPosition[i].leftMove, moveString); } else { gPosition[i].rightFenNumber = fenNumber; gPosition[i].rightEval = eval; strcpy(gPosition[i].rightMove, moveString); } } void ReadFileEvals(const char *fileName, bool isLeftFile) { FILE *f; char fenLine[1000 + 1]; char evalLine[1000 + 1]; char moveLine[1000 + 1]; int fenNumber; f = fopen(fileName, "r"); if (!f) { printf("Couldn't open %s.\n", fileName); exit(1); } fenNumber = 0; for (;;) { fenLine[0] = 0; evalLine[0] = 0; moveLine[0] = 0; fgets(fenLine, 1000, f); fgets(evalLine, 1000, f); fgets(moveLine, 1000, f); if (fenLine[0] == 0 || evalLine[0] == 0 || moveLine[0] == 0) break; StripTrailingNewline(fenLine); StripTrailingNewline(evalLine); StripTrailingNewline(moveLine); StoreFileEval(fenLine, fenNumber, atoi(evalLine), moveLine, isLeftFile); fenNumber++; } fclose(f); } void CompareLopFiles(const char *leftFile, const char *rightFile) { int i; printf("Comparing %s to %s:\n", leftFile, rightFile); fflush(stdout); if (gPosition) free(gPosition); gPosition = (position_t *)malloc(2000000 * sizeof(position_t)); gPositions = 0; for (i = 0; i < 2000000; ++i) { gPosition[i].fen[0] = 0; gPosition[i].leftEval = -1000000; gPosition[i].rightEval = -1000000; } ReadFileEvals(leftFile, true); ReadFileEvals(rightFile, false); position_t *oldPosition = gPosition; gPosition = (position_t *)malloc(2000000 * sizeof(position_t)); gPositions = 0; for (i = 0; i < 2000000; ++i) { if (oldPosition[i].fen[0] == 0 || oldPosition[i].leftEval == -1000000 || oldPosition[i].rightEval == -1000000) continue; gPosition[gPositions++] = oldPosition[i]; } free(oldPosition); qsort(gPosition, gPositions, sizeof(position_t), CompareLeftEvals); for (i = 0; i < gPositions; ++i) gPosition[i].leftRank = i; qsort(gPosition, gPositions, sizeof(position_t), CompareRightEvals); for (i = 0; i < gPositions; ++i) gPosition[i].rightRank = i; PrintCorrelation(); free(gPosition); gPosition = NULL; } int main(int argc, char *argv[]) { char leftFile[1000 + 1]; char rightFile[1000 + 1]; /*strcpy(leftFile, "lop_10k_lc0_nosearch.txt"); strcpy(rightFile, "lop_10k_sf.txt"); CompareLopFiles(leftFile, rightFile); return 0;*/ if (argc != 3) { printf("Usage: compare_lop file_one.txt file_two.txt\n"); exit(1); } strcpy(leftFile, argv[1]); strcpy(rightFile, argv[2]); CompareLopFiles(leftFile, rightFile); return 0; }