#include <string.h>
#include <time.h>
#include <stdlib.h>
+#include <math.h>
#include "common.h"
#include "backend.h"
// correct FRC-style castlings in variant normal.
// [HGM] This is buggy code! e1h1 could very well be a normal R or Q move.
if(!strcmp(move_s,"e1h1")){
- strcpy(move_s,"e1g1");
+ safeStrCpy(move_s,"e1g1", 6);
}else if(!strcmp(move_s,"e1a1")){
- strcpy(move_s,"e1c1");
+ safeStrCpy(move_s,"e1c1", 6);
}else if(!strcmp(move_s,"e8h8")){
- strcpy(move_s,"e8g8");
+ safeStrCpy(move_s,"e8g8", 6);
}else if(!strcmp(move_s,"e8a8")){
- strcpy(move_s,"e8c8");
+ safeStrCpy(move_s,"e8c8", 6);
}
}
static char move_s[6];
int total_weight;
- if(book == NULL) return NULL;
+ if(book == NULL || moveNr >= 2*appData.bookDepth) return NULL;
// if(gameInfo.variant != VariantNormal) return NULL; // Zobrist scheme only works for normal Chess, so far
f=fopen(book,"rb");
if(!f){
if(count == MOVE_BUF) break;
entries[count++] = entry;
}
+ if(appData.bookStrength != 50) { // transform weights
+ double power = 0, maxWeight = 0.0;
+ if(appData.bookStrength) power = (100.-appData.bookStrength)/appData.bookStrength;
+ for(i=0; i<count; i++) if(entries[i].weight > maxWeight) maxWeight = entries[i].weight;
+ for(i=0; i<count; i++){
+ double weight = entries[i].weight / maxWeight;
+ if(weight > 0)
+ entries[i].weight = appData.bookStrength || weight == 1.0 ? 1e4*exp(power * log(weight)) + 0.5 : 0.0;
+ }
+ }
total_weight = 0;
for(i=0; i<count; i++){
total_weight += entries[i].weight;
}
- j = (random() & 0x7FFF) * total_weight >> 15; // create random < total_weight
+ j = (random() & 0xFFF) * total_weight >> 12; // create random < total_weight
total_weight = 0;
for(i=0; i<count; i++){
total_weight += entries[i].weight;