#include "sjeng.h"
#include "protos.h"
#include "extvars.h"
#include <inttypes.h>
typedef struct
{
signed Depth:7;
unsigned OnMove:1;
unsigned char Bestmove;
uint32_t Hash;
uint32_t Hold_hash;
int32_t Bound;
}
LearnType;
void Learn(int score, int best, int depth)
{
int number = 0, next = 0;
LearnType draft;
FILE **lrnfile;
printf("Learning score: %d best: %d depth:%d hash: %X\n", score, best, depth, hash);
if (Variant == Normal)
{
lrnfile = &lrn_standard;
}
else if ((Variant == Crazyhouse) || (Variant == Bughouse))
{
lrnfile = &lrn_zh;
}
else if (Variant == Suicide)
{
lrnfile = &lrn_suicide;
}
else if (Variant == Losers)
{
lrnfile = &lrn_losers;
}
else
return;
fseek(*lrnfile, 0, SEEK_SET);
fread(&number, sizeof(int), 1, *lrnfile);
fread(&next, sizeof(int), 1, *lrnfile);
if (number < 50000) number++;
fseek(*lrnfile, 0, SEEK_SET);
fwrite(&number, sizeof(int), 1, *lrnfile);
next++;
if (next == 50000) next = 1;
fwrite(&next, sizeof(int), 1, *lrnfile);
fseek(*lrnfile, (2*sizeof(int)) + ((next-1)*sizeof(LearnType)), SEEK_SET);
draft.Depth = depth;
draft.OnMove = ToMove;
draft.Hash = hash;
draft.Hold_hash = hold_hash;
draft.Bound = score;
draft.Bestmove = best;
fwrite(&draft, sizeof(draft), 1, *lrnfile);
fflush(*lrnfile);
}
void LoadLearn(void)
{
int number = 0, posloop;
LearnType draft;
FILE **lrnfile;
if (((Variant == Crazyhouse) || (Variant == Bughouse)) && (!lrn_zh))
return;
else if ((Variant == Normal) && !lrn_standard)
return;
else if (Variant == Suicide && !lrn_suicide)
return;
else if (Variant == Losers && !lrn_losers)
return;
if (Variant == Normal)
{
lrnfile = &lrn_standard;
}
else if ((Variant == Crazyhouse) || (Variant == Bughouse))
{
lrnfile = &lrn_zh;
}
else if (Variant == Suicide)
{
lrnfile = &lrn_suicide;
}
else if (Variant == Losers)
{
lrnfile = &lrn_losers;
}
fseek(*lrnfile, 0, SEEK_SET);
fread(&number, sizeof(int), 1, *lrnfile);
fseek(*lrnfile, 2*sizeof(int), SEEK_SET);
for (posloop = 0; posloop < number; posloop++)
{
fread(&draft, sizeof(LearnType), 1, *lrnfile);
LearnStoreTT(draft.Bound, draft.Hash, draft.Hold_hash,
draft.OnMove, draft.Bestmove, draft.Depth);
}
return;
}