OK I confirmed from the fishnet code that the amount of analysis does not depend on any user action like clicking, but I did find this:
Work::Analysis { nodes, depth, .. } => {
let mut go = vec![
"go".to_owned(),
"nodes".to_owned(),
nodes.get(eval_flavor).to_string(),
];
if let Some(depth) = depth {
go.extend_from_slice(&["depth".to_owned(), depth.to_string()]);
}
They're setting a maximum number of nodes to analyse, which in doc/protocol.md is suggested to be between 2 and 4 million (the actual number is set on the side of the Lichess server which I've not checked).
A node limit will not be an exhaustive search to a specific depth, since Stockfish uses various heuristics to explore some lines before others. Still, it seems strange that it's possible for Stockfish to see a mate in 5 from one position that it wouldn't see from one ply later with the same node budget.
But there's also a line that says "for position in chunk.positions". Lichess is sending, not just one position to the current FishNet node, but a whole series of them. If Stockfish is evaluating multiple positions within the same game, it can build up transposition tables and other shortcuts and therefore explore positions later in the same chunk to a deeper depth.
So now I'm thinking, Black's move 35 was evaluated at the end of one of the chunks, where StockFish had enough transposition tables to see the mate in 5 within its node budget, but White's move 36 was evaluated at the start of the next chunk (sent to a different machine) and that one didn't have enough tables to see the mate.
Prediction: a search in the computer analysis database will reveal more examples of Black's forced mates seeming to disappear on White's move 21, 26, 31, 36, 41, 46 etc in games evaluated since this chunk logic was introduced.
OK I confirmed from the fishnet code that the amount of analysis does not depend on any user action like clicking, but I did find this:
Work::Analysis { nodes, depth, .. } => {
let mut go = vec![
"go".to_owned(),
"nodes".to_owned(),
nodes.get(eval_flavor).to_string(),
];
if let Some(depth) = depth {
go.extend_from_slice(&["depth".to_owned(), depth.to_string()]);
}
They're setting a maximum number of nodes to analyse, which in doc/protocol.md is suggested to be between 2 and 4 million (the actual number is set on the side of the Lichess server which I've not checked).
A node limit will not be an exhaustive search to a specific depth, since Stockfish uses various heuristics to explore some lines before others. Still, it seems strange that it's possible for Stockfish to see a mate in 5 from one position that it wouldn't see from one ply later with the same node budget.
But there's *also* a line that says "for position in chunk.positions". Lichess is sending, not just *one* position to the current FishNet node, but a whole series of them. If Stockfish is evaluating multiple positions within the same game, it can build up transposition tables and other shortcuts and therefore explore positions later in the same chunk to a deeper depth.
So now I'm thinking, Black's move 35 was evaluated at the *end* of one of the chunks, where StockFish had enough transposition tables to see the mate in 5 within its node budget, but White's move 36 was evaluated at the start of the *next* chunk (sent to a different machine) and *that* one didn't have enough tables to see the mate.
Prediction: a search in the computer analysis database will reveal more examples of Black's forced mates seeming to disappear on White's move 21, 26, 31, 36, 41, 46 etc in games evaluated since this chunk logic was introduced.