Skip to content

Latest commit

 

History

History
44 lines (35 loc) · 3.51 KB

README.md

File metadata and controls

44 lines (35 loc) · 3.51 KB

Fast chess move generation library. Uses SIMD for fast sliding piece move generation

Example usage:

use chess_move_gen::*;
let mut list = MoveVec::new();
let position = &Position::from_fen("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w QqKk - 0 1").unwrap();
legal_moves::<MoveVec>(position, &mut list);
assert_eq!(list.len(), 20);

Ways to store moves:

MoveVec: Wraps a vector of generated moves, useful if you need to access the actual moves being generated

MoveCounter: Counts moves of each kind (captures, castles, promotions etc). Useful if you are making a perft function or need statistics about moves for a position, but don't care about the actual moves

SortedMoveAdder + SortedMoveHeap: Stores genarated moves in a sorted binary heap, which are efficiently ordered as they are inserted based on a heuristic scoring and piece-square table that you provide. Use this if you want the moves to have a reasonably good initial ordering so moves that are checked first are more likely to lead to eg alpha-beta cutoffs and reduce the search tree size.


This crate also provides many Rust implementations for sliding-piece move generation. Run RUSTFLAGS='-C target-cpu=native' cargo bench to see the performance of each implementation on your machine.

test generation::slider::ray_bmi2::test::bench_bishop_attacks_from_sq         ... bench:         529.68 ns/iter (+/- 132.89)
test generation::slider::ray_bmi2::test::bench_multiple_bishop_attacks        ... bench:       1,523.23 ns/iter (+/- 271.93)
test generation::slider::ray_bmi2::test::bench_multiple_rook_attacks          ... bench:       1,523.64 ns/iter (+/- 138.77)
test generation::slider::ray_bmi2::test::bench_rook_attacks_from_sq           ... bench:         652.55 ns/iter (+/- 63.71)
test generation::slider::ray_hyperbola::test::bench_bishop_attacks_from_sq    ... bench:         895.29 ns/iter (+/- 199.15)
test generation::slider::ray_hyperbola::test::bench_multiple_bishop_attacks   ... bench:       2,489.84 ns/iter (+/- 214.09)
test generation::slider::ray_hyperbola::test::bench_multiple_rook_attacks     ... bench:       2,974.33 ns/iter (+/- 298.86)
test generation::slider::ray_hyperbola::test::bench_rook_attacks_from_sq      ... bench:         859.65 ns/iter (+/- 116.43)
test generation::slider::ray_kogge_stone::test::bench_bishop_attacks_from_sq  ... bench:       1,336.16 ns/iter (+/- 107.25)
test generation::slider::ray_kogge_stone::test::bench_multiple_bishop_attacks ... bench:       1,272.63 ns/iter (+/- 318.64)
test generation::slider::ray_kogge_stone::test::bench_multiple_rook_attacks   ... bench:       1,225.76 ns/iter (+/- 102.96)
test generation::slider::ray_kogge_stone::test::bench_rook_attacks_from_sq    ... bench:       1,296.88 ns/iter (+/- 41.14)
test generation::slider::ray_naive::test::bench_bishop_attacks_from_sq        ... bench:       2,358.44 ns/iter (+/- 225.09)
test generation::slider::ray_naive::test::bench_multiple_bishop_attacks       ... bench:      15,144.05 ns/iter (+/- 691.27)
test generation::slider::ray_naive::test::bench_multiple_rook_attacks         ... bench:      15,526.90 ns/iter (+/- 903.83)
test generation::slider::ray_naive::test::bench_rook_attacks_from_sq          ... bench:       2,311.20 ns/iter (+/- 215.17)
test generation::slider::ray_subtract::test::bench_bishop_attacks_from_sq     ... bench:       1,901.60 ns/iter (+/- 324.79)
test generation::slider::ray_subtract::test::bench_rook_attacks_from_sq       ... bench:       2,082.14 ns/iter (+/- 624.36)