haitaka

Crates.iohaitaka
lib.rshaitaka
version0.3.2
created_at2025-04-05 04:38:40.065054+00
updated_at2025-05-13 00:50:58.449992+00
descriptionRust Shogi move generation library
homepagehttps://github.com/tofutofu/haitaka
repositoryhttps://github.com/tofutofu/haitaka
max_upload_size
id1621524
size224,905
(tofutofu)

documentation

README

haitaka ハイタカ   Latest Version Build Status Documentation

Rust Shogi move generation library

haitaka is a Shogi move generation library written in Rust that aims to support fast move generation. It is inspired by the beautifully designed cozy-chess library written by analog-hors. The layout of the modules and the overall design is largely the same as in cozy-chess. Many low-level functions were copied from cozy-chess, with only trivial modifications, but since there are significant differences between Shogi and International Chess, I also modified some of the higher-level functions and added extra functionality.

Name

"Haitaka" or "taka" means "sparrowhawk" in Japanese. "Taka" is a haiku kigo (season word) associated with winter.

   鷹の眼​にこぼれて雁のたち騒ぐ
   Taka no me ni koborete kari no tachisawagu

   ​Escaping the hawk's eye,
   the wild geese
   rise in tumult.

   -— 加賀千代女 (Kaga no Chiyojo)

Overview

  • no_std compatible
  • Strongly-typed API that makes heavy use of newtypes to avoid errors
  • Efficient bitboard-based board representation
  • Performant legal move generation
  • Incrementally updated zobrist hash for quickly obtaining a hash of a board
  • Supporting both Magic Bitboards and the Qugiy algorithm for slider move generation
  • Support for parsing SFEN strings

Main differences with cozy-chess

  • BitBoard uses u128 instead of u64 as backing to handle the 9x9 Shogi board
  • Move generation handles both board moves and drops
  • Move generation of sliders also implements the Qugiy algorithm
  • File-major ordering of squares to make move generation faster

Crate features

  • std: Enable features that require std. Currently only used for the Error trait.

Installation

Add haitaka to your Cargo.toml:

[dependencies]
haitaka = "0.2.1"   # or use the latest version on crates.io

Usage

Basic

use haitaka::*;
// Start position
let board = Board::startpos();
let mut move_list = Vec::new();
board.generate_moves(|moves| {
    // Unpack into move list
    move_list.extend(moves);
    false
});
assert_eq!(move_list.len(), 30);

Perft

cargo run --release --example perft -- 5

Testing

This code has been tested on an Apple M2, using the stable-aarch64-apple-darwin toolchain. In GitHub workflows it has also been tested on Ubuntu.

The code has not yet been used in a Shogi engine, so should still be seen as experimental.

To run all tests use:

cargo test

Contributing

Contributions are very welcome! Please open an issue or submit a pull request on GitHub.

Acknowledgments

Portions of this library are derived from the cozy-chess project by analog-hors. The cozy-chess project is licensed under the MIT license, and its license text is included in this repository under third_party/cozy-chess/LICENSE.

References

Commit count: 144

cargo fmt