diff options
author | CoprDistGit <infra@openeuler.org> | 2023-05-18 03:58:40 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-05-18 03:58:40 +0000 |
commit | 834be82c1524bbcfcbba691694f92173c20cfdde (patch) | |
tree | 7fb9758a93cefbb8458e73cc37bc254628267b0d | |
parent | 5be2085622d8d54b08e2015bce22ccdcaf1580f2 (diff) |
automatic import of python-stockfish
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | python-stockfish.spec | 1155 | ||||
-rw-r--r-- | sources | 1 |
3 files changed, 1157 insertions, 0 deletions
@@ -0,0 +1 @@ +/stockfish-3.28.0.tar.gz diff --git a/python-stockfish.spec b/python-stockfish.spec new file mode 100644 index 0000000..a920fee --- /dev/null +++ b/python-stockfish.spec @@ -0,0 +1,1155 @@ +%global _empty_manifest_terminate_build 0 +Name: python-stockfish +Version: 3.28.0 +Release: 1 +Summary: Wraps the open-source Stockfish chess engine for easy integration into python. +License: MIT +URL: https://github.com/zhelyabuzhsky/stockfish +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/dc/bd/b06883b957530867179da3672fa3d8b87a08a1e3c11ca9737d94b60689d2/stockfish-3.28.0.tar.gz +BuildArch: noarch + + +%description +# Stockfish +Implements an easy-to-use Stockfish class to integrates the Stockfish chess engine with Python. + +## Install +```bash +$ pip install stockfish +``` + +#### Ubuntu +```bash +$ sudo apt install stockfish +``` + +#### Mac OS +```bash +$ brew install stockfish +``` + +## Features and usage examples + +### Initialize Stockfish class + +You should install the stockfish engine in your operating system globally or specify path to binary file in class constructor + +```python +from stockfish import Stockfish + +stockfish = Stockfish(path="/Users/zhelyabuzhsky/Work/stockfish/stockfish-9-64") +``` + +There are some default engine settings used by this wrapper. For increasing Stockfish's strength and speed, the "Threads" and "Hash" parameters can be modified. +```python +{ + "Debug Log File": "", + "Contempt": 0, + "Min Split Depth": 0, + "Threads": 1, # More threads will make the engine stronger, but should be kept at less than the number of logical processors on your computer. + "Ponder": "false", + "Hash": 16, # Default size is 16 MB. It's recommended that you increase this value, but keep it as some power of 2. E.g., if you're fine using 2 GB of RAM, set Hash to 2048 (11th power of 2). + "MultiPV": 1, + "Skill Level": 20, + "Move Overhead": 10, + "Minimum Thinking Time": 20, + "Slow Mover": 100, + "UCI_Chess960": "false", + "UCI_LimitStrength": "false", + "UCI_Elo": 1350 +} +``` + +You can change them, as well as the default search depth, during your Stockfish class initialization: +```python +stockfish = Stockfish(path="/Users/zhelyabuzhsky/Work/stockfish/stockfish-9-64", depth=18, parameters={"Threads": 2, "Minimum Thinking Time": 30}) +``` + +These parameters can also be updated at any time by calling the "update_engine_parameters" function: +```python +stockfish.update_engine_parameters({"Hash": 2048, "UCI_Chess960": "true"}) # Gets stockfish to use a 2GB hash table, and also to play Chess960. +``` + +### Set position by a sequence of moves from the starting position +```python +stockfish.set_position(["e2e4", "e7e6"]) +``` + +### Update position by making a sequence of moves from the current position +```python +stockfish.make_moves_from_current_position(["g4d7", "a8b8", "f1d1"]) +``` + +### Set position by Forsyth–Edwards Notation (FEN) +If you'd like to first check if your fen is valid, call the is_fen_valid() function below. +Also, if you want to play Chess960, it's recommended you first update the "UCI_Chess960" engine parameter to be "true", before calling set_fen_position. +```python +stockfish.set_fen_position("rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2") +``` + +### Check whether the given FEN is valid +This function returns a bool saying whether the passed in FEN is valid (both syntax wise and whether the position represented is legal). +The function isn't perfect and won't catch all cases, but generally it should return the correct answer. +For example, one exception is positions which are legal, but have no legal moves. +I.e., for checkmates and stalemates, this function will incorrectly say the fen is invalid. +```python +stockfish.is_fen_valid("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1") +``` +```text +True +``` +```python +stockfish.is_fen_valid("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -") # will return False, in this case because the FEN is missing two of the six required fields. +``` +```text +False +``` + +### Get best move +```python +stockfish.get_best_move() +``` +```text +d2d4 +``` +It's possible to specify remaining time on black and/or white clock. Time is in milliseconds. +```python +stockfish.get_best_move(wtime=1000, btime=1000) +``` + +### Get best move based on a time constraint +```python +stockfish.get_best_move_time(1000) +``` +Time constraint is in milliseconds +```text +e2e4 +``` + +### Check is move correct with current position +```python +stockfish.is_move_correct('a2a3') +``` +```text +True +``` + +### Get info on the top n moves +```python +stockfish.get_top_moves(3) +``` +```text +[ + {'Move': 'f5h7', 'Centipawn': None, 'Mate': 1}, + {'Move': 'f5d7', 'Centipawn': 713, 'Mate': None}, + {'Move': 'f5h5', 'Centipawn': -31, 'Mate': None} +] +``` + +### Get Stockfish's win/draw/loss stats for the side to move in the current position +Before calling this function, it is recommended that you first check if your version of Stockfish is recent enough to display WDL stats. To do this, +use the "does_current_engine_version_have_wdl_option()" function below. +```python +stockfish.get_wdl_stats() +``` +```text +[87, 894, 19] +``` + +### Find if your version of Stockfish is recent enough to display WDL stats +```python +stockfish.does_current_engine_version_have_wdl_option() +``` +```text +True +``` + +### Set current engine's skill level (ignoring ELO rating) +```python +stockfish.set_skill_level(15) +``` + +### Set current engine's ELO rating (ignoring skill level) +```python +stockfish.set_elo_rating(1350) +``` + +### Set current engine's depth +```python +stockfish.set_depth(15) +``` + +### Get current engine's parameters +```python +stockfish.get_parameters() +``` +```text +{ + "Debug Log File": "", + "Contempt": 0, + "Min Split Depth": 0, + "Threads": 1, + "Ponder": "false", + "Hash": 16, + "MultiPV": 1, + "Skill Level": 20, + "Move Overhead": 10, + "Minimum Thinking Time": 20, + "Slow Mover": 100, + "UCI_Chess960": "false", + "UCI_LimitStrength": "false", + "UCI_Elo": 1350 +} +``` + +### Reset the engine's parameters to the default +```python +stockfish.reset_engine_parameters() +``` + +### Get current board position in Forsyth–Edwards notation (FEN) +```python +stockfish.get_fen_position() +``` +```text +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 +``` + +### Get current board visual +```python +stockfish.get_board_visual() +``` +```text ++---+---+---+---+---+---+---+---+ +| r | n | b | q | k | b | n | r | 8 ++---+---+---+---+---+---+---+---+ +| p | p | p | p | p | p | p | p | 7 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 6 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 5 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 4 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 3 ++---+---+---+---+---+---+---+---+ +| P | P | P | P | P | P | P | P | 2 ++---+---+---+---+---+---+---+---+ +| R | N | B | Q | K | B | N | R | 1 ++---+---+---+---+---+---+---+---+ + a b c d e f g h +``` +This function has an optional boolean (True by default) as a parameter that indicates whether the board should be seen from the view of white. So it is possible to get the board from black's point of view like this: +```python +stockfish.get_board_visual(False) +``` +```text ++---+---+---+---+---+---+---+---+ +| R | N | B | K | Q | B | N | R | 1 ++---+---+---+---+---+---+---+---+ +| P | P | P | P | P | P | P | P | 2 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 3 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 4 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 5 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 6 ++---+---+---+---+---+---+---+---+ +| p | p | p | p | p | p | p | p | 7 ++---+---+---+---+---+---+---+---+ +| r | n | b | k | q | b | n | r | 8 ++---+---+---+---+---+---+---+---+ + h g f e d c b a +``` + +### Get current board evaluation in centipawns or mate in x +```python +stockfish.get_evaluation() +``` +Positive is advantage white, negative is advantage black +```text +{"type":"cp", "value":12} +{"type":"mate", "value":-3} +``` + +### Run benchmark + +#### BenchmarkParameters +```python +params = BenchmarkParameters(**kwargs) +``` +parameters required to run the benchmark function. kwargs can be used to set custom values. +```text +ttSize: range(1,128001) +threads: range(1,513) +limit: range(1,10001) +fenFile: "path/to/file.fen" +limitType: "depth", "perft", "nodes", "movetime" +evalType: "mixed", "classical", "NNUE" +``` + +```python +stockfish.benchmark(params) +``` +This will run the bench command with BenchmarkParameters. +It is an additional custom non-UCI command, mainly for debugging. +Do not use this command during a search! + +### Get current major version of stockfish engine +E.g., if the engine being used is Stockfish 14.1 or Stockfish 14, then the function would return 14. +Meanwhile, if a development build of the engine is being used (not an official release), then the function returns an +int with 5 or 6 digits, representing the date the engine was compiled on. +For example, 20122 is returned for the development build compiled on January 2, 2022. +```python +stockfish.get_stockfish_major_version() +``` +```text +15 +``` + +### Find if the version of Stockfish being used is a development build +```python +stockfish.is_development_build_of_engine() +``` +```text +False +``` + +### Find what is on a certain square +If the square is empty, the None object is returned. Otherwise, one of 12 enum members of a custom +Stockfish.Piece enum will be returned. Each of the 12 members of this enum is named in the following pattern: +*colour* followed by *underscore* followed by *piece name*, where the colour and piece name are in all caps. +For example, say the current position is the starting position: +```python +stockfish.get_what_is_on_square("e1") # returns Stockfish.Piece.WHITE_KING +stockfish.get_what_is_on_square("d8") # returns Stockfish.Piece.BLACK_QUEEN +stockfish.get_what_is_on_square("h2") # returns Stockfish.Piece.WHITE_PAWN +stockfish.get_what_is_on_square("b5") # returns None +``` + +### Find if a move will be a capture (and if so, what type of capture) +The argument must be a string that represents the move, using the notation that Stockfish uses (i.e., the coordinate of the starting square followed by the coordinate of the ending square). +The function will return one of the following enum members from a custom Stockfish.Capture enum: DIRECT_CAPTURE, EN_PASSANT, or NO_CAPTURE. +For example, say the current position is the one after 1.e4 Nf6 2.Nc3 e6 3.e5 d5. +```python +stockfish.will_move_be_a_capture("c3d5") # returns Stockfish.Capture.DIRECT_CAPTURE +stockfish.will_move_be_a_capture("e5f6") # returns Stockfish.Capture.DIRECT_CAPTURE +stockfish.will_move_be_a_capture("e5d6") # returns Stockfish.Capture.EN_PASSANT +stockfish.will_move_be_a_capture("f1e2") # returns Stockfish.Capture.NO_CAPTURE +``` + +### StockfishException + +The `StockfishException` is a newly defined Exception type. It is thrown when the underlying Stockfish process created by the wrapper crashes. This can happen when an incorrect input like an invalid FEN (for example ```8/8/8/3k4/3K4/8/8/8 w - - 0 1``` with both kings next to each other) is given to Stockfish. \ +Not all invalid inputs will lead to a `StockfishException`, but only those which cause the Stockfish process to crash. \ +To handle a `StockfishException` when using this library, import the `StockfishException` from the library and use a `try/except`-block: +```python +from stockfish import StockfishException + +try: + # Evaluation routine + +except StockfishException: + # Error handling +``` + +## Testing +```bash +$ python setup.py test +``` + +## Security +If you discover any security related issues, please email zhelyabuzhsky@icloud.com instead of using the issue tracker. + +## Credits +- [Ilya Zhelyabuzhsky](https://github.com/zhelyabuzhsky) +- [All Contributors](https://github.com/zhelyabuzhsky/stockfish/graphs/contributors) + +## License +MIT License. Please see [License File](https://github.com/zhelyabuzhsky/stockfish/blob/master/LICENSE) for more information. + + + + +%package -n python3-stockfish +Summary: Wraps the open-source Stockfish chess engine for easy integration into python. +Provides: python-stockfish +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-stockfish +# Stockfish +Implements an easy-to-use Stockfish class to integrates the Stockfish chess engine with Python. + +## Install +```bash +$ pip install stockfish +``` + +#### Ubuntu +```bash +$ sudo apt install stockfish +``` + +#### Mac OS +```bash +$ brew install stockfish +``` + +## Features and usage examples + +### Initialize Stockfish class + +You should install the stockfish engine in your operating system globally or specify path to binary file in class constructor + +```python +from stockfish import Stockfish + +stockfish = Stockfish(path="/Users/zhelyabuzhsky/Work/stockfish/stockfish-9-64") +``` + +There are some default engine settings used by this wrapper. For increasing Stockfish's strength and speed, the "Threads" and "Hash" parameters can be modified. +```python +{ + "Debug Log File": "", + "Contempt": 0, + "Min Split Depth": 0, + "Threads": 1, # More threads will make the engine stronger, but should be kept at less than the number of logical processors on your computer. + "Ponder": "false", + "Hash": 16, # Default size is 16 MB. It's recommended that you increase this value, but keep it as some power of 2. E.g., if you're fine using 2 GB of RAM, set Hash to 2048 (11th power of 2). + "MultiPV": 1, + "Skill Level": 20, + "Move Overhead": 10, + "Minimum Thinking Time": 20, + "Slow Mover": 100, + "UCI_Chess960": "false", + "UCI_LimitStrength": "false", + "UCI_Elo": 1350 +} +``` + +You can change them, as well as the default search depth, during your Stockfish class initialization: +```python +stockfish = Stockfish(path="/Users/zhelyabuzhsky/Work/stockfish/stockfish-9-64", depth=18, parameters={"Threads": 2, "Minimum Thinking Time": 30}) +``` + +These parameters can also be updated at any time by calling the "update_engine_parameters" function: +```python +stockfish.update_engine_parameters({"Hash": 2048, "UCI_Chess960": "true"}) # Gets stockfish to use a 2GB hash table, and also to play Chess960. +``` + +### Set position by a sequence of moves from the starting position +```python +stockfish.set_position(["e2e4", "e7e6"]) +``` + +### Update position by making a sequence of moves from the current position +```python +stockfish.make_moves_from_current_position(["g4d7", "a8b8", "f1d1"]) +``` + +### Set position by Forsyth–Edwards Notation (FEN) +If you'd like to first check if your fen is valid, call the is_fen_valid() function below. +Also, if you want to play Chess960, it's recommended you first update the "UCI_Chess960" engine parameter to be "true", before calling set_fen_position. +```python +stockfish.set_fen_position("rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2") +``` + +### Check whether the given FEN is valid +This function returns a bool saying whether the passed in FEN is valid (both syntax wise and whether the position represented is legal). +The function isn't perfect and won't catch all cases, but generally it should return the correct answer. +For example, one exception is positions which are legal, but have no legal moves. +I.e., for checkmates and stalemates, this function will incorrectly say the fen is invalid. +```python +stockfish.is_fen_valid("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1") +``` +```text +True +``` +```python +stockfish.is_fen_valid("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -") # will return False, in this case because the FEN is missing two of the six required fields. +``` +```text +False +``` + +### Get best move +```python +stockfish.get_best_move() +``` +```text +d2d4 +``` +It's possible to specify remaining time on black and/or white clock. Time is in milliseconds. +```python +stockfish.get_best_move(wtime=1000, btime=1000) +``` + +### Get best move based on a time constraint +```python +stockfish.get_best_move_time(1000) +``` +Time constraint is in milliseconds +```text +e2e4 +``` + +### Check is move correct with current position +```python +stockfish.is_move_correct('a2a3') +``` +```text +True +``` + +### Get info on the top n moves +```python +stockfish.get_top_moves(3) +``` +```text +[ + {'Move': 'f5h7', 'Centipawn': None, 'Mate': 1}, + {'Move': 'f5d7', 'Centipawn': 713, 'Mate': None}, + {'Move': 'f5h5', 'Centipawn': -31, 'Mate': None} +] +``` + +### Get Stockfish's win/draw/loss stats for the side to move in the current position +Before calling this function, it is recommended that you first check if your version of Stockfish is recent enough to display WDL stats. To do this, +use the "does_current_engine_version_have_wdl_option()" function below. +```python +stockfish.get_wdl_stats() +``` +```text +[87, 894, 19] +``` + +### Find if your version of Stockfish is recent enough to display WDL stats +```python +stockfish.does_current_engine_version_have_wdl_option() +``` +```text +True +``` + +### Set current engine's skill level (ignoring ELO rating) +```python +stockfish.set_skill_level(15) +``` + +### Set current engine's ELO rating (ignoring skill level) +```python +stockfish.set_elo_rating(1350) +``` + +### Set current engine's depth +```python +stockfish.set_depth(15) +``` + +### Get current engine's parameters +```python +stockfish.get_parameters() +``` +```text +{ + "Debug Log File": "", + "Contempt": 0, + "Min Split Depth": 0, + "Threads": 1, + "Ponder": "false", + "Hash": 16, + "MultiPV": 1, + "Skill Level": 20, + "Move Overhead": 10, + "Minimum Thinking Time": 20, + "Slow Mover": 100, + "UCI_Chess960": "false", + "UCI_LimitStrength": "false", + "UCI_Elo": 1350 +} +``` + +### Reset the engine's parameters to the default +```python +stockfish.reset_engine_parameters() +``` + +### Get current board position in Forsyth–Edwards notation (FEN) +```python +stockfish.get_fen_position() +``` +```text +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 +``` + +### Get current board visual +```python +stockfish.get_board_visual() +``` +```text ++---+---+---+---+---+---+---+---+ +| r | n | b | q | k | b | n | r | 8 ++---+---+---+---+---+---+---+---+ +| p | p | p | p | p | p | p | p | 7 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 6 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 5 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 4 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 3 ++---+---+---+---+---+---+---+---+ +| P | P | P | P | P | P | P | P | 2 ++---+---+---+---+---+---+---+---+ +| R | N | B | Q | K | B | N | R | 1 ++---+---+---+---+---+---+---+---+ + a b c d e f g h +``` +This function has an optional boolean (True by default) as a parameter that indicates whether the board should be seen from the view of white. So it is possible to get the board from black's point of view like this: +```python +stockfish.get_board_visual(False) +``` +```text ++---+---+---+---+---+---+---+---+ +| R | N | B | K | Q | B | N | R | 1 ++---+---+---+---+---+---+---+---+ +| P | P | P | P | P | P | P | P | 2 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 3 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 4 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 5 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 6 ++---+---+---+---+---+---+---+---+ +| p | p | p | p | p | p | p | p | 7 ++---+---+---+---+---+---+---+---+ +| r | n | b | k | q | b | n | r | 8 ++---+---+---+---+---+---+---+---+ + h g f e d c b a +``` + +### Get current board evaluation in centipawns or mate in x +```python +stockfish.get_evaluation() +``` +Positive is advantage white, negative is advantage black +```text +{"type":"cp", "value":12} +{"type":"mate", "value":-3} +``` + +### Run benchmark + +#### BenchmarkParameters +```python +params = BenchmarkParameters(**kwargs) +``` +parameters required to run the benchmark function. kwargs can be used to set custom values. +```text +ttSize: range(1,128001) +threads: range(1,513) +limit: range(1,10001) +fenFile: "path/to/file.fen" +limitType: "depth", "perft", "nodes", "movetime" +evalType: "mixed", "classical", "NNUE" +``` + +```python +stockfish.benchmark(params) +``` +This will run the bench command with BenchmarkParameters. +It is an additional custom non-UCI command, mainly for debugging. +Do not use this command during a search! + +### Get current major version of stockfish engine +E.g., if the engine being used is Stockfish 14.1 or Stockfish 14, then the function would return 14. +Meanwhile, if a development build of the engine is being used (not an official release), then the function returns an +int with 5 or 6 digits, representing the date the engine was compiled on. +For example, 20122 is returned for the development build compiled on January 2, 2022. +```python +stockfish.get_stockfish_major_version() +``` +```text +15 +``` + +### Find if the version of Stockfish being used is a development build +```python +stockfish.is_development_build_of_engine() +``` +```text +False +``` + +### Find what is on a certain square +If the square is empty, the None object is returned. Otherwise, one of 12 enum members of a custom +Stockfish.Piece enum will be returned. Each of the 12 members of this enum is named in the following pattern: +*colour* followed by *underscore* followed by *piece name*, where the colour and piece name are in all caps. +For example, say the current position is the starting position: +```python +stockfish.get_what_is_on_square("e1") # returns Stockfish.Piece.WHITE_KING +stockfish.get_what_is_on_square("d8") # returns Stockfish.Piece.BLACK_QUEEN +stockfish.get_what_is_on_square("h2") # returns Stockfish.Piece.WHITE_PAWN +stockfish.get_what_is_on_square("b5") # returns None +``` + +### Find if a move will be a capture (and if so, what type of capture) +The argument must be a string that represents the move, using the notation that Stockfish uses (i.e., the coordinate of the starting square followed by the coordinate of the ending square). +The function will return one of the following enum members from a custom Stockfish.Capture enum: DIRECT_CAPTURE, EN_PASSANT, or NO_CAPTURE. +For example, say the current position is the one after 1.e4 Nf6 2.Nc3 e6 3.e5 d5. +```python +stockfish.will_move_be_a_capture("c3d5") # returns Stockfish.Capture.DIRECT_CAPTURE +stockfish.will_move_be_a_capture("e5f6") # returns Stockfish.Capture.DIRECT_CAPTURE +stockfish.will_move_be_a_capture("e5d6") # returns Stockfish.Capture.EN_PASSANT +stockfish.will_move_be_a_capture("f1e2") # returns Stockfish.Capture.NO_CAPTURE +``` + +### StockfishException + +The `StockfishException` is a newly defined Exception type. It is thrown when the underlying Stockfish process created by the wrapper crashes. This can happen when an incorrect input like an invalid FEN (for example ```8/8/8/3k4/3K4/8/8/8 w - - 0 1``` with both kings next to each other) is given to Stockfish. \ +Not all invalid inputs will lead to a `StockfishException`, but only those which cause the Stockfish process to crash. \ +To handle a `StockfishException` when using this library, import the `StockfishException` from the library and use a `try/except`-block: +```python +from stockfish import StockfishException + +try: + # Evaluation routine + +except StockfishException: + # Error handling +``` + +## Testing +```bash +$ python setup.py test +``` + +## Security +If you discover any security related issues, please email zhelyabuzhsky@icloud.com instead of using the issue tracker. + +## Credits +- [Ilya Zhelyabuzhsky](https://github.com/zhelyabuzhsky) +- [All Contributors](https://github.com/zhelyabuzhsky/stockfish/graphs/contributors) + +## License +MIT License. Please see [License File](https://github.com/zhelyabuzhsky/stockfish/blob/master/LICENSE) for more information. + + + + +%package help +Summary: Development documents and examples for stockfish +Provides: python3-stockfish-doc +%description help +# Stockfish +Implements an easy-to-use Stockfish class to integrates the Stockfish chess engine with Python. + +## Install +```bash +$ pip install stockfish +``` + +#### Ubuntu +```bash +$ sudo apt install stockfish +``` + +#### Mac OS +```bash +$ brew install stockfish +``` + +## Features and usage examples + +### Initialize Stockfish class + +You should install the stockfish engine in your operating system globally or specify path to binary file in class constructor + +```python +from stockfish import Stockfish + +stockfish = Stockfish(path="/Users/zhelyabuzhsky/Work/stockfish/stockfish-9-64") +``` + +There are some default engine settings used by this wrapper. For increasing Stockfish's strength and speed, the "Threads" and "Hash" parameters can be modified. +```python +{ + "Debug Log File": "", + "Contempt": 0, + "Min Split Depth": 0, + "Threads": 1, # More threads will make the engine stronger, but should be kept at less than the number of logical processors on your computer. + "Ponder": "false", + "Hash": 16, # Default size is 16 MB. It's recommended that you increase this value, but keep it as some power of 2. E.g., if you're fine using 2 GB of RAM, set Hash to 2048 (11th power of 2). + "MultiPV": 1, + "Skill Level": 20, + "Move Overhead": 10, + "Minimum Thinking Time": 20, + "Slow Mover": 100, + "UCI_Chess960": "false", + "UCI_LimitStrength": "false", + "UCI_Elo": 1350 +} +``` + +You can change them, as well as the default search depth, during your Stockfish class initialization: +```python +stockfish = Stockfish(path="/Users/zhelyabuzhsky/Work/stockfish/stockfish-9-64", depth=18, parameters={"Threads": 2, "Minimum Thinking Time": 30}) +``` + +These parameters can also be updated at any time by calling the "update_engine_parameters" function: +```python +stockfish.update_engine_parameters({"Hash": 2048, "UCI_Chess960": "true"}) # Gets stockfish to use a 2GB hash table, and also to play Chess960. +``` + +### Set position by a sequence of moves from the starting position +```python +stockfish.set_position(["e2e4", "e7e6"]) +``` + +### Update position by making a sequence of moves from the current position +```python +stockfish.make_moves_from_current_position(["g4d7", "a8b8", "f1d1"]) +``` + +### Set position by Forsyth–Edwards Notation (FEN) +If you'd like to first check if your fen is valid, call the is_fen_valid() function below. +Also, if you want to play Chess960, it's recommended you first update the "UCI_Chess960" engine parameter to be "true", before calling set_fen_position. +```python +stockfish.set_fen_position("rnbqkbnr/pppp1ppp/4p3/8/4P3/8/PPPP1PPP/RNBQKBNR w KQkq - 0 2") +``` + +### Check whether the given FEN is valid +This function returns a bool saying whether the passed in FEN is valid (both syntax wise and whether the position represented is legal). +The function isn't perfect and won't catch all cases, but generally it should return the correct answer. +For example, one exception is positions which are legal, but have no legal moves. +I.e., for checkmates and stalemates, this function will incorrectly say the fen is invalid. +```python +stockfish.is_fen_valid("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1") +``` +```text +True +``` +```python +stockfish.is_fen_valid("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq -") # will return False, in this case because the FEN is missing two of the six required fields. +``` +```text +False +``` + +### Get best move +```python +stockfish.get_best_move() +``` +```text +d2d4 +``` +It's possible to specify remaining time on black and/or white clock. Time is in milliseconds. +```python +stockfish.get_best_move(wtime=1000, btime=1000) +``` + +### Get best move based on a time constraint +```python +stockfish.get_best_move_time(1000) +``` +Time constraint is in milliseconds +```text +e2e4 +``` + +### Check is move correct with current position +```python +stockfish.is_move_correct('a2a3') +``` +```text +True +``` + +### Get info on the top n moves +```python +stockfish.get_top_moves(3) +``` +```text +[ + {'Move': 'f5h7', 'Centipawn': None, 'Mate': 1}, + {'Move': 'f5d7', 'Centipawn': 713, 'Mate': None}, + {'Move': 'f5h5', 'Centipawn': -31, 'Mate': None} +] +``` + +### Get Stockfish's win/draw/loss stats for the side to move in the current position +Before calling this function, it is recommended that you first check if your version of Stockfish is recent enough to display WDL stats. To do this, +use the "does_current_engine_version_have_wdl_option()" function below. +```python +stockfish.get_wdl_stats() +``` +```text +[87, 894, 19] +``` + +### Find if your version of Stockfish is recent enough to display WDL stats +```python +stockfish.does_current_engine_version_have_wdl_option() +``` +```text +True +``` + +### Set current engine's skill level (ignoring ELO rating) +```python +stockfish.set_skill_level(15) +``` + +### Set current engine's ELO rating (ignoring skill level) +```python +stockfish.set_elo_rating(1350) +``` + +### Set current engine's depth +```python +stockfish.set_depth(15) +``` + +### Get current engine's parameters +```python +stockfish.get_parameters() +``` +```text +{ + "Debug Log File": "", + "Contempt": 0, + "Min Split Depth": 0, + "Threads": 1, + "Ponder": "false", + "Hash": 16, + "MultiPV": 1, + "Skill Level": 20, + "Move Overhead": 10, + "Minimum Thinking Time": 20, + "Slow Mover": 100, + "UCI_Chess960": "false", + "UCI_LimitStrength": "false", + "UCI_Elo": 1350 +} +``` + +### Reset the engine's parameters to the default +```python +stockfish.reset_engine_parameters() +``` + +### Get current board position in Forsyth–Edwards notation (FEN) +```python +stockfish.get_fen_position() +``` +```text +rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 +``` + +### Get current board visual +```python +stockfish.get_board_visual() +``` +```text ++---+---+---+---+---+---+---+---+ +| r | n | b | q | k | b | n | r | 8 ++---+---+---+---+---+---+---+---+ +| p | p | p | p | p | p | p | p | 7 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 6 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 5 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 4 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 3 ++---+---+---+---+---+---+---+---+ +| P | P | P | P | P | P | P | P | 2 ++---+---+---+---+---+---+---+---+ +| R | N | B | Q | K | B | N | R | 1 ++---+---+---+---+---+---+---+---+ + a b c d e f g h +``` +This function has an optional boolean (True by default) as a parameter that indicates whether the board should be seen from the view of white. So it is possible to get the board from black's point of view like this: +```python +stockfish.get_board_visual(False) +``` +```text ++---+---+---+---+---+---+---+---+ +| R | N | B | K | Q | B | N | R | 1 ++---+---+---+---+---+---+---+---+ +| P | P | P | P | P | P | P | P | 2 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 3 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 4 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 5 ++---+---+---+---+---+---+---+---+ +| | | | | | | | | 6 ++---+---+---+---+---+---+---+---+ +| p | p | p | p | p | p | p | p | 7 ++---+---+---+---+---+---+---+---+ +| r | n | b | k | q | b | n | r | 8 ++---+---+---+---+---+---+---+---+ + h g f e d c b a +``` + +### Get current board evaluation in centipawns or mate in x +```python +stockfish.get_evaluation() +``` +Positive is advantage white, negative is advantage black +```text +{"type":"cp", "value":12} +{"type":"mate", "value":-3} +``` + +### Run benchmark + +#### BenchmarkParameters +```python +params = BenchmarkParameters(**kwargs) +``` +parameters required to run the benchmark function. kwargs can be used to set custom values. +```text +ttSize: range(1,128001) +threads: range(1,513) +limit: range(1,10001) +fenFile: "path/to/file.fen" +limitType: "depth", "perft", "nodes", "movetime" +evalType: "mixed", "classical", "NNUE" +``` + +```python +stockfish.benchmark(params) +``` +This will run the bench command with BenchmarkParameters. +It is an additional custom non-UCI command, mainly for debugging. +Do not use this command during a search! + +### Get current major version of stockfish engine +E.g., if the engine being used is Stockfish 14.1 or Stockfish 14, then the function would return 14. +Meanwhile, if a development build of the engine is being used (not an official release), then the function returns an +int with 5 or 6 digits, representing the date the engine was compiled on. +For example, 20122 is returned for the development build compiled on January 2, 2022. +```python +stockfish.get_stockfish_major_version() +``` +```text +15 +``` + +### Find if the version of Stockfish being used is a development build +```python +stockfish.is_development_build_of_engine() +``` +```text +False +``` + +### Find what is on a certain square +If the square is empty, the None object is returned. Otherwise, one of 12 enum members of a custom +Stockfish.Piece enum will be returned. Each of the 12 members of this enum is named in the following pattern: +*colour* followed by *underscore* followed by *piece name*, where the colour and piece name are in all caps. +For example, say the current position is the starting position: +```python +stockfish.get_what_is_on_square("e1") # returns Stockfish.Piece.WHITE_KING +stockfish.get_what_is_on_square("d8") # returns Stockfish.Piece.BLACK_QUEEN +stockfish.get_what_is_on_square("h2") # returns Stockfish.Piece.WHITE_PAWN +stockfish.get_what_is_on_square("b5") # returns None +``` + +### Find if a move will be a capture (and if so, what type of capture) +The argument must be a string that represents the move, using the notation that Stockfish uses (i.e., the coordinate of the starting square followed by the coordinate of the ending square). +The function will return one of the following enum members from a custom Stockfish.Capture enum: DIRECT_CAPTURE, EN_PASSANT, or NO_CAPTURE. +For example, say the current position is the one after 1.e4 Nf6 2.Nc3 e6 3.e5 d5. +```python +stockfish.will_move_be_a_capture("c3d5") # returns Stockfish.Capture.DIRECT_CAPTURE +stockfish.will_move_be_a_capture("e5f6") # returns Stockfish.Capture.DIRECT_CAPTURE +stockfish.will_move_be_a_capture("e5d6") # returns Stockfish.Capture.EN_PASSANT +stockfish.will_move_be_a_capture("f1e2") # returns Stockfish.Capture.NO_CAPTURE +``` + +### StockfishException + +The `StockfishException` is a newly defined Exception type. It is thrown when the underlying Stockfish process created by the wrapper crashes. This can happen when an incorrect input like an invalid FEN (for example ```8/8/8/3k4/3K4/8/8/8 w - - 0 1``` with both kings next to each other) is given to Stockfish. \ +Not all invalid inputs will lead to a `StockfishException`, but only those which cause the Stockfish process to crash. \ +To handle a `StockfishException` when using this library, import the `StockfishException` from the library and use a `try/except`-block: +```python +from stockfish import StockfishException + +try: + # Evaluation routine + +except StockfishException: + # Error handling +``` + +## Testing +```bash +$ python setup.py test +``` + +## Security +If you discover any security related issues, please email zhelyabuzhsky@icloud.com instead of using the issue tracker. + +## Credits +- [Ilya Zhelyabuzhsky](https://github.com/zhelyabuzhsky) +- [All Contributors](https://github.com/zhelyabuzhsky/stockfish/graphs/contributors) + +## License +MIT License. Please see [License File](https://github.com/zhelyabuzhsky/stockfish/blob/master/LICENSE) for more information. + + + + +%prep +%autosetup -n stockfish-3.28.0 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-stockfish -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Thu May 18 2023 Python_Bot <Python_Bot@openeuler.org> - 3.28.0-1 +- Package Spec generated @@ -0,0 +1 @@ +628c58f0c182852bfe235af9da88afb3 stockfish-3.28.0.tar.gz |