void book_open(const char file_name[]) {\r
\r
ASSERT(file_name!=NULL);\r
- if(option_get_bool("BookLearn")){\r
+ if(option_get_bool(Option,"BookLearn")){\r
BookFile = fopen(file_name,"rb+");\r
}else{\r
BookFile = fopen(file_name,"rb");\r
entry_t entry[1];\r
int move;\r
int score;\r
+ list_t list[1];\r
+ int i;\r
\r
if(BookFile==NULL) return MoveNone;\r
\r
ASSERT(board!=NULL);\r
ASSERT(random==TRUE||random==FALSE);\r
\r
+ // init\r
+ \r
+ list_clear(list);\r
+\r
+ book_moves(list,board);\r
\r
best_move = MoveNone;\r
best_score = 0;\r
- for (pos = find_pos(board->key); pos < BookSize; pos++) {\r
-\r
- read_entry(entry,pos);\r
- if (entry->key != board->key) break;\r
+ for(i=0; i<list_size(list); i++){\r
\r
- move = entry->move;\r
- score = entry->count;\r
+ move = list->move[i];\r
+ score = list->value[i];\r
\r
- if (move != MoveNone && move_is_legal(move,board)) {\r
+ if (move != MoveNone &&\r
+ move_is_legal(move,board) &&\r
+ score>10*option_get_int(Option,"BookTreshold")) {\r
\r
// pick this move?\r
\r
return best_move;\r
}\r
\r
-// book_disp()\r
+// book_moves()\r
\r
-void book_disp(const board_t * board) {\r
+void book_moves(list_t * list, const board_t * board) {\r
\r
int first_pos;\r
int sum;\r
char move_string[256];\r
\r
ASSERT(board!=NULL);\r
+ ASSERT(list!=NULL);\r
+\r
+ if(BookFile==NULL) return;\r
\r
- if(BookFile==NULL) return; \r
+ // init\r
+\r
+ list_clear(list);\r
\r
first_pos = find_pos(board->key);\r
\r
if (entry->key != board->key) break;\r
\r
move = entry->move;\r
- score = entry->count;\r
+ score = (((uint32)entry->count)*((uint32)10000))/sum; // 32 bit safe!\r
\r
- if (score > 0 && move != MoveNone && move_is_legal(move,board)) {\r
- move_to_san(move,board,move_string,256);\r
- printf(" %s (%.0f%%)\n",move_string,((double)score)/((double)sum)*100.0);\r
+ if (move != MoveNone && move_is_legal(move,board)) {\r
+ list_add_ex(list,move,score);\r
}\r
}\r
\r
+}\r
+\r
+\r
+// book_disp()\r
+\r
+void book_disp(const board_t * board) {\r
+\r
+ char move_string[256];\r
+ list_t list[1];\r
+ int i;\r
+ int treshold=option_get_int(Option,"BookTreshold");\r
+\r
+ ASSERT(board!=NULL);\r
+\r
+ if(BookFile==NULL) return;\r
+\r
+ book_moves(list,board);\r
+ \r
+ for(i=0; i<list_size(list); i++){\r
+ move_to_san(list->move[i],board,move_string,256);\r
+ if(list->value[i]>10*treshold){\r
+ printf(" %6s %5.2f%%\n",move_string,list->value[i]/100.0);\r
+ }else{\r
+ printf(" %6s %5.2f%% (below treshold %4.2f%%)\n",\r
+ move_string,list->value[i]/100.0,treshold/10.0);\r
+ }\r
+ }\r
+ // this is necessary by the xboard protocol\r
printf("\n");\r
}\r
\r