algerbrex wrote: ↑Mon Oct 18, 2021 6:37 pm
Any particular reason? Or you'd rather just stick to improving search for now?]
Personally, I've always been drawn to seeing just how good I can make Blunder with minimal knowledge of chess. And PSTs + mobility seems to strike a pretty nice balance right now.
Improving evaluation can be a rabbit-hole of tinkering with lots of parameters. I'd rather first have a tuner to retune my own PST's, and then add pruning to make the engine see deeper. I intend to add null move, history heuristic (improve move ordering) and probably futility pruning (to cut down on QSearch) first, so the engine reaches something like depth 10-12 in the middle game.
I think I may add a very simple mobility function after that, which just calculates available legal moves == mobility and see what that gives me... but I also may look into other pruning methods first. I don't know yet. I just want to stay away from the tuning parameter thing for some time yet, because each time you add a parameter to the evaluation, you need to retune it.
Cool, I'll try to work that in some time this week then and report back

Did you also test how much mobility-only, without PVS, gave you in strength? (Obviously I don't expect you to test all permutations of all function combinations...)
Ah, that sucks. Good luck with that. Note sure how the UCI mode could be affected by that? I just know at some point I'll need to implement the XBoard protocol for Blunder.
(Some information about Rustic's internal architecture; you can skip this if you want, but it could be useful with regard to making Blunder a multi-protocol engine.)
For XBoard, the engine needs to know about its state, such as "Observing", "Waiting", "Thinking", etc. One very big catch of a state machine is that you have to be very precise where, and when, you change states. I made it so that Rustic's XBoard handler only directly changes Rustic's state when the engine can't do it by itself. Those should only be the inactive states: from Observing to Waiting, and back again. When search is called (either with time/depth controls, or as analysis, in Infinite mode), the search can report that it is "Thinking" (when running with time/depth controls) or "Analyzing" (when running in "Infinte" mode). It can also report when the search has exited (without producing a move), or finished (produced a best move). Thus the engine can switch states automatically, without me having to do this manually.
I suspect I made a mistake somewhere in the state machine, or in one of the functions I added to Rustic to make the state machine possible. The state machine will actually run when in UCI mode, even though UCI doesn't use the information. Still, if the state machine stops the search (due to a bug, race condition, or even by accident, by sending the wrong command due to a copy/paste or auto-complete error), then the UCI mode is affected.
I reverted Rustic to the point just before it had a state machine, and I'll retest this version. If it doesn't stall, I'll have to re-implement the state machine and test after each function I add.
I'm adding functions to the engine, such as state switching, exiting the search without a best move, accepting a completely new position during analysis and restarting the analysis, etc, which can either be used by a protocol, or not. I'm not specifically implementing "UCI" or "XBoard"; the protocols are not intertwined with the engine itself, or the search; they are just commands to use the engine's functionality. Therefore, in Rustic, XBoard is "just" a different command set to make the engine do things. The engine doesn't know if it is running in UCI mode or XBoard mode; it only knows it loaded a communication module called "UCI" or "XBoard", and passes the incoming commands to the appropriate handler. This handler then uses the engine's internal functions to do what is expected.