void book_open(const char file_name[]) {
ASSERT(file_name!=NULL);
- if(FALSE && option_get_bool(Option,"BookLearn")){
+ if(option_get_bool(Option,"BookLearn")){
BookFile = fopen(file_name,"rb+");
}else{
BookFile = fopen(file_name,"rb");
void book_moves(list_t * list, const board_t * board) {
int first_pos;
- int sum;
+ double sum;
int pos;
entry_t entry[1];
int move;
int score;
+ uint32 weight[1000]; // [HGM] assumes not more than 1000 book moves per position!
char move_string[256];
ASSERT(board!=NULL);
read_entry(entry,pos);
if (entry->key != board->key) break;
- sum += entry->count;
+ weight[pos - first_pos] = 1000 * (uint32)entry->count;
+ if(option_get_bool(Option,"BookLearn")) // [HGM] improvised use of learn info
+ weight[pos - first_pos] *= ((uint32)entry->n + 10.) /((uint32)entry->sum + 1.);
+ sum += weight[pos - first_pos];
}
// disp
if (entry->key != board->key) break;
move = entry->move;
- score = (((uint32)entry->count)*((uint32)10000))/sum; // 32 bit safe!
+ score = (10000.*weight[pos-first_pos])/sum;
if (move != MoveNone && move_is_legal(move,board)) {
list_add_ex(list,move,score);
typedef struct {
int state;
bool computer[ColourNb];
+ bool playedAllMoves[ColourNb];
int exp_move;
int hint_move;
int resign_nb;
} else {
State->computer[White] = FALSE;
State->computer[Black] = TRUE;
+ State->playedAllMoves[White] = TRUE; // [HGM]
+ State->playedAllMoves[Black] = TRUE;
}
XB->new_hack = TRUE;
// book learning
- if (FALSE && option_get_bool(Option,"Book") &&
+ if (option_get_bool(Option,"Book") &&
option_get_bool(Option,"BookLearn")) {
if (FALSE) {
ASSERT(!XB->result);
XB->result = FALSE;
+ // [HGM] externally supplied move means we did not fully play the current stm
+ State->playedAllMoves[colour_is_white(game_turn(Game)) ? White : Black] = FALSE;
+
move_step(move);
no_mess(move);
}
}
+// disarm() // [HGM] cleanse a string of offending double-quotes
+
+static char*disarm(const char *s){
+ static char buf[25];
+ char *p = buf, *q;
+ strncpy(buf, s, 24);
+ q = buf + strlen(buf) - 1;
+ while(*q == '"') *q-- = '\0'; // strip trailing quotes
+ while(*p == '"') p++; // strip leading quotes
+ while((q = strchr(p, '"'))) *q = '\''; // replace internal quotes
+ return p;
+}
+
// send_xboard_options()
static void send_xboard_options(){
gui_send(GUI,"feature draw=1");
gui_send(GUI,"feature ics=1");
gui_send(GUI,"feature myname=\"%s\"",
- option_get_string(Option,"EngineName"));
+ disarm(option_get_string(Option,"EngineName")));
gui_send(GUI,"feature name=1");
gui_send(GUI,"feature pause=0");
gui_send(GUI,"feature ping=1");
ASSERT(result>=-1&&result<=+1);
ASSERT(XB->result);
- ASSERT(State->computer[White]||State->computer[Black]);
+// ASSERT(State->computer[White]||State->computer[Black]);
// init
pos = 0;
- if (FALSE) {
- } else if (State->computer[White]) {
+ // [HGM] does not account for the hypothetical possibility we played both sides!
+ if (State->playedAllMoves[White]) {
pos = 0;
- } else if (State->computer[Black]) {
+ } else if (State->playedAllMoves[Black]) {
pos = 1;
result = -result;
} else {
- my_fatal("learn(): unknown side\n");
+ return; // [HGM] if we did not play all moves for some side, do not learn, but don't make a fuss!
}
if (FALSE) {