Fix force mode after setboard
[bonanza.git] / dfpn.h
1 #if defined(DFPN)
2 #ifndef DFPN_H
3 #define DFPN_H
4
5 /* #define DFPN_DBG */
6
7 #define DFPN_AGE_MASK           0xffU
8 #define INF                     0x7fffffU
9 #define INF_1                   0x7ffffeU
10 #define MAX_NMOVE               256
11
12 #define DFPN_ERRNO_MAXNODE      -101
13 #define DFPN_ERRNO_MAXPLY       -102
14 #define DFPN_ERRNO_SUMPHI       -103
15 #define DFPN_ERRNO_DELTA2P      -104
16 #define DFPN_ERRNO_SIGNAL       -105
17
18 /* #define DFPN_HASH_MASK     0x00fffffU */ /*   24MByte */
19 /* #define DFPN_HASH_MASK     0x01fffffU */ /*   48MByte */
20 /* #define DFPN_HASH_MASK     0x03fffffU */ /*   96MByte */
21 /* #define DFPN_HASH_MASK     0x07fffffU */ /*  192MByte */
22 /* #define DFPN_HASH_MASK     0x0ffffffU */ /*  384MByte */
23 /* #define DFPN_HASH_MASK     0x1ffffffU */ /*  768MByte */
24 /* #define DFPN_HASH_MASK     0x3ffffffU */ /* 1536MByte */
25 #define DFPN_NODES_MASK    UINT64_C(0x1fffffffffff)
26 #define DFPN_NUM_REHASH    32
27
28
29 #if defined(DFPN_DBG)
30 extern int dbg_flag;
31 #  define DOut(ply,fmt,...) if ( dbg_flag && ply <= 64 ) out( "%-*d" fmt "\n", 2*ply, ply, __VA_ARGS__ )
32 #else
33 #  define DOut( ... )
34 #endif
35
36 /*#define DFPNSignKey(word1, word2, word3) word1 = ( word1 ^ word2 ^ word3 )*/
37 #define DFPNSignKey(word1, word2, word3)
38
39 typedef struct { uint64_t word1, word2, word3; } dfpn_hash_entry_t;
40
41 typedef struct {
42   uint64_t hash_key;
43   uint64_t nodes;
44   uint64_t expanded;
45   unsigned int hand_b;
46   unsigned int min_hand_b;
47   unsigned int move;
48   unsigned int phi;
49   unsigned int delta;
50   unsigned int priority;
51   int is_delta_loop;
52   int is_phi_loop;
53   int is_loop;
54   int is_weak;
55 } child_t;
56
57
58 typedef struct {
59   child_t * restrict children;
60   uint64_t hash_key;
61   uint64_t nodes;
62   uint64_t new_expansion;
63   unsigned int min_hand_b;
64   unsigned int hand_b;
65   unsigned int phi;
66   unsigned int delta;
67   unsigned int sum_phi;
68   unsigned int min_delta;
69   int is_delta_loop;
70   int is_phi_loop;
71   int nmove, turn, icurr_c;
72 } node_t;
73
74
75 typedef struct {
76   uint64_t node_limit;
77   int turn_or;
78   int root_ply;
79   unsigned int sum_phi_max;
80   child_t child_tbl[ MAX_NMOVE * PLY_MAX ];
81   node_t anode[ PLY_MAX ];
82 } dfpn_tree_t;
83
84
85 enum { weak_chuai = 1, weak_drop  = 100 };
86
87
88 void CONV dfpn_hash_probe( const dfpn_tree_t * restrict pdfpn_tree,
89                            child_t * restrict pchild, int ply, int turn );
90 void CONV dfpn_hash_store( const tree_t * restrict ptree,
91                            dfpn_tree_t * restrict pdfpn_tree,
92                            int ply );
93 int CONV dfpn_detect_rep( const dfpn_tree_t * restrict pdfpn_tree,
94                           uint64_t hash_key, unsigned int hand_b,
95                           int ply, int * restrict ip );
96 unsigned int CONV dfpn_max_hand_b( unsigned int hand_b, unsigned hand_w );
97 unsigned int CONV dfpn_max_hand_w( unsigned int hand_b, unsigned hand_w );
98 float CONV dfpn_hash_sat( void );
99
100 extern dfpn_hash_entry_t * restrict dfpn_hash_tbl;
101 extern unsigned int dfpn_hash_mask;
102 extern unsigned int dfpn_hash_age;
103 extern const unsigned int hand_tbl[16];
104
105 #endif /* DFPN_H */
106 #endif /* DFPN */