- Significantly optimize FEN writing. Add
append_to_string()
,append_ascii_to()
, andwrite_ascii_to()
for typesSquare
,BoardFen
,Fen
,Epd
,San
,SanPlus
, andUciMove
. - Add
Setup::mirror()
andinto_mirrored()
, addUciMove::to_mirrored()
, addMove::to_mirrored()
. - Rename
{ByColor,ByCastlingSide}::into_flipped()
tointo_swapped()
(with deprecated alias remaining). - Make fields of
PlayError
public. DeprecatePlayError::into_inner()
.
- Fix overly specific SAN disambiguation where rank would suffice.
- Fix
no_std
compatibility. - Rename
Uci
toUciMove
(with a deprecated alias remaining).
- Improve Zobrist hashing.
- Regroup internal tables for cache efficiency.
- Optimize bit-widths less than the full
Zobrist128
. Crazyhouse
pockets with more than standard material no longer prone to collisions.- Change
Crazyhouse
andThreeCheck
hashes ❗
- Undocument
CastlingSide
discriminants. No longer considered stable. - Add
ByCastlingSide
. - Add
Board::swap_colors()
. - Add
ByColor::swap()
. - Provide integer conversions for
Color
. - For types that have integer conversions, also support
u128
andi128
.
- Change semantics of
PartialEq
forChess
❗ (FIDE rules for repetitions instead of structural equality) - Implement
Hash
,PartialEq
, andEq
for all variant positions. - Replace
build.rs
with const evaluation. Bump MSRV to 1.70.
- Remove
step
feature. - Fix inconsistent
Hash
forChess
due to irrelevant en passant squares. - Relax and more precisely document
CastlingMode::Chess960
. - Rename
PositionErrorKinds::IMPOSSIBLE_MATERIAL
toTOO_MUCH_MATERIAL
. - Implement
BitXorAssign
forColor
. - Added
Bitboard::{isolate_first,isolate_last,discard_last,without_last}()
.
- Update
PositionErrorKinds
tobitflags
2. - Remove previously deprecated methods.
- Bump minimum supported Rust version to 1.63.
- Significantly optimize performance of Zobrist hashing.
- Add
Variant::from_ascii()
. - Implement
Default
forVariantPosition
. - Use
#[track_caller]
for panicking functions.
- Add optional
nohash-hasher
feature. - Implement
Display
andFromStr
forVariant
. Variant::from_uci()
now returnsResult
instead ofOption
.- Make
Variant::distinguishes_promoted()
const
. - Introduce
Zobrist{8,16,32,64,128}
types for Zobrist hash values. - Consider
EnPassantMode
for Zobrist hashing. - Removed API for incremental Zobrist hashing which was never implemented.
- Let
Board::board_fen()
return struct that implementsDisplay
instead ofString
. - Introduce
alloc
andstd
features, which can be disabled for#![no_std]
support. - Make many methods
const
.
- Add
Board::from_bitboards()
andBoard::into_bitboards()
.
- Optimize
Position::outcome()
. - Detect Antichess insufficient material with only two knights.
- Fix off-backrank king influencing invalid castling notation in FEN.
- Fix castling rights without matching rooks failing FEN/EPD parser roundtrip.
- Fix pawn moves like
P6h8
failing SAN parser roundtrip. - More precisely document FEN/EPD parser and writer.
- More strictly validate pawns on backrank in
Horde
. - More strictly validate impossible material in
RacingKings
. - Add
{Rank,File}::distance()
. - Implement
Copy
forByRole
andByColor
when possible. - Constify most
Bitboard
functions.
- Rename
Castles::discard_side()
todiscard_color()
andCastles::has_side()
tohas_color()
. - Add
Bitboard::without_first()
. - Add
Bitboard::shift()
. - Add
{Fen,Epd}::from_setup()
and{Fen,Epd}::as_setup()
. - Implement
Clone
forPositionError
when possible.
- Refactor
Setup
: It is now a struct instead of a trait. - Introduce
EnPassantMode
argument forPosition::ep_square()
. - Refactor
fen
module: It is now based onFen
andEpd
wrappers forSetup
that implementDisplay
andFromStr
. More clearly describe the parser. Remove non-standard formatting options. - Tweak
ByColor
and make it iterable. - Introduce
ByRole
. - Implement
IntoIterator
forBoard
, replacingBoard::pieces()
. - Remove
Material
andMaterialSide
. UseByColor<ByRole<u8>>
instead. - Ensure
RemainingChecks
value is between 0 and 3. - Fix integer overflow for invalid FEN that has too many ranks.
- Remove all deprecated methods.
- Fix move generation and validation for invalid positions where check is incompatible with the en passant square.
- Add
Square::xor()
.
- Fix parsing of empty string as
Fen
. - Fix
PositionErrorKings::MISSING_KING
given for too many kings. - Fix minimum required
bitflags
version (-Z minimal-versions
). - Tighten
PositionErrorKinds::IMPOSSIBLE_MATERIAL
.
- Accept duplicate spaces (and underscores) between FEN fields.
- Let FEN parser record and accept syntactically correct impossible castling rights. They will instead be rejected when setting up the position.
- Let FEN parser reject more than two castling rights per side.
- Accept underscores in FENs.
- Significantly optimize pawn capture generation (+10% perft speed).
- Addded
Square::offset_unchecked()
. - Deprecated
Bitboard::rank()
. UseBitboard::from_rank()
. - Deprecated
Bitboard::file()
. UseBitboard::from_file()
. - Deprecated
Bitboard::relative_rank()
. UseColor::relative_rank()
.
- Implement
FromStr
forOutcome
. - Add geometric transformation methods to
Board
. - Introduce
Color::fold_wb()
in favor ofColor::fold()
.
- Minimum supported Rust version is now 1.56.
- Fixed
Atomic
position validation, where the remaining king is attacked, but the other king has exploded. - Fixed
Material::from_ascii()
. Now requiresv
separator, and rejects inputs with more than 64 pieces in total.
- Fixed signature of
ByColor::new_with()
. Technically semver breaking. - Deprecated
Bitboard::ALL
. UseBitboard::FULL
instead. - Improved
Display
ofPositionError
. - Removed implementations of deprecated
Error::description()
. - Added
PositionError::ignore_impossible_check()
. - Added
{Color,Role,CastlingSide,Rank,File,Square}::ALL
. - Added
Outcome::from_winner()
. - Added
ByColor::as_mut()
. - Added
ByColor::zip()
andByColor::zip_color()
. - Added
File::upper_char()
. - Implement
IntoIterator
forByColor
. - Implement
Display
andFromStr
forColor
. - Added
Zobrist::as_inner()
.
- Removed tracking of promoted pieces from
Board
and addedSetup::promoted()
instead. This is used only by Crazyhouse. All other variants will returnBitboard(0)
. RemovedFenOpts::promoted()
accordingly. Movedfen::board_fen()
as a method toBoard
. - Implemented Zobrist hashing.
- Fixed (or rather implemented) insufficient material detection for
Horde
. - Added new feature
step
that implements the nightlyStep
trait forFile
,Rank
andSquare
. - Let
Bitboard
respectDisplay
formatting options. - Fixed return type of
File::offset()
. - Implemented
Eq
andHash
forChess
andPieces
.
- Update
arrayvec
to 0.7.x.MoveList
is now using const generics. - Derive
Hash
forMove
,Outcome
, andFen
. - Eliminate unsafe usage where no longer required for performance. Justify remaining cases.
- Remove
f32
,f64
,u128
, andi128
conversions. - Use
std::num::TryFromIntError
. - Functions now return
MoveList
instead of using it as an out parameter. Return value optimization by hand is no longer required. - Introduce
ByColor
, used asMaterial
andByColor<RemainingChecks>
. - Introduce
PlayError
. - Renamed
variants
module tovariant
. Now gated behind a non-default featurevariant
.
- Parse
Uci::to_move()
where king captures unmoved rook.
- Also reject checker aligned with king and en passant square with
PositionErrorKinds::IMPOSSIBLE_CHECK
.
- Introduce
CastlingMode
, now required forFromSetup::from_setup(..., mode)
, theVariantPosition
analogon,Fen::position(mode)
, and exposed byCastles::mode()
. Uci::from_move()
now takes the mode as context instead of the position. Givepos.castles().mode()
for the old behavior.- Add
Uci::from_standard()
. - Rework
PositionError
. The original error kinds are available asPositionError::kinds()
. There are now methods to safely ignore particular errors. - Reject setups with impossible (i.e., too much) material with the new
PositionErrorKinds::IMPOSSIBLE_MATERIAL
. Can be ignored usingPositionError::ignore_impossible_material()
for the previous behavior. - Reject setups with multiple aligned sliding checkers with the new
PositionErrorKinds::IMPOSSIBLE_CHECK
. - Rename
BAD_CASTLING_RIGHTS
toINVALID_CASTLING_RIGHTS
. - Remove
IllegalMoveError
. In the context of UCI validation, replace withIllegalUciError
.Position::play()
instead returns the original position as the error. - Change
fullmoves
fromu32
toNonZeroU32
everywhere. - Remove public
Castles::from_setup()
. - Remove
Square::with_rank_of()
. - Remove
Giveaway
in favor ofAntichess
(where players start without castling rights). - Fix
swap_turn()
if en passant square exists. Would always fail, now discards the en passant square. - Add
Move::to_uci()
convenience method. - Add
CastlingSide::{king,rook}_to_file()
. - Add
Variant::distinguishes_promoted()
. - Add
Variant::uci()
andVariant::from_uci()
. - Future proof error types (remove some implemented traits and available constructors).
- Fix insufficient material detection with same-color bishops on both sides.
- Document limitations of
Position::is_irreversible()
. Moves that cede en passant are now considered irreversible.
- Implement
From<Role>
for nonzero integer types. - Performance: Remove internal
BB_BETWEEN
table and compute it from rays at runtime, to improve cache efficiency. - Support Miri.
- Fix Racing Kings game end detection: Black cannot catch up if their own pieces block the goal.
- Pawn drops in Crazyhouse are now considered zeroing.
- Fix (impossible) Crazyhouse insufficient material.
- Fix (impossible) castling rights of exploded king in Atomic chess.
- Update
arrayvec
to 0.5.x, which comes with significant performance improvements. - The default
Giveaway
position now has castling rights.
- Follow FICS rules in Atomic castling edge cases.
- Use
#[repr(align)] enum
andreverse_bits()
stabilized in Rust 1.37.
- In Horde chess, allow double pawn moves from the first rank.
- Added
{Square,Bitboard}::{flip_anti_diagonal,rotate_90,rotate_180,rotate_270}()
.
- FEN parser was expecting
~
before promoted pieces, but it should be after.
- Moved
Position::from_setup()
to a seperate new traitFromSetup
. - Square and file/rank index calculations are now performed with
u32
andi32
, which is more performant than using the narrower typesu8
andi8
. The types are still#[repr(u8)]
. - Renamed
Square::combine()
toSquare::with_rank_of()
. - Added
Fen::from_setup()
. - Added
FenOpts::scid()
for Scid/Lichess compatible FEN formatting. Of course the parser also accepts these formats. - Added
variant::Variant
andVariantPosition
for runtime selected chess variants. Limited to the built in variants. - Added
{Material,MaterialSide}::is_empty()
.
TryFrom
now available on stable.
SanPlus::from_move()
no longer requires the move to be legal, which was an undocumented requirement. The newSanPlus::from_move_and_play_unchecked()
is closest to the previous behavior.- Added
San::disambiguate()
andSanSuffix::from_position()
. - Implement
TryFrom
for various types on nightly. - Implement
Add
,AddAssign
,Sub
,SubAssign
forMaterial
andMaterialSide
. - Added
CastlingSide::from_{king|queen}_side()
. - Use
u32
fordepth
argument ofperft()
.
- Performance improvements on nightly (aligned
Move
enum).
- Replaced
SanPlus::check
andSanPlus::checkmate
withsan::Suffix
enum. - Renamed
{Rank,File}::rotate()
toflip_diagonal()
. - Renamed
Bitboard::flip()
totoggle()
. - Added
Square::coords()
. - Added
Bitboard::flip_{vertical,horizontal,diagonal}()
. - Added
Position::promotion_moves()
. - Derive
Hash
onBoard
,FenOpts
,San
,SanPlus
,Suffix
,Color
,Role
,Piece
,RemainingChecks
,CastlingSide
, andUci
. - Minimum Rust version 1.31.0.
Setup::halfmove_clock()
is nowSetup::halfmoves()
.- New conversions:
f32::from(file)
,f64::from(rank)
. - Replace
Pockets
andPocket
by more generalMaterial
andMaterialSide
. Note that theirDisplay
andFromStr
implementations differ. - Unify naming of error types.
- Fix Atomic insufficient material: KQN can mate.
- Fix Chess960 should not allow a-side castling over a blocking h-side rook.
Outcome
is nowCopy
.Position::castling_uncovers_rank_attack()
is no longer public.
- Add
File
,Rank
. These are now returned bySquare::{file, rank}
.Square::from_coords(file, rank)
takes the new types and is no longer fallible. Bitboard
is nowIntoIterator
instead ofIterator
itself. MethodsBitboard::{first, last, count, is_empty}
remain.Bitboard::{add, flip, discard, with, without}
are now generic overInto<Bitboard>
. Alternative methods*_all
have been removed.Bitboard::relative_shift(color, shift: u8)
now takesu32
.shakmaty::CarryRippler
is nowshakmaty::bitboard::CarryRippler
.- Add new methods:
Bitboard::{pop_front, pop_back, is_disjoint, is_subset, is_superset}
. - Add
Position::has_insufficient_material(color)
.
- Remove
uci
,chess960_uci
,san
andsan_plus
that were deprecated in 0.8.1. - Rename
*::from_bytes()
to*::from_ascii()
. - Take small copy types by value:
Piece::char()
,CastlingSide::*
. - Add
Castles::has(color, side)
. fen::{board_fen, epd, fen}
are now shortcuts for formatting with default options.- Minimum rust version 1.27.0 (i128 conversions again, fused iterators again,
Option::filter()
,dyn Trait
). - Eliminate many uses of unsafe, including
TrustedLen
impls, at minor cost.
- Make
Role
discriminants public. - Put
San
,SanPlus
andUci
constructors onSan
,SanPlus
andUci
respectively.
- Revert fused iterators and u128. Minimum Rust version back to 1.23.0.
- Change
Role
discriminants. Now starting withPawn = 1
. - Performance improvements (~12% faster perft).
- Switch benchmarks to
criterion.rs
.
- Add
Outcome.winner()
.
- Minimum Rust version 1.26.0 (fused iterators, u128 conversions).
- Reintroduce the remaining Lichess variants:
Crazyhouse
,KingOfTheHill
,ThreeCheck
,Horde
,RacingKings
. - Expose
Position.castles()
and replacePosition.is_chess960()
withPosition.castles().is_chess960()
. - Fix insufficient material: KNvK was not given as drawn due to a typo.
- Fix insufficient material in
Atomic
: Two knights of different colors are not safe. - Let
Pockets.count()
andPocket.count()
returnusize
.
- Giveaway starting position should have no castling rights.
- Fix missing king promotions in Giveaway.
- Validate color of missing king in atomic chess.
- Clear move buffers before generating variant moves.
- Reintroduce
Giveaway
andAtomic
chess variants.
- New method
Move.is_zeroing()
.
- Make unit error types (
InvalidSquareName
,InvalidUci
,InvalidSan
) completely public. - Documentation, coding style and debugging tweaks.
- Expose
attacks::bishop_mask
andattacks::rook_mask
. - Eliminate almost all unchecked indexing.
- Split
impl From<Move> for Uci
intouci()
andchess960_uci()
. - Fix display of pawn drops.
- Move generating methods clear the move buffer (and therefor no longer panic on too full buffers).
- Added
Position.is_chess960()
,Bitboard.without_all()
,Role.upper_char()
,Board.stepper()
.
- Fix
Uci::to_move()
for en passant moves. Thanks zxqfl.
- Use
u64
instead ofusize
forperft()
. - Export error type
InvalidSquareName
. - New methods:
CastlingSide.is_{queen|king}_side()
,San.matches()
,Move.is_capture()
,Move.is_promotion()
,Move.castling_side()
,Position.is_check()
. - Derive
Ord
andPartialOrd
forRole
. - Support running benchmarks on stable.
- Fix build error on beta due to the new nightly
option_filter
feature. - Fix unterminated code block in documentation.
- Fix build error due to the new nightly
option_filter
feature.
- Rename
Color::from_bool()
toColor::from_white()
, addColor::from_black()
. - Add
Move::role()
,Move::is_en_passant()
andMove::is_castle()
. - Add
Position::en_passant_moves()
andPosition::capture_moves()
. - Implement
BitXor<bool>
forColor
. - Implement
FusedIterator
andTrustedLen
onBitboard
.
- Switch to
#[repr(i8)]
forSquare
. Implement all lossless integer conversionsFrom<Square>
. - Add
Square::flip_horizontal()
,flip_vertical()
andflip_diagonal()
. - Efficiently implement
CarryRippler::last()
by @nvzqz. - Eliminate some unchecked indexing by @nvzqz.
- Faster ASCII case conversions and tests by @nvzqz.
Square
is now a#[repr(u8)]
enum.- Use
bitflags
forPositionError
. - Rename
RemainingChecks::subtract()
todecrement()
. - Add
Position::swap_turn()
.
- First release with support for stable Rust.