diff --git a/src/board/mod.rs b/src/board/mod.rs index 4d0775b..16dd948 100644 --- a/src/board/mod.rs +++ b/src/board/mod.rs @@ -6,4 +6,5 @@ pub mod history; pub mod mailbox; pub mod square; pub mod state; +pub mod transposition_table; pub mod zobrist; diff --git a/src/board/transposition_table.rs b/src/board/transposition_table.rs new file mode 100644 index 0000000..12f2890 --- /dev/null +++ b/src/board/transposition_table.rs @@ -0,0 +1,81 @@ +use crate::movegen::r#move::Move; + +use super::zobrist::ZobristHash; + +#[derive(Clone)] +pub struct TranspositionTable { + positions: Vec>, + size: u64, +} + +impl TranspositionTable { + pub fn new(size: u64) -> Self { + Self { + positions: (0..size).map(|_| None).collect(), + size, + } + } + + pub fn lookup(&self, zobrist_hash: ZobristHash) -> &TranspositionTableEntry { + self.positions + .get((zobrist_hash.hash % self.size) as usize) + .unwrap() + .as_ref() + .unwrap() + } + + pub fn insert(&mut self, tt_entry: TranspositionTableEntry, hash: ZobristHash) { + let index = hash.hash % self.size; + self.positions.insert(index as usize, Some(tt_entry)); + } +} + +#[derive(Clone)] +pub struct TranspositionTableEntry { + hash: ZobristHash, + depth: u8, + alpha: i32, + beta: i32, + mv: Move, + node_type: NodeType, +} + +impl TranspositionTableEntry { + pub const fn new( + hash: ZobristHash, + depth: u8, + alpha: i32, + beta: i32, + mv: Move, + node_type: NodeType, + ) -> Self { + Self { + hash, + depth, + alpha, + beta, + mv, + node_type, + } + } +} + +#[derive(Clone)] +pub enum NodeType { + Exact, + LowerBound, + UpperBound, +} + +#[cfg(test)] +mod tests { + + #[test] + fn test_transpotisition() -> Result<(), String> { + // TODO: + // >have specific board state + // >run a deep search for this board state + // >test some expected outcomes that should have been stored in the TT + Ok(()) + } +} diff --git a/src/board/zobrist.rs b/src/board/zobrist.rs index 1216f56..a1a2bb7 100644 --- a/src/board/zobrist.rs +++ b/src/board/zobrist.rs @@ -106,7 +106,7 @@ impl Default for ZobristKeys { #[derive(Debug, Clone, PartialEq, Eq, Copy)] pub struct ZobristHash { - hash: u64, + pub hash: u64, } impl ZobristHash {