ZCT always does replies to checks and generates checks for the first two plies (or more, it is extended if there is a node with a single reply a la Rebel) of the qsearch. I get this:
Zach Wegner wrote:ZCT always does replies to checks and generates checks for the first two plies ...
How is it possible then, that you find the mate-in-2 only at 8 ply?
For Joker I can imagine that at 4 ply it doesn't see it, because Rxc7 is 'refuted' by a null move, after which no depth is left, and the mating move is not searched. But ZCT should have seen it even at 3 ply, as the QS after null move would still see the checkmate in its first ply.
Dann Corbit wrote:Here is a useful position for testing quiescent explosion:
[D]1B1Q2K1/q1p4P/4P3/3Pk1p1/1r1NrR1b/4pn1P/1pRp2n1/1B2N2b w - - c0 "415"; c1 "0"; bm Rxc7; ce 32764; dm 2; pv Rxc7 g4 Rxe4#;
+-----------------+
| . B . Q . . K . |
| q . p . . . . P |
| . . . . P . . . |
| . . . P k . p . | Castling:
| . r . N r R . b | ep: -
| . . . . p n . P |
| . p R p . . n . |
| . B . . N . . b | [White]
+-----------------+
analyze
5197 1: 0.0 +Mat_3 h7-h8=Q Ke5xf4 Nd4-e2 Kf4-f5
Qh8-f6
5906 2: 0.0 +Mat_3 h7-h8=Q Ke5xf4 Nd4-e2 <-transp
7680 3: 0.1 +Mat_2 Rc2xc7 Ng2xf4 h7-h8=Q
hgm wrote:Interesting that you need so few nodes, compared to Joker. But I guess this is mainly due to the fact that you also find the mate at much lower depth (3 ply, vs Joker's 5 ply and uMax' 6 ply).
hgm wrote:Interesting that you need so few nodes, compared to Joker. But I guess this is mainly due to the fact that you also find the mate at much lower depth (3 ply, vs Joker's 5 ply and uMax' 6 ply).
You probably search checks after null move?
Not specific after nullmove, but I do search a few checks in quiescense (forced lines only, i.e. first ply of quiescense, or in a checking sequence).
The Baron tries quite a few more, and is also less restricted where it tries them.
Another thing that could help is mate-distance pruning:
best=-MATEVALUE+ply;
if (best>=tbeta) return best;
if (best>talpha) talpha=best;
x=MATEVALUE-ply-1;
if (x<=talpha) return x;
if (x<tbeta) tbeta=x;
This is checked in all (regular search as well as quiescense search) nodes.
Richard.
Welcome to the computer chess world! I joined computer chess as I thought it would be less frustrating than try and improve my own humble rating. Imagine my surprise!
What is your engine called? ...and when do you think the first release will be made available?
Thanks. I started chess programming because it sounded like fun. I've found that it's a lot more fun than I even expected! I don't really get frustrated. I enjoy the challenge.
I'm actually writing my second engine now. When I first started I just jumped right in and wrote something up. The result was my first version of Knightmare. I then felt like exploring a couple of ideas, mainly with opening books, resulting in Knightmare BP, which is (temporarilly) available for download at: http://www.mikeleany.com/knightmare . Be warned that it's extremely buggy and plays very horrid chess (around 1000 Elo maybe?).
My new engine is called Zilch. With it, my intent is to actually write a mature stable engine. Already it's far superior to Knightmare (maybe around 2000 Elo on FICS?) and far less buggy. I'm guessing it will be available for download within a couple months. When it is you'll find it here: http://www.mikeleany.com/zilch . You can currently find a small amount of information about it on that page.
It's a combination of R=3 infinite nullmove and not searching underpromotions in qsearch (unless we are in check or they give check). Rxc7 is refuted by a null move. This null move is not refuted itself by another null move until the depth is big enough that dxe1=N is searched in the main search. So you get Rxc7 null null dxe1=N Rxe4#, where the first four moves take up 8 plies and the mate is in qsearch.
Or I just have a bug.
Last edited by Zach Wegner on Fri May 23, 2008 4:27 pm, edited 1 time in total.
Zach Wegner wrote:It's a combination of R=3 infinite nullmove and not searching underpromotions in qsearch (unless we are in check or they give check). Rxc7 is refuted by a null move. This null move is not refuted itself by another null move until the depth is big enough that dxe1=N is searched in the main search. So you get Rxc7 null null dxe1=N Rxe4#, where the first four moves take up 8 plies and the mate is in qsearch.
Or I just have a bug.
I am not sure I understand this:
If below 8 ply Rxc7 is refuted by a null move, the node following that null-move must be a low-failing all-node. At d=3 that null move jumps into QS. But as you do checks in the first ply of QS, it should play Rxe4#, as a checkmate is also a check. So how can you fail low on a checkmate (that is faster than any checkmate you have seen so far)?
I don't understand what under-promotion has to do with it.
BTW, both my engines do mate-distance pruning. This is an automatic side effect of the delayed-loss bonus, which also takes care of making sure the fastes mate is preferred. You can clearly see that from the uMax node count: once it finds the mate in 2 (at ply 6, as uMax is a King-capture engine), the node count hardly increases anymore. It just walks the same tree on every iteration, truncated at a certain level by the mate-distance pruning, to increase the search depth of every node.
I don't understand how Buzz can see the mate at such a low depth if you switch checks in QS off. Why isn't Rxc7 refuted by null move ad d=3?