1 #ifndef PHALANX_INCLUDED 2 #define PHALANX_INCLUDED 3 4 #define ENGNAME "Phalanx" 5 #define VERSION "XXV" 6 7 #ifdef GNUFUN 8 # include <getopt.h> 9 #endif 10 11 #ifdef _WIN32 12 # include <windows.h> 13 # include <io.h> 14 # include <errno.h> 15 # include <process.h> 16 #endif 17 18 #include <stdio.h> 19 #include <stdlib.h> 20 #include <string.h> 21 #include <time.h> 22 #include <unistd.h> 23 #include <ctype.h> 24 #include <signal.h> 25 #include <sys/types.h> 26 #include <sys/stat.h> 27 #include <sys/time.h> 28 29 /* 30 * COMPATIBILITY 31 */ 32 33 #ifndef CLOCKS_PER_SEC 34 # define CLOCKS_PER_SEC CLK_TCK 35 #endif 36 37 #ifdef _WIN32 38 # ifndef __cplusplus 39 # define inline __inline 40 # endif 41 typedef __int64 int64; 42 #else 43 typedef long long int64; 44 #endif 45 46 /* 47 * TYPES 48 */ 49 50 typedef unsigned char tsquare; 51 52 /*** Moves are generated into and executed from struct tmove ***/ 53 typedef struct 54 { 55 short 56 value; /* heuristic value - the order key - before search */ 57 /* value returned - after search */ 58 short 59 dch; /* depth change -100...100 */ 60 unsigned char 61 from, /* square */ 62 to, /* destination square */ 63 special; /* Castling or en passant capture, see moving.c */ 64 unsigned char 65 in1, /* moving piece */ 66 in2, /* captured piece or 0 */ 67 in2a; /* moving piece or promoted piece */ 68 } tmove; /* 12 bytes */ 69 70 typedef struct 71 { 72 int psnl; /* positional evaluation */ 73 int devi; /* deviation to be used in lazy eval, 0 = true eval */ 74 int check; /* side to move is in check */ 75 } tsearchnode; 76 77 typedef struct 78 { 79 tmove 80 m; 81 unsigned 82 hashboard; 83 unsigned 84 rule50, /* number of half-moves since last irreversible */ 85 castling; /* 4 castling flags: */ 86 /* white short, w. long, b. s., b. l. */ 87 int 88 mtrl, /* material count of side on move */ 89 xmtrl; /* material count of opposite side */ 90 } tgamenode; /* 12+16 bytes */ 91 92 typedef struct 93 { 94 unsigned 95 hashboard; 96 short 97 value, 98 depth: 14; 99 unsigned 100 result: 2; 101 unsigned short 102 move, 103 age; 104 } thashentry; /* 12 bytes */ 105 106 /* Positional features of one side */ 107 typedef struct 108 { 109 short hung; 110 signed char khung, kshield; 111 unsigned char p, n, b, r, q; /* number of given pieces */ 112 unsigned char kp; /* king position */ 113 unsigned char r7r; /* # of rooks on 7-th row */ 114 signed char prune; /* is it ok to prune search in this pos ? */ 115 signed char kstorm, qstorm; /* diffside castling: king attack q/k side */ 116 unsigned char devel; /* development needed?, 0 ... no */ 117 unsigned char castling; 118 unsigned char bishopcolor, /* square color of friendly bishops, or-red */ 119 xbishopcolor; /* square color of enemy bishops */ 120 signed char worsebm; /* mobility of the worse bishop */ 121 unsigned char lpf, rpf; /* leftmost/rightmost pawn file */ 122 } tknow; 123 124 typedef enum 125 { timecontrol, averagetime, fixedtime, fixeddepth } 126 tlevel; 127 128 typedef struct 129 { 130 int centiseconds; 131 unsigned 132 moves, /* time levels */ 133 increment; 134 int depth; /* fixed depth level */ 135 int 136 noise; 137 int resign; 138 int 139 bench; 140 int 141 machine_color, 142 post, 143 xboard, 144 book, 145 learn, 146 cpu, /* use cpu time */ 147 ponder, 148 analyze, 149 polling; /* polling input */ 150 tlevel level; 151 int nps; 152 int easy; 153 int random; 154 int rndlim; 155 FILE * log; 156 } tflag; 157 158 typedef struct 159 { unsigned char prev, next; } 160 tlist; 161 162 typedef struct 163 { FILE * 164 f; 165 unsigned 166 firstkey, 167 lastkey; 168 int 169 filesize; 170 } tsbook; 171 172 typedef struct 173 { FILE * f; int filesize; } 174 tpbook; 175 176 typedef struct 177 { unsigned taxi, max, diag, min; } 178 tdist; 179 180 181 182 /* 183 * DEFINITIONS 184 */ 185 186 #ifndef VERSION 187 # define VERSION "unknown" 188 #endif 189 190 /* use SAN for output */ 191 #undef SANOUT 192 193 /* primary (text, small, user) book */ 194 #ifndef PBOOK_FILE 195 #define PBOOK_FILE "pbook.phalanx" 196 #endif 197 #ifndef PBOOK_DIR 198 #define PBOOK_DIR "/usr/local/lib/phalanx" 199 #endif 200 201 /* secondary (binary, large, generated from pgn) book */ 202 #ifndef SBOOK_FILE 203 #define SBOOK_FILE "sbook.phalanx" 204 #endif 205 #ifndef SBOOK_DIR 206 #define SBOOK_DIR "/usr/local/lib/phalanx" 207 #endif 208 209 #ifndef ECO_FILE 210 #define ECO_FILE "eco.phalanx" 211 #endif 212 #ifndef ECO_DIR 213 #define ECO_DIR "/usr/local/lib/phalanx" 214 #endif 215 216 #ifndef LEARN_FILE 217 #define LEARN_FILE "learn.phalanx" 218 #endif 219 #ifndef LEARN_DIR 220 #define LEARN_DIR "/var/local/lib/phalanx" 221 #endif 222 223 #define ENV_PBOOK "PHALANXPBOOKDIR" 224 #define ENV_SBOOK "PHALANXSBOOKDIR" 225 #define ENV_LEARN "PHALANXLEARNDIR" 226 #define ENV_ECO "PHALANXECODIR" 227 228 #define max(x,y) (((x)>(y))?(x):(y)) 229 #define min(x,y) (((x)<(y))?(x):(y)) 230 231 #define NOVALUE 32123 232 #define CHECKMATE 30000 233 #define MAXPLY 64 234 #define MAXCOUNTER 1024 /* 512 moves */ 235 236 #define HASH_COLOR ((unsigned)0xFDB97531) 237 #define no_cut 1 238 #define alpha_cut 2 239 #define beta_cut 3 240 241 /* Castling special move codes and flags */ 242 243 #define SHORT_CASTLING 1 244 #define LONG_CASTLING 2 245 #define NULL_MOVE 20 246 247 #define WSHORT 1 /* if set, white short castling is impossible */ 248 #define WLONG 2 249 #define BSHORT 4 250 #define BLONG 8 251 252 /* Colors / sides */ 253 254 #define WHITE 1 255 #define BLACK 2 256 257 #define empty(X) (((X)&3)==0) 258 #define white(X) (((X)&3)==WHITE) 259 #define black(X) (((X)&3)==BLACK) 260 #define color(X) ((X)&3) 261 #define enemy(X) ((X)^3) 262 263 /* Values */ 264 265 #define P_VALUE 100 266 #define N_VALUE 350 267 #define B_VALUE 350 268 #define R_VALUE 550 269 #define Q_VALUE 1050 270 271 /* Pieces */ 272 273 #define piece(X) ((X)&0x7C) 274 275 #define PAWN 0x10 276 #define KNIGHT 0x20 277 #define BISHOP 0x30 278 #define ROOK 0x40 279 #define QUEEN 0x50 280 #define KING 0x60 281 282 #define WP (WHITE|PAWN) 283 #define WN (WHITE|KNIGHT) 284 #define WB (WHITE|BISHOP) 285 #define WR (WHITE|ROOK) 286 #define WQ (WHITE|QUEEN) 287 #define WK (WHITE|KING) 288 289 #define BP (BLACK|PAWN) 290 #define BN (BLACK|KNIGHT) 291 #define BB (BLACK|BISHOP) 292 #define BR (BLACK|ROOK) 293 #define BQ (BLACK|QUEEN) 294 #define BK (BLACK|KING) 295 296 /*** Bit masks for power tables ***/ 297 298 #define WPM 0x0001 299 #define WNM 0x0002 300 #define WBM 0x0004 301 #define WRM 0x0008 302 #define WQM 0x0010 303 #define WWW 0x0020 304 305 #define BPM 0x0100 306 #define BNM 0x0200 307 #define BBM 0x0400 308 #define BRM 0x0800 309 #define BQM 0x1000 310 #define BBB 0x2000 311 312 /* Files */ 313 314 #define FILE_A 1 315 #define FILE_B 2 316 #define FILE_C 3 317 #define FILE_D 4 318 #define FILE_E 5 319 #define FILE_F 6 320 #define FILE_G 7 321 #define FILE_H 8 322 323 /* Squares */ 324 325 #define A1 21 326 #define B1 22 327 #define C1 23 328 #define D1 24 329 #define E1 25 330 #define F1 26 331 #define G1 27 332 #define H1 28 333 334 #define A2 31 335 #define B2 32 336 #define C2 33 337 #define D2 34 338 #define E2 35 339 #define F2 36 340 #define G2 37 341 #define H2 38 342 343 #define A3 41 344 #define B3 42 345 #define C3 43 346 #define D3 44 347 #define E3 45 348 #define F3 46 349 #define G3 47 350 #define H3 48 351 352 #define A4 51 353 #define B4 52 354 #define C4 53 355 #define D4 54 356 #define E4 55 357 #define F4 56 358 #define G4 57 359 #define H4 58 360 361 #define A5 61 362 #define B5 62 363 #define C5 63 364 #define D5 64 365 #define E5 65 366 #define F5 66 367 #define G5 67 368 #define H5 68 369 370 #define A6 71 371 #define B6 72 372 #define C6 73 373 #define D6 74 374 #define E6 75 375 #define F6 76 376 #define G6 77 377 #define H6 78 378 379 #define A7 81 380 #define B7 82 381 #define C7 83 382 #define D7 84 383 #define E7 85 384 #define F7 86 385 #define G7 87 386 #define H7 88 387 388 #define A8 91 389 #define B8 92 390 #define C8 93 391 #define D8 94 392 #define E8 95 393 #define F8 96 394 #define G8 97 395 #define H8 98 396 #define H9 99 /* a bumper: we are out of board */ 397 398 399 /* 400 * VARIABLES 401 */ 402 403 extern tflag Flag; /* Misc. settings, see typedef of tflag */ 404 405 extern tsquare B[120]; /* The chessboard */ 406 extern tlist L[120]; /* List of pieces */ 407 #define WKP (L[1].next) /* White king position */ 408 #define BKP (L[2].next) /* Black king position */ 409 410 extern signed char * Th; /* horizontal axe transf., (H8<->H1) */ 411 extern signed char * Tv; /* vertical axe tr., (H8<->A8) */ 412 413 extern const char initialpos[]; 414 415 extern tdist dist[120*120]; 416 extern tknow Wknow, Bknow; /* Things i know about actual position */ 417 extern int Color; /* c. to move: 1 ... white, 2 ... black */ 418 extern int LastIter; /* result of last iteration */ 419 extern int Depth; /* depth to be searched, in % of ply */ 420 extern int Ply; 421 extern int FollowPV; 422 extern int Totmat; /* total mtrl sum on the board */ 423 extern int Abort, NoAbort; /* abort the search when SIG_INT */ 424 extern long AllDepth; /* Statistics for average Depth */ 425 extern int64 AllNPS; 426 extern long T1, T2; /* time started & planned on a move */ 427 428 extern int DrawScore; 429 #define DRAW ( Ply%2 ? -DrawScore : DrawScore ) 430 431 extern tsearchnode S[MAXPLY]; /* the current node is S[Ply] */ 432 extern tgamenode G[MAXCOUNTER]; 433 extern int Counter; /* game counter, points to G[] */ 434 435 extern int64 Nodes; /* statistics */ 436 extern int Scoring; 437 extern int EasyMove; 438 439 extern long Otim; /* remaining opponent's time */ 440 441 /* move generation tables */ 442 extern int N_moves[8], RB_dirs[8]; 443 #define K_moves RB_dirs 444 445 extern int Values[7]; /* piece values */ 446 extern unsigned P[120]; 447 448 extern tmove PV[MAXPLY][MAXPLY]; /* principal variantion */ 449 extern tmove Pondermove; 450 451 /* Hashing codes */ 452 extern unsigned H[12][64]; 453 extern thashentry *HT; /* Hash table itself */ 454 extern int * HS; /* square trans-table */ 455 extern int HP[]; /* piece trans-table */ 456 extern unsigned SizeHT; /* Size of the hash table */ 457 extern unsigned Age; 458 459 /* Opening book */ 460 extern tpbook Pbook; /* primary book flags */ 461 extern tpbook Learn; 462 extern tsbook Sbook; /* secondary book flags */ 463 extern FILE * Eco; 464 extern int Bookout; 465 466 /* params that cannot be pushed thru SIGALM handler, */ 467 /* must be pushed thru global variables */ 468 extern volatile int A_n, A_i, A_d; 469 extern volatile tmove * A_m; 470 471 472 473 /* 474 * FUNCTIONS 475 */ 476 477 extern void myfwrite( void*, int, FILE* ); 478 extern void myfread( void*, int, FILE* ); 479 480 extern int bcreate(int,char**); 481 482 extern void new_game(void); 483 484 /* input/output */ 485 extern int printfl(const char *, ...); 486 extern void printm(tmove,char*); 487 extern void printmSAN( tmove*, int, int, char* ); 488 extern void printPV(int,int,char*); 489 extern void infoline(int,char*); 490 extern void verboseline(void); 491 extern void printboard(char*); 492 extern int setfen(const char*); 493 extern void shell(void); 494 extern int command(void); 495 extern tmove * sandex(char*,tmove*,int); 496 497 /* signal handlers */ 498 extern void interrupt(int); 499 500 extern int attacktest(int,int); 501 #define checktest(side) attacktest( (side)==WHITE ? WKP : BKP, enemy(side)) 502 503 extern void generate_legal_moves(tmove*,int*,int); 504 extern void generate_legal_captures(tmove*,int*,int); 505 extern void generate_legal_checks(tmove*,int*); 506 extern int see( tsquare *, int, int ); 507 508 extern int search(tmove*,int,int,int); 509 extern tmove root_search(void); 510 511 extern int repetition(int); 512 extern int material_draw(void); 513 extern int evaluate(int,int); 514 extern void blunder(tmove*,int*); 515 516 extern int score_position(void); 517 518 /* endgame knowledge */ 519 extern int pawns(void); 520 extern int e_nb(int); /* endgame: knight and bishop */ 521 extern int e_mp(void); /* minor piece and pawn */ 522 extern int e_rpr(void); /* R+P vs. R */ 523 524 extern void do_move( tmove * ); 525 extern void undo_move( tmove * ); 526 527 extern unsigned hashboard(void); 528 extern thashentry * seekHT(void); 529 extern void writeHT(int,int,int); 530 531 /* levels */ 532 extern void l_level(char *); 533 extern void l_startsearch(void); 534 extern int l_iterate(void); 535 extern long ptime(void); 536 extern long LastTurn; 537 extern int Turns; 538 539 /* book */ 540 extern int bookmove(tmove*,int); 541 extern unsigned smove(tmove*); 542 543 /* learning feature */ 544 extern int rlearn(void); 545 extern void wlearn(int,int); 546 547 /* killer move utils */ 548 extern void init_killers(void); 549 extern void write_killer( int, int ); 550 extern void add_killer( tmove *, int, thashentry * ); 551 extern void slash_killers( tmove *, int ); 552 553 #endif 554 555