-
Notifications
You must be signed in to change notification settings - Fork 1
/
TODO
93 lines (85 loc) · 4.81 KB
/
TODO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
Tasks in progress:
- Implement the complete Winboard/Xboard protocol:
http://www.tim-mann.org/xboard/engine-intf.html
- Better evaluation function:
- more mobility evaluation
- Detect draws by material and likely draws by material (i.e. KR vs. KR).
This detection should happen in search() if possible.
- Full support for the PGN standard, including FEN strings
Deferred tasks:
- Try returning alpha or beta even with mate scores
- Use a bitfield for move instead of an integer
- Use the BigTwo1 replacement scheme in hash table:
http://www.xs4all.nl/~breukerd/thesis/summary.html
- In critical parts use <unsigned> instead of <int> if possible
- Scale the 7th rank eval bonus with the opponent's pawn material (the more
pawns it has the bigger the bonus)
- make_move() should return a boolean value <is_check>.
- Add a command stack to struct Chess so that all the waiting non-urgent
commands can be executed when we're done searching.
UPDATE: turned out that no input ever needs to wait.
- Evaluation masks (passed pawns etc.) should be grouped in a struct
- Include ECO code and round number in the PGN log
- Use the "struct" keyword instead of the typedef name when declaring
variables in header files (eg. AvlNode *book in Chess).
- Use a lot more enums like Color, Square, Piece, etc. On the other hand,
enums aren't enforced so let's drop this plan.
- Add a global <notation> setting. It should accept values:
- NTN_SAN - use SAN notation for moves everywhere
- NTN_COORD - use coordinate notation everywhere
- NTN_MIX - use a mix of SAN and COORD, ie. Sloppy's current defaults
- Don't read the game log when writing to game.pgn. Instead backtrack to the
beginning and play the moves again.
- Add (static) function prototypes at the beginning of each source file.
- Don't try a null move if the side to move doesn't have any sliders.
UPDATE: this took away a lot of strength, can't use it.
- In Linux/Unix the default data folder is ~/.sloppy/ and in Windows it's
the same folder where the executable is. User should also be able to
choose the folder by running sloppy with -f <path> parameter.
- Always completing the search iteration after the first root move takes
about 5 - 8 % of the total search time, which is 5.3 - 8.7 % of the
allocated time. So cut about 7 % out of the allocated time.
- Use Verified Null-Move Pruning
- Extend 3 plies when the search transitions into a pawn endgame
- Generate (QUEEN) promotions in gen_qs_moves()
- Try storing 2 best moves in transposition table
- Order losing captures last
- Store 2 positions in each hash entry: always replace and depth preferred
- Try late move reductions in pv nodes
TODO:
- gen_pc_moves() should be able to work with a const board pointer
- Don't search the book if we're past X plies
- Don't respond to ping while searching, unless in analyze/pondering mode
- Support "avoid move" test positions
- Implement pondering mode
- If there's only one book move available and it has a score of 0, try to
avoid choosing that move in search.
- Use some more advanced source control system
- Try the hash move boldly without any validation (move generation).
- King safety extensions: extend all moves that significantly increase
pressure against the enemy king.
- Write a is_stalemate() function that can be called in sq_search() when
gen_qs_moves() creates 0 moves.
- Dismiss moves with a bad SEE value already in gen_qs_moves()
- Carefully test all the commands in input.c and xboard.c
- En passant captures should be handled in a cleaner way in move generation.
The use of ep_sq should be consistent. In <Board> it's the <to> square,
and in <Move> it's the square of the enemy pawn.
- Optimize or get rid of get_threat_mask(), at least for generating legal
king moves.
- Search all captures in QS (ignore SEE) if a double check or
discovered check is possible.
- Add support for the UCI protocol
- Special evals for endgames like KBNK
- Detect blockades in eval
- Get pointer arguments as constants if they're for reading only
- In make_move(): if the move captures a rook, make sure the opponent
loses castling rights in that corner. It's very unlikely that the other
rook would later move there without the king moving first, but
it's possible.
- Get rid of EPD test support. There are better ways to run the test suites
than having the engine support them.
- Order the root moves more carefully, perhaps based on the node counts of
previous searches.
- Write more sophisticated wrappers for the platform-dependent dynamic
library functions.