From 70d6c23c007abe6255244b849464472d1eb60cc6 Mon Sep 17 00:00:00 2001 From: Bruno Raoult Date: Tue, 26 Mar 2024 17:31:44 +0100 Subject: [PATCH] position add: pos_set_pinners_blockers() --- Makefile | 50 +++++++++++++++++++++++++++++++++----------------- src/position.c | 39 +++++++++++++++++++++++++++++++-------- src/position.h | 9 ++++----- 3 files changed, 68 insertions(+), 30 deletions(-) diff --git a/Makefile b/Makefile index fa97e43..6dba1e9 100644 --- a/Makefile +++ b/Makefile @@ -86,23 +86,36 @@ CPPFLAGS := $(strip $(CPPFLAGS)) ##################################### compiler flags CFLAGS := -std=gnu11 -#CFLAGS += -flto -CFLAGS += -O1 -CFLAGS += -g + +### dev OR release +# dev +#CFLAGS += -O1 +#CFLAGS += -g +# release +CFLAGS += -Ofast + +CFLAGS += -march=native +CFLAGS += -flto CFLAGS += -Wall CFLAGS += -Wextra -CFLAGS += -march=native CFLAGS += -Wmissing-declarations # for gprof -# CFLAGS += -pg +#CFLAGS += -pg # Next one may be useful for valgrind (when invalid instructions) # CFLAGS += -mno-tbm CFLAGS := $(strip $(CFLAGS)) +# development CFLAGS - unused - TODO +#DEV_CFLAGS := -O1 +#DEV_CFLAGS += -g + +# release CFLAGS - unused - TODO +#REL_CFLAGS := -Ofast + ##################################### linker flags LDFLAGS := -L$(BRLIBDIR) -#LDFLAGS += -flto +LDFLAGS += -flto LDFLAGS := $(strip $(LDFLAGS)) @@ -286,19 +299,17 @@ memcheck: targets ##################################### test binaries .PHONY: testing test -TEST := piece-test fen-test bitboard-test movegen-test attack-test movedo-test +TEST := piece-test fen-test bitboard-test movegen-test attack-test +TEST += movedo-test perft-test PIECE_OBJS := piece.o -FEN_OBJS := fen.o position.o piece.o bitboard.o board.o hyperbola-quintessence.o \ - attack.o -BB_OBJS := fen.o position.o piece.o bitboard.o board.o hyperbola-quintessence.o \ - attack.o -MOVEGEN_OBJS := fen.o position.o piece.o bitboard.o board.o hyperbola-quintessence.o \ - attack.o move.o move-gen.o -ATTACK_OBJS := fen.o position.o piece.o bitboard.o board.o hyperbola-quintessence.o \ - attack.o move.o move-gen.o -MOVEDO_OBJS := fen.o position.o piece.o bitboard.o board.o hyperbola-quintessence.o \ - attack.o move.o move-gen.o move-do.o +FEN_OBJS := $(PIECE_OBJS) fen.o position.o bitboard.o board.o \ + hyperbola-quintessence.o attack.o +BB_OBJS := $(FEN_OBJS) +MOVEGEN_OBJS := $(BB_OBJS) move.o move-gen.o +ATTACK_OBJS := $(MOVEGEN_OBJS) +MOVEDO_OBJS := $(ATTACK_OBJS) move-do.o +PERFT_OBJS := $(MOVEDO_OBJS) search.o TEST := $(addprefix $(BINDIR)/,$(TEST)) @@ -308,6 +319,7 @@ BB_OBJS := $(addprefix $(OBJDIR)/,$(BB_OBJS)) MOVEGEN_OBJS := $(addprefix $(OBJDIR)/,$(MOVEGEN_OBJS)) ATTACK_OBJS := $(addprefix $(OBJDIR)/,$(ATTACK_OBJS)) MOVEDO_OBJS := $(addprefix $(OBJDIR)/,$(MOVEDO_OBJS)) +PERFT_OBJS := $(addprefix $(OBJDIR)/,$(PERFT_OBJS)) test: echo TEST=$(TEST) @@ -339,6 +351,10 @@ bin/movedo-test: test/movedo-test.c test/common-test.h $(MOVEDO_OBJS) @echo compiling $@ test executable. @$(CC) $(ALL_CFLAGS) $< $(MOVEDO_OBJS) $(ALL_LDFLAGS) -o $@ +bin/perft-test: test/perft-test.c test/common-test.h $(PERFT_OBJS) + @echo compiling $@ test executable. + @$(CC) $(ALL_CFLAGS) $< $(PERFT_OBJS) $(ALL_LDFLAGS) -o $@ + ##################################### Makefile debug .PHONY: showflags wft diff --git a/src/position.c b/src/position.c index aa9d150..3ffb827 100644 --- a/src/position.c +++ b/src/position.c @@ -186,6 +186,30 @@ bitboard_t pos_checkers(const pos_t *pos, const color_t color) return sq_attackers(pos, occ, pos->king[color], OPPONENT(color)); } +/** + * pos_king_pinners_blockers() - set position "pinners" and "blockers". + * @pos: &position + * + * set position "pinners" on player-to-play king. + * + */ +void pos_set_pinners_blockers(pos_t *pos) +{ + color_t color = pos->turn; + square_t king = pos->king[color]; + bitboard_t tmp, occ = pos_occ(pos), blockers = 0; + int pinner; + + pos->pinners = sq_pinners(pos, king, OPPONENT(pos->turn)); + bit_for_each64(pinner, tmp, pos->pinners) { + //bitboard_t blocker = + // warn_on(popcount64(blocker) != 1); + blockers |= bb_between_excl[pinner][king] & occ; + } + pos->blockers = blockers; + return; +} + /** * pos_king_pinners() - get the "pinners" on a king "pinners". * @pos: &position @@ -218,13 +242,12 @@ bitboard_t pos_king_blockers(const pos_t *pos, const color_t color, const bitboa square_t pinner, king = pos->king[color]; bit_for_each64(pinner, tmp, pinners) { - bitboard_t blocker = bb_between_excl[pinner][king] & occ; - warn_on(popcount64(blocker) != 1); - if (popcount64(blocker) != 1) { - printf("n blockers = %d\n", popcount64(blocker)); - bb_print("blockers", blocker); - } - blockers |= blocker; + //warn_on(popcount64(blocker) != 1); + //if (popcount64(blocker) != 1) { + // printf("n blockers = %d\n", popcount64(blocker)); + // bb_print("blockers", blocker); + //} + blockers |= bb_between_excl[pinner][king] & occ; } return blockers; } @@ -333,7 +356,7 @@ void pos_print_mask(const pos_t *pos, const bitboard_t mask) } /** - * pos_print_board_raw - print simple position board (octal/FEN symbol values) + * pos_print_raw - print simple position board (octal/FEN symbol values) * @bb: the bitboard * @type: int, 0 for octal, 1 for fen symbol */ diff --git a/src/position.h b/src/position.h index 8dd9935..2a41a68 100644 --- a/src/position.h +++ b/src/position.h @@ -30,7 +30,8 @@ typedef struct __pos_s { u64 node_count; /* evaluated nodes */ int turn; /* WHITE or BLACK */ - /* data which cannot be recovered by move_undo + /* data which cannot be recovered by move_undo (like castle_rights, ...), + * or would be expensive to recover (checkers, ...) * following data can be accessed either directly, either via "movesave" * structure name. * For example, pos->en_passant and pos->state.en_passant are the same. @@ -48,7 +49,6 @@ typedef struct __pos_s { ); piece_t board[BOARDSIZE]; - bitboard_t bb[2][PIECE_TYPE_MAX]; /* bb[0][PAWN], bb[1][ALL_PIECES] */ //bitboard_t controlled[2]; /* unsure */ square_t king[2]; /* dup with bb, faster retrieval */ @@ -159,12 +159,11 @@ void pos_del(pos_t *pos); pos_t *pos_clear(pos_t *pos); bool pos_cmp(const pos_t *pos1, const pos_t *pos2); +//bitboard_t set_king_pinners_blockers(pos_t *pos); +void pos_set_pinners_blockers(pos_t *pos); bitboard_t pos_checkers(const pos_t *pos, const color_t color); bitboard_t pos_king_pinners(const pos_t *pos, const color_t color); bitboard_t pos_king_blockers(const pos_t *pos, const color_t color, const bitboard_t ); -//bitboard_t set_king_pinners_blockers(pos_t *pos); -//char *pos_checkers2str(const pos_t *pos, char *str); -//char *pos_pinners2str(const pos_t *pos, char *str); int pos_check(const pos_t *pos, const bool strict);