summaryrefslogtreecommitdiff
path: root/include/engine/ttable.h
blob: 8b1938af182acf09cb7a0e437043fc2a54fccda2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#ifndef TTABLE_H
#define TTABLE_H

#include "engine/moves.h"
#include "bitboard.h"
#include <stdatomic.h>

#define TABLE_BITS 24
#define TABLE_SIZE (1ULL << TABLE_BITS)
#define TT_MASK (TABLE_SIZE - 1)
#define TT_BUCKET_SIZE 4

static struct zobrist_keys {
  u64 piece[PIECE_TYPE_COUNT][64];
  u64 castle[CASTLE_COUNT];
  u64 turn[TURN_COUNT];
  u64 en_passant[64];
} zobrist_keys;

void zobrist_init();
u64 zobrist_hash(position_t position);

enum { TT_EXACT, TT_LOWERBOUND, TT_UPPERBOUND };
typedef struct {
  atomic_uint_fast64_t key;
  move_t best_move;
  i16 score; // depth analysed
  i16 eval; // non-depth analysed
  u16 depth;
  u16 generation;
  u8 flag;
} tentry_t;

typedef struct {
  tentry_t entries[TT_BUCKET_SIZE];
  int items_filled;
} tbucket_t;

typedef tbucket_t* ttable_t;

struct ttable_insert_args {
  u64 key;
  move_t move;
  i16 score;
  i16 eval;
  u16 depth;
  u16 generation;
  u8 flag;
};

void ttable_init(ttable_t *table);
void ttable_deinit(ttable_t table);
void __ttable_insert(ttable_t table, struct ttable_insert_args args);
tentry_t *ttable_find(ttable_t table, u64 key);

#define ttable_insert(ttable, ...) __ttable_insert( \
  ttable, \
  (struct ttable_insert_args) { __VA_ARGS__ } \
)

#endif // TTABLE_H