Class UCIEngine
Interface to a chess engine supporting UCI protocol
The class allows to implement the GUI part of the UCI protocol manually by using method SendToEngineAsync(String) to send commands to the engine process and event OnEngineOutput to receive messages
Nevertheless the recommended way is to use the more comfortable methods, which this class offers like AnalyzeAsync(String, TimeSpan, Dictionary<String, String>, List<Move>) or StartThinkingAsync(Nullable<TimeSpan>, Nullable<TimeSpan>, Nullable<TimeSpan>, Nullable<TimeSpan>, Int32, Int32, Int64, Boolean, List<Move>)
Game game = PGN.Parse(pathToPGN)[0];
using (UCIEngine engine = new UCIEngine(enginePath))
{
ExtendedMove move = engine.AnalyseAsync(game, TimeSpan.FromMilliseconds(100), 25, Side.BLACK).Result;
Console.WriteLine($"Evaluation: {move.Evaluation}");
}
Inheritance
Implements
Inherited Members
Namespace: PonzianiComponents.Chesslib
Assembly: PonzianiComponents.dll
Syntax
public sealed class UCIEngine : IDisposable
Constructors
| Improve this Doc View SourceUCIEngine(String, Dictionary<String, String>, String)
Creates a new UCI engine
Declaration
public UCIEngine(string executable, Dictionary<string, string> parameters = null, string arguments = null)
Parameters
Type | Name | Description |
---|---|---|
System.String | executable | Path to the engine executable |
System.Collections.Generic.Dictionary<System.String, System.String> | parameters | Parameters, which will be passed to the engine later on by calling SetOptionsAsync() |
System.String | arguments | Command line arguments passed to the engine process on startup |
Properties
| Improve this Doc View SourceAnalysisInfo
Get's the current Analysis result from the engine
Declaration
public UCIEngine.Info AnalysisInfo { get; }
Property Value
Type | Description |
---|---|
UCIEngine.Info |
Arguments
Arguments passed on start of the engine executable
Declaration
public string Arguments { get; set; }
Property Value
Type | Description |
---|---|
System.String |
Author
Engine Author (as given by engine process). Only available once engine process is started.
Declaration
public string Author { get; }
Property Value
Type | Description |
---|---|
System.String |
BestMove
Declaration
public ExtendedMove BestMove { get; }
Property Value
Type | Description |
---|---|
ExtendedMove |
Executable
Path to the engine executable
Declaration
public string Executable { get; set; }
Property Value
Type | Description |
---|---|
System.String |
Name
Engine Name (as given by engine process). Only available once engine process is started.
Declaration
public string Name { get; }
Property Value
Type | Description |
---|---|
System.String |
Options
Options as provided by the engine's option commands
Declaration
public Dictionary<string, UCIEngine.Option> Options { get; }
Property Value
Type | Description |
---|---|
System.Collections.Generic.Dictionary<System.String, UCIEngine.Option> |
Parameters
UCI options, passed via setoption command
Declaration
public Dictionary<string, string> Parameters { get; set; }
Property Value
Type | Description |
---|---|
System.Collections.Generic.Dictionary<System.String, System.String> |
PonderMove
Declaration
public Move PonderMove { get; }
Property Value
Type | Description |
---|---|
Move |
ProcessId
Id of engine process (0 if process isn't started or stopped)
Declaration
public int ProcessId { get; }
Property Value
Type | Description |
---|---|
System.Int32 |
Score
Score from white's point of view in centipawns. Mate scores are converted to very high scores
Declaration
public int Score { get; }
Property Value
Type | Description |
---|---|
System.Int32 |
WorkingDirectory
Working directory of the engine process. If not set directory of Executable is used
Declaration
public string WorkingDirectory { get; set; }
Property Value
Type | Description |
---|---|
System.String |
Methods
| Improve this Doc View SourceAnalyzeAsync(Game, Int32, Side, Nullable<TimeSpan>, Nullable<TimeSpan>, Nullable<TimeSpan>, Nullable<TimeSpan>, Int32, Int32, Int64, Boolean, Dictionary<String, String>, List<Move>)
Prepares the engine and executes an analysis undermatch conditions
Declaration
public async Task<ExtendedMove> AnalyzeAsync(Game game, int moveNumber = 1, Side side = Side.WHITE, TimeSpan? whiteTime = null, TimeSpan? whiteIncrement = null, TimeSpan? blackTime = null, TimeSpan? blackIncrement = null, int movesToGo = 0, int depth = 2147483647, long nodes = 0L, bool ponder = false, Dictionary<string, string> parameter = null, List<Move> MovesToBeAnalyzed = null)
Parameters
Type | Name | Description |
---|---|---|
Game | game | The current game |
System.Int32 | moveNumber | Movenumber of position |
Side | side | Side to move of position |
System.Nullable<System.TimeSpan> | whiteTime | White's time on the clock |
System.Nullable<System.TimeSpan> | whiteIncrement | White's increment allocated after the move |
System.Nullable<System.TimeSpan> | blackTime | Black's time on the clock |
System.Nullable<System.TimeSpan> | blackIncrement | Black's increment allocated after the move |
System.Int32 | movesToGo | Moves until next time control |
System.Int32 | depth | Maximum search depth |
System.Int64 | nodes | Maximum nodes to be searched |
System.Boolean | ponder | Search shall be executed in ponder mode |
System.Collections.Generic.Dictionary<System.String, System.String> | parameter | Engine options, which will be sent to the engine using the "setoption" command |
System.Collections.Generic.List<Move> | MovesToBeAnalyzed | List of moves, which shall be analyzed - if null, all moves will be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<ExtendedMove> | The engine's best move (including evaluation) info |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
AnalyzeAsync(Game, TimeSpan, Int32, Side, Dictionary<String, String>, List<Move>)
Prepares the engine and executes an analysis for a specified time
Declaration
public async Task<ExtendedMove> AnalyzeAsync(Game game, TimeSpan time, int moveNumber = 1, Side side = Side.WHITE, Dictionary<string, string> parameter = null, List<Move> movesToBeAnalyzed = null)
Parameters
Type | Name | Description |
---|---|---|
Game | game | Game, from which position is taken |
System.TimeSpan | time | Time, the analysis shall take |
System.Int32 | moveNumber | Movenumber of position |
Side | side | Side to move of position |
System.Collections.Generic.Dictionary<System.String, System.String> | parameter | Engine options, which will be sent to the engine using the "setoption" command |
System.Collections.Generic.List<Move> | movesToBeAnalyzed | List of moves, which shall be analyzed - if null, all moves will be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<ExtendedMove> | The best move determined by the engine (includes Evaluation Info) |
AnalyzeAsync(String, String, TimeSpan, Dictionary<String, String>, List<Move>)
Prepares the engine and executes an analysis for a specified time
Declaration
public async Task<ExtendedMove> AnalyzeAsync(string fen, string movelist, TimeSpan time, Dictionary<string, string> parameter = null, List<Move> movesToBeAnalyzed = null)
Parameters
Type | Name | Description |
---|---|---|
System.String | fen | Startposition as FEN |
System.String | movelist | |
System.TimeSpan | time | Time, the analysis shall take |
System.Collections.Generic.Dictionary<System.String, System.String> | parameter | Engine options, which will be sent to the engine using the "setoption" command |
System.Collections.Generic.List<Move> | movesToBeAnalyzed | List of moves, which shall be analyzed - if null, all moves will be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<ExtendedMove> | The best move determined by the engine (includes Evaluation Info) |
AnalyzeAsync(String, TimeSpan, Dictionary<String, String>, List<Move>)
Prepares the engine and executes an analysis for a specified time
Declaration
public async Task<ExtendedMove> AnalyzeAsync(string fen, TimeSpan time, Dictionary<string, string> parameter = null, List<Move> movesToBeAnalyzed = null)
Parameters
Type | Name | Description |
---|---|---|
System.String | fen | Position to be analyzed as FEN |
System.TimeSpan | time | Time, the analysis shall take |
System.Collections.Generic.Dictionary<System.String, System.String> | parameter | Engine options, which will be sent to the engine using the "setoption" command |
System.Collections.Generic.List<Move> | movesToBeAnalyzed | List of moves, which shall be analyzed - if null, all moves will be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<ExtendedMove> | The best move determined by the engine (includes Evaluation Info) |
Dispose()
Declaration
public void Dispose()
GetAnalysisInfo(Int32)
Get's the current Analysis result from the engine for a specified line (inMultiPV mode)
Declaration
public UCIEngine.Info GetAnalysisInfo(int line = 0)
Parameters
Type | Name | Description |
---|---|---|
System.Int32 | line | Line index (zero-based, so line = 0 will return the infor for the main line) |
Returns
Type | Description |
---|---|
UCIEngine.Info | Engine's info for this line |
NewGameAsync()
Sends the "ucinewgame" command to the engine
this shall besent to the engine when the next search (started with "position" and "go") will be from a different game.This can be a new game the engine should play or a new game it should analyse but also the next position from a testsuite with positions only.
Declaration
public async Task<bool> NewGameAsync()
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
Ponderhit()
Sends the "ponderhit" command to the engine.
This shall be done to inform the engine, that the opponent has played the expected move. The engine will continue searching but switch from pondering to normal search.
Declaration
public void Ponderhit()
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is not thinking |
PrepareEngineForAnalysisAsync(Dictionary<String, String>)
Prepares the engine with one method call. It combines calls to StartEngineAsync(), SetOptionsAsync() and NewGameAsync().
using (UCIEngine engine = new UCIEngine(enginePath))
{
// Start engine
engine.PrepareEngineForAnalysisAsync().Wait();
// Set position
engine.SetPositionAsync(Fen.INITIAL_POSITION).Wait();
// Analyze for one second
engine.StartAnalysisAsync(TimeSpan.FromSeconds(1)).Wait();
// Get best move
Console.WriteLine(engine.BestMove.ToUCIString());
}
Declaration
public async Task<bool> PrepareEngineForAnalysisAsync(Dictionary<string, string> parameter = null)
Parameters
Type | Name | Description |
---|---|---|
System.Collections.Generic.Dictionary<System.String, System.String> | parameter | Engine options, which will be sent to the engine using the "setoption" command |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
SendToEngineAsync(String)
Sends a message (UIC command) to engine.
Handle with care: There is only partial input validation performed. Messages which don't fulfill the UCI protocol might break the engine process!
Declaration
public async Task<bool> SendToEngineAsync(string message)
Parameters
Type | Name | Description |
---|---|---|
System.String | message | The message to be sent to the engine |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown, if engine state doesn't allow to send the message |
SetOptionsAsync()
Calls the setoption commands used to configure the engine. The settings have to be provided before via the Parameters property
Declaration
public async Task<bool> SetOptionsAsync()
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
SetPositionAsync(Game, Int32, Side)
Sets the engine's position from a Game
Declaration
public async Task<bool> SetPositionAsync(Game game, int moveNumber, Side side)
Parameters
Type | Name | Description |
---|---|---|
Game | game | Game, from which position is taken |
System.Int32 | moveNumber | Movenumber of position |
Side | side | Side to move of position |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
SetPositionAsync(Position)
Sets the engine's position
Declaration
public async Task<bool> SetPositionAsync(Position position)
Parameters
Type | Name | Description |
---|---|---|
Position | position | Position to be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
SetPositionAsync(String, String)
Set's the engine's position
Declaration
public async Task<bool> SetPositionAsync(string fen = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1", string movelist = null)
Parameters
Type | Name | Description |
---|---|---|
System.String | fen | Start position in FEN representation |
System.String | movelist | Moves leading from start position to position to be analysed, in UCI notation separated by spaces.
Example: |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
StartAnalysisAsync(List<Move>)
Starts an infinite analysis of the current position
Declaration
public async Task<bool> StartAnalysisAsync(List<Move> MovesToBeAnalyzed = null)
Parameters
Type | Name | Description |
---|---|---|
System.Collections.Generic.List<Move> | MovesToBeAnalyzed | List of moves, which shall be analyzed - if null, all moves will be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
StartAnalysisAsync(Int32, List<Move>)
Starts an analysis of the current position up to a specified search depth
Declaration
public async Task<bool> StartAnalysisAsync(int depth, List<Move> MovesToBeAnalyzed = null)
Parameters
Type | Name | Description |
---|---|---|
System.Int32 | depth | search depth (in plies) |
System.Collections.Generic.List<Move> | MovesToBeAnalyzed | List of moves, which shall be analyzed - if null, all moves will be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
StartAnalysisAsync(TimeSpan, List<Move>)
Starts an analysis of the current position for a specified time
Declaration
public async Task<bool> StartAnalysisAsync(TimeSpan thinkTime, List<Move> MovesToBeAnalyzed = null)
Parameters
Type | Name | Description |
---|---|---|
System.TimeSpan | thinkTime | the time the engine shall spend |
System.Collections.Generic.List<Move> | MovesToBeAnalyzed | List of moves, which shall be analyzed - if null, all moves will be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
StartEngineAsync()
Starts the engine process
Declaration
public async Task<bool> StartEngineAsync()
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if engine process could be started |
StartThinkingAsync(Nullable<TimeSpan>, Nullable<TimeSpan>, Nullable<TimeSpan>, Nullable<TimeSpan>, Int32, Int32, Int64, Boolean, List<Move>)
Starts an analysis of the current position in a match situation
Declaration
public async Task<bool> StartThinkingAsync(TimeSpan? whiteTime = null, TimeSpan? whiteIncrement = null, TimeSpan? blackTime = null, TimeSpan? blackIncrement = null, int movesToGo = 0, int depth = 2147483647, long nodes = 0L, bool ponder = false, List<Move> MovesToBeAnalyzed = null)
Parameters
Type | Name | Description |
---|---|---|
System.Nullable<System.TimeSpan> | whiteTime | White's time on the clock |
System.Nullable<System.TimeSpan> | whiteIncrement | White's increment allocated after the move |
System.Nullable<System.TimeSpan> | blackTime | Black's time on the clock |
System.Nullable<System.TimeSpan> | blackIncrement | Black's increment allocated after the move |
System.Int32 | movesToGo | Moves until next time control |
System.Int32 | depth | Maximum search depth |
System.Int64 | nodes | Maximum nodes to be searched |
System.Boolean | ponder | Search shall be executed in ponder mode |
System.Collections.Generic.List<Move> | MovesToBeAnalyzed | List of moves, which shall be analyzed - if null, all moves will be analyzed |
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine state doesn't allow to set position. Method must not be called while engine is off, initializing or thinking |
StopThinkingAsync()
Stops engine analysis (sends UCI "stop" command)
Declaration
public async Task<bool> StopThinkingAsync()
Returns
Type | Description |
---|---|
System.Threading.Tasks.Task<System.Boolean> | true, if everything went right |
Exceptions
Type | Condition |
---|---|
UCIEngine.EngineException | thrown if engine isn't analysing |
Events
| Improve this Doc View SourceOnEngineInfoChanged
Raised whenever the engine issues a "info" message (except "info string" messages), by which the engine sends information about the current state of analysis
Declaration
public event EventHandler<UCIEngine.EngineInfoEventArgs> OnEngineInfoChanged
Event Type
Type | Description |
---|---|
System.EventHandler<UCIEngine.EngineInfoEventArgs> |
OnEngineOutput
Raised whenever the engine outputs anything
Declaration
public event EventHandler<UCIEngine.EngineOutputEventArgs> OnEngineOutput
Event Type
Type | Description |
---|---|
System.EventHandler<UCIEngine.EngineOutputEventArgs> |