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