Help - can't clear bug with tt-move.

Discussion of chess software programming and technical issues.

Moderator: Ras

User avatar
OliverUwira
Posts: 170
Joined: Mon Sep 13, 2010 9:57 am
Location: Frankfurt am Main

Re: Help - can't clear bug with tt-move.

Post by OliverUwira »

kongsian wrote:
OliverUwira wrote:

Code: Select all

            assert(tt->move ? is_move_available(tt->move, side) : 1); 
#if 1 
            if (tt->move) { 
                char buf[8]; 
                if (is_move_available(tt->move, side)) { 
                   sendlog("OK ttmove\n"); 
                } else { 
                   //fails in actual matches in release  mode; pc could be  0 which is a bug 
                   sendlog("!!!HASH ERROR ttmove\n"); 
                   sendlog("pc %d, from %d, to %d, %s\n", MOVE_PC(tt->move), 
                           FROM(tt->move), TO(tt->move) , move_string(tt->move, buf)); 
                } 
            } 
#endif 
First how is it possible that the assert directly above the #if passes but then the else block within the #if #endif is entered?
Good catch! The same with MOVE_PC(tt->move). It passes the assert (>=1 & <=6) but when you print it, pc=0? Looks like tt->move is being trashed by something. How about printing tt->move, tt->depth between all the asserts to make sure it doesn't get change? Could be something is clobbering your tt structure.

Kong Sian
Oh yes, the MOVE_PC() is another thing. So this would actually point to the is_move_available() itself. MOVE_PC() can't corrupt the move because it still passes the assert for is_move_available(). After that, something is wrong. Are you sure you don't get screwed by wrong move stack pointers (on account of is_move_available() generating a move list)?

I screwed myself like that recently when I temporarily gave up on staged move generation in order to concentrate on other things.

What killed me was the following. When working on staged generation, I decreased the size of the movestack because staged generation usually doesn't required that much space. When switching back, I didn't think of the smaller move stack.

The engine would then blow up when compiled for release, but not if compiled for debug. It took pains to eventually find out that the move stack would overflow in the release version, because that searches much deeper than the debug version (five times as many NPS) ...
Chan Rasjid
Posts: 588
Joined: Thu Mar 09, 2006 4:47 pm
Location: Singapore

Re: Help - can't clear bug with tt-move.

Post by Chan Rasjid »

OliverUwira wrote: Ok, some more questions.

Code: Select all

            assert(tt->move ? is_move_available(tt->move, side) : 1); 
#if 1 
            if (tt->move) { 
                char buf[8]; 
                if (is_move_available(tt->move, side)) { 
                   sendlog("OK ttmove\n"); 
                } else { 
                   //fails in actual matches in release  mode; pc could be  0 which is a bug 
                   sendlog("!!!HASH ERROR ttmove\n"); 
                   sendlog("pc %d, from %d, to %d, %s\n", MOVE_PC(tt->move), 
                           FROM(tt->move), TO(tt->move) , move_string(tt->move, buf)); 
                } 
            } 
#endif 
First how is it possible that the assert directly above the #if passes but then the else block within the #if #endif is entered?
In release mode matches, with NDEBUG defined, gcc will not compile in any of the assert()s; so the ttmove bug, pc == 0, etc happen only in release mode. In debug auto play everything goes fine (I added an assert(0) in the else block(codes below ) and it is not triggered).
Second, is there something that is done in release mode but not in auto-play-mode? Surely, the protocol handling. The hash table would be intitialised to the requested size there. Something else?
This is THE problem. If I know, I wouldn't have started this thread. :D
Third, could you also give the code of PROBE_MOVE() - it looks like a suspect.
It is just:

Code: Select all

#define PROBE_MOVE(ptt) ((ptt)->move)
- retrieving from the ttentry_t structure member.

Rasjid


Code: Select all

#if 1
            if (tt->move) {
                char buf[8];
                if (is_move_available(tt->move, side)) {
                     ;
                   //sendlog("OK ttmove\n");
                } else {
                   assert(0);// pass this new assert.  
                   //fails in actual matches in release  mode; pc could be  0 which is a bug
                   sendlog("!!!HASH ERROR ttmove\n");
                   sendlog("pc %d, from %d, to %d, %s\n", MOVE_PC(tt->move),
                           FROM(tt->move), TO(tt->move) , move_string(tt->move, buf));
                }
            }
#endif

Cowrie Chess Version 1.0, 3rd Feb 2010
score -2
Auto Play Start, num-move (20)
score -2
// 2 games with nothing triggered/

game 1 move h2h4
-+ - + - pv + - pv + - pc(31) + - + - + - pv + - + - pc(29) + pv - pv + pv - pv + pv - pv + - pv + - pc(25) + - + - pv + - pv + - pv + pv - pv pc(21) + - pv + pv - + - + pv - + - pc(19) + - pv + - pv + - pv + - + pv - pv pc(17) + pv - pv + - + - + - + - pc(15) + pv - + - + pv - + - + - pc(11) + - pv + pv - pv + - + pv - pv + - pv pc(10) + - pv + - pv + - + - + - pv pc(10) + - + - + - + - + - pc(9) + - + - + - + - + - pc(7) + - + - + - pv + - + pv - pc(6) + - + pv - pv + - pv + pv - pv + pv - pc(4) + pv - + pv - + - + - pv + - pv pc(3) + - pv + pv - + pv - pv + - + pv - pc(3) + - pv + - pv + - + - pv + - pv pc(3) + - pv + - pv + - pv + - pv + - pv pc(3) + - pv + - pv + - pv + - + - pv pc(3) + - + - + - + - + - pv pc(3) + - + - + - + - + - pc(3) + pv - + - + - + - + - pc(3) + - + - + - pv + - pv + - pv pc(3) + - + - +mate
score 7999
score -2


game 2 move g2g3
-+ - + - + - + - pv pc(30) + - + - + - + - + - pv pc(30) + - pv + - + - + - + pv - pc(27) + pv - + pv - + - + - + pv - pc(26) + - + pv - + - pv + pv - + - pc(24) + - + pv - pv + pv - pv + - pv + pv - pc(20) + - + pv - + - + pv - + - pv pc(20) + pv - + pv - pv + - pv + - pv + - pc(17) + - pv + - + pv - + - + - pv pc(14) + - + - pv + - pv + pv - + pv - pc(13) + pv - + - pv + pv - + - + - pv pc(11) + - + - + - mate
score -8000
score -2

// if "OK ttmove" enabled, it fill up all my linux terminal.

OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
OK ttmove
^C
rasjid@debian:~/cowrie/debug/src$ ~
Best Regards,
Rasjid.
Chan Rasjid
Posts: 588
Joined: Thu Mar 09, 2006 4:47 pm
Location: Singapore

Re: Help - can't clear bug with tt-move.

Post by Chan Rasjid »

kongsian wrote:
OliverUwira wrote:

Code: Select all

            assert(tt->move ? is_move_available(tt->move, side) : 1); 
#if 1 
            if (tt->move) { 
                char buf[8]; 
                if (is_move_available(tt->move, side)) { 
                   sendlog("OK ttmove\n"); 
                } else { 
                   //fails in actual matches in release  mode; pc could be  0 which is a bug 
                   sendlog("!!!HASH ERROR ttmove\n"); 
                   sendlog("pc %d, from %d, to %d, %s\n", MOVE_PC(tt->move), 
                           FROM(tt->move), TO(tt->move) , move_string(tt->move, buf)); 
                } 
            } 
#endif 
First how is it possible that the assert directly above the #if passes but then the else block within the #if #endif is entered?
Good catch! The same with MOVE_PC(tt->move). It passes the assert (>=1 & <=6) but when you print it, pc=0? Looks like tt->move is being trashed by something. How about printing tt->move, tt->depth between all the asserts to make sure it doesn't get change? Could be something is clobbering your tt structure.

Kong Sian
The clarification is in my reply above to Uwira.

Thanks.
Rasjid.
Chan Rasjid
Posts: 588
Joined: Thu Mar 09, 2006 4:47 pm
Location: Singapore

Re: Help - can't clear bug with tt-move.

Post by Chan Rasjid »

After that, something is wrong. Are you sure you don't get screwed by wrong move stack pointers (on account of is_move_available() generating a move list)?
bool is_move_available(move_t move, int side)
- generates the move list in a local stack; so should not corrupt anything.
What killed me was the following. When working on staged generation, I decreased the size of the movestack because staged generation usually doesn't required that much space. When switching back, I didn't think of the smaller move stack.
An aside, I am not sure you know this. I first learned from H.G. Muller aeons ago; does not matter to allocate huge (local ?) stack elements. (Probably) Because our modern cpu architecture memory management, cache, etc is smart; when the codes don't touch those very high addresses, there is no penalty; memory is "virtual" and "cached" :-

Code: Select all

int search(int depth, int side, ...){
unsigned int move_list[256];
// no penalty whether it is 1024/512/256; I //tested with 65536 and speed is not affected.
...
}
// same nps with move stack [65536]
1 reply g1f3
allocate time, node-mask 0x3fff
num move 20
bestmove c7c6
1 c7c6 ( -19) depth( 6) pvL( 7) ply(22) nps( 401048) pc(32) cttime(46) ctpoll(1)
sec(1.09, 1.39) nodes(557056) q(12.7%) h(52.5%) f(34.8%) FH(100.1%) invalid(0) evasion(4.5%)
Hash(5.4%, qs 3.1%, p 91.0%) matOWrite( 89.38) draw(0) null(5.2% / 11.8%, 0.00%, 0.00%)
Pvs-zero/re(66.43% / 0.51%) ext(16.83%) mat-prune/qs(0.07% / 0.00%) lmr(71.26% / 6.51%)
Root resrc(11.34%) see(4.64%)
EV (268.03%) lazy(23.44%) fut(16.79%) fl(6.65%) nom(0.00%)
2 reply b1c3
allocate time, node-mask 0x3fff
num move 21
bestmove b7b5
2 b7b5 ( 4) depth( 6) pvL( 7) ply(21) nps( 361200) pc(32) cttime(42) ctpoll(0)
sec(1.18, 1.34) nodes(485453) q(10.2%) h(56.1%) f(33.7%) FH(92.1%) invalid(0) evasion(3.6%)
Hash(8.0%, qs 2.8%, p 90.4%) matOWrite( 87.00) draw(0) null(6.4% / 15.7%, 0.00%, 0.00%)
Pvs-zero/re(67.87% / 0.48%) ext(11.84%) mat-prune/qs(0.10% / 0.00%) lmr(94.95% / 5.57%)
Root resrc(14.74%) see(5.20%)
EV (295.41%) lazy(23.60%) fut(17.73%) fl(5.85%) nom(0.02%)
3 reply d2d4
allocate time, node-mask 0x3fff
num move 22
Opponent followPV, score(4) bestmove(b5b4)
bestmove b5b4
3 b5b4 ( -31) depth( 6) pvL( 7) ply(22) nps( 322440) pc(32) cttime(44) ctpoll(1)
sec(1.07, 1.63) nodes(524288) q(13.7%) h(55.7%) f(30.6%) FH(95.9%) invalid(0) evasion(5.7%)
Hash(6.2%, qs 1.9%, p 91.8%) matOWrite( 90.27) draw(0) null(6.7% / 20.6%, 0.04%, 0.00%)
Pvs-zero/re(71.40% / 0.42%) ext(17.60%) mat-prune/qs(0.01% / 0.00%) lmr(112.44% / 4.67%)
Root resrc(20.00%) see(3.90%)
EV (292.32%) lazy(29.58%) fut(23.57%) fl(6.01%) nom(0.01%)
4 reply c3e4
allocate time, node-mask 0x3fff
num move 22
Opponent followPV, score(-31) bestmove(f7f5)

The engine would then blow up when compiled for release, but not if compiled for debug. It took pains to eventually find out that the move stack would overflow in the release version, because that searches much deeper than the debug version (five times as many NPS) ...
"pains" is what I understand and happens on and off with chess programming.

Best Regards,
Rasjid
User avatar
OliverUwira
Posts: 170
Joined: Mon Sep 13, 2010 9:57 am
Location: Frankfurt am Main

Re: Help - can't clear bug with tt-move.

Post by OliverUwira »

Chan Rasjid wrote:
OliverUwira wrote:
Second, is there something that is done in release mode but not in auto-play-mode? Surely, the protocol handling. The hash table would be intitialised to the requested size there. Something else?
This is THE problem. If I know, I wouldn't have started this thread. :D
Rasjid.
I've had another look at the hash error prints. Most error moves simply look random, like d1a1r with pc=0. I would have two more stabs at it, hinting at things that happened to me in similar fashion.

First, you wrote that you also check the best move with is_move_available() before storing it into the TT. Does this mean that you do it always or in the debug version only? What does happen if a move is invalid?

I'm hinting at the hash store of a node where you failed low. In that case, you would not have a best move at all, and if the variable designated to store it has not been initialised to zero, you would maybe pass neither a valid move nor zero to the function that stores into the TT.

Third, is there a chance that it is related to the move stack or the search stack? As I have written, things like that are sensitive to the difference between a slow debug version and a fast release version. So if you overflow the move stack into an area where there is a subsequent write by e.g. some stats-keeping code, you could end up with a move stack pointer to data that is not a "well-formed" move. This might be unlikely because it should somehow crash your engine in SetMove() but who knows. Further, could the SearchStack overflow and corrupt the TT if (ply > MAXDEPTH)?

Also, maybe you should also post your TT storing code.
bob
Posts: 20943
Joined: Mon Feb 27, 2006 7:30 pm
Location: Birmingham, AL

Re: Help - can't clear bug with tt-move.

Post by bob »

Some questions.

(1) is this a single-thread search? A SMP search can easily do this if care is not taken to prevent two threads from modifying the same hash entry at the same time.

(2) a bounds-checker might help if you store into another array either right before or right after the hash table memory, so that a bad subscript will stuff something into the table and overwrite good data with bad.

(3) I assume you have some sort of move "verification" that tests the best move each time you retrieve a hash entry? Just for fun, what about doing that same verification process when you store any best move, just to be sure that this is something that is getting corrupted after it is stored, rather than during the store.
bob
Posts: 20943
Joined: Mon Feb 27, 2006 7:30 pm
Location: Birmingham, AL

Re: Help - can't clear bug with tt-move.

Post by bob »

Chan Rasjid wrote:
OliverUwira wrote:Is it reasonable to expect a legal move 100% of the time in case of a hash hit? It could be a collision. But if, as you say, the problem shows up easily and collisions should be rare, there might be another problem.

One that just sprang into my eyes is the following:

Code: Select all

/* pTT is 1st element of 4-element bucket aligned at 64-byte address */ 
    for (p = pTT + 4; (p--) > pTT;)  {
        ...
    }
If pTT really points to the first element of the bucket, shouldn't the loop read rather like below?

Code: Select all

    for(p = pTT + 3; (p--) >= pTT;) {
        ...
    }
I think my loop is correct; (p--) is post decrement which decrements after the comparison; within the loop body, p would be pTT+3, pTT+2,pTT+1,pTT+0.

I am aware of the issue of collision and I think it is not collision (I have about 40+ check bits for TT size 64M); any collision would as easily show up in debug auto games as in real matches; real matches have about 5 - 10 failure for every search of 1 sec, ie about 300-400k nodes. For every ttmove failure there are great number of valid ttmoves.

I discover this bug only now when I implement searching the ttmove before move generation. In the past, I always clear the ttmove as my qsearch excludes some moves and a ttmove might not be in my generated list. So my program could play many real matches withou any crash.

This bug now really stumbles me and it is why I seek help here.

Rasjid
Another idea. What about the very end of the table? When I did my new "hash path" idea, I used buckets of size 8. But cleverly forgot that if you probe into a table of size 2^N entries, you need 2^N+7 entries to take care of the hash probe to that last entry + the next 7. Did you get the malloc() size corrected for the extra bucket entries? Or if you are going in a negative direction, can you every probe at entry 0 plus the 3 before it? Either way leads to trouble, obviously...
bob
Posts: 20943
Joined: Mon Feb 27, 2006 7:30 pm
Location: Birmingham, AL

Re: Help - can't clear bug with tt-move.

Post by bob »

I think the log shows that you can find this easily. You get errors really quickly according to the log file. What I usually do is take something like WAC, and run each position for 2 seconds. If any produce errors, pick the one that produces the error after the fewest number of nodes, and start your debugging there. If you are lucky and find one that breaks after 20,000 nodes, you can dump the entire tree as you debug to see exactly what is happening. If it takes 20M, then you need to do what HGM suggested and first identify the entry number where the move is found to be bad, and then modify your store code so that each time you store in that entry, you print whatever information you might find useful for debugging. The position. The best move. The side to move. The depth. Etc...


Chan Rasjid wrote:
hgm wrote:It must mean you have collissons (unless somewhere a faulty pointer makes you write randomly in the TT).

When you have a positon where you reproduciby can generate this error, it is reasonably simple to debug it: First run the search, test for the erroneous hash move, and print the TT entry number and board position when it occurs (and then exit). Second, add code near you hash store code that prints the board every time you store in that hash entry, and rn the serch again. Now the last board printed before you hit on the erroneous hash move is the positon where the store was dne that produced an error when you retrieved it. If they are different, you had a collission, and this explains the bad hash move. If they are the same, and the move ws valid when it went in, but an invalid mov came ot, it must have been overwritten. In that case, also print the node counter with the board, and add test at the beginning of search to test fo any node counter value between those extremes if the hash move of that entry is still what went in, and print the node counter when it is not. Then you can determine the node where the overwriting occurs.
I am not sure yet how to get a reproducible point to debug. I'll have to think a bit more.

Meantime I have my log printout below. I don't print when the ttmove is ok as there are too many, only those failures which seem to have a corrupted string like the 3 bits of promote type (my move is an unsigned int with 6 bits from, 6 to, 3 promote type, 1 is-check-move).

Also it seems the bug decrease as the game proceeds.

Rasjid.
Cowrie Chess Version 1.0, 3rd Feb 2010

pTT_malloc (0x7f733076a010), pTT (0x7f733076a080)
TT Table Size( 32 MB )
No of Entry( 2097152 )
Entry Size(16 byte)

Pawnhash Table Size( 3 MB )
No of Entry( 65536 )
Entry Size(56 byte)

allocate time, node-mask 0xf
num move 20
Computer NPS = 382491
pTT_malloc (0x7f732e76a010), pTT (0x7f732e76a080)
TT Table Size( 64 MB )
No of Entry( 4194304 )
Entry Size(16 byte)

1 reply g1f3
allocate time, node-mask 0x3fff
num move 20
!!!HASH ERROR ttmove
pc 0, from 59, to 55, h4g8
!!!HASH ERROR ttmove
pc 3, from 18, to 7, c3a8r
!!!HASH ERROR ttmove
pc 0, from 45, to 48, f6g1
!!!HASH ERROR ttmove
pc 1, from 25, to 42, d2f3b
!!!HASH ERROR ttmove
pc 4, from 7, to 31, a8d8b
!!!HASH ERROR ttmove
pc 1, from 25, to 42, d2f3b
!!!HASH ERROR ttmove
pc 0, from 30, to 21, d7c6q
!!!HASH ERROR ttmove
pc 5, from 39, to 18, e8c3b
!!!HASH ERROR ttmove
pc 0, from 50, to 22, g3c7r
!!!HASH ERROR ttmove
pc 0, from 24, to 0, d1a1r
!!!HASH ERROR ttmove
pc 5, from 39, to 18, e8c3b
!!!HASH ERROR ttmove
pc 0, from 35, to 63, e4h8
!!!HASH ERROR ttmove
pc 0, from 35, to 63, e4h8
bestmove c7c6
1 c7c6 ( -19) depth( 6) pvL( 7) ply(22) nps( 397329) pc(32) cttime(46) ctpoll(1)
sec(1.10, 1.40) nodes(557056) q(12.7%) h(52.5%) f(34.8%) FH(100.1%) invalid(0) evasion(4.9%)
Hash(5.4%, qs 3.1%, p 91.0%) matOWrite( 89.37) draw(0) null(5.2% / 11.8%, 0.00%, 0.00%)
Pvs-zero/re(66.43% / 0.51%) ext(16.83%) mat-prune/qs(0.07% / 0.00%) lmr(71.26% / 6.51%)
Root resrc(11.34%) see(4.64%)
EV (268.03%) lazy(23.44%) fut(16.79%) fl(6.65%) nom(0.00%)
2 reply b1c3
allocate time, node-mask 0x3fff
num move 21
!!!HASH ERROR ttmove
pc 6, from 24, to 21, d1c6r
!!!HASH ERROR ttmove
pc 0, from 51, to 22, g4c7q
!!!HASH ERROR ttmove
pc 1, from 49, to 12, g2b5r
!!!HASH ERROR ttmove
pc 0, from 37, to 53, e6g6q
bestmove b7b5
2 b7b5 ( 4) depth( 6) pvL( 7) ply(21) nps( 361469) pc(32) cttime(42) ctpoll(0)
sec(1.18, 1.34) nodes(485453) q(10.2%) h(56.1%) f(33.7%) FH(92.1%) invalid(0) evasion(3.5%)
Hash(8.0%, qs 2.8%, p 90.4%) matOWrite( 87.00) draw(0) null(6.4% / 15.7%, 0.00%, 0.00%)
Pvs-zero/re(67.87% / 0.48%) ext(11.84%) mat-prune/qs(0.10% / 0.00%) lmr(94.95% / 5.57%)
Root resrc(14.74%) see(5.20%)
EV (295.41%) lazy(23.60%) fut(17.73%) fl(5.85%) nom(0.02%)
3 reply d2d4
allocate time, node-mask 0x3fff
num move 22
Opponent followPV, score(4) bestmove(b5b4)
bestmove d8a5
3 d8a5 ( -46) depth( 6) pvL( 7) ply(22) nps( 177018) pc(32) cttime(30) ctpoll(0)
sec(1.07, 1.67) nodes(294912) q(14.7%) h(53.5%) f(31.9%) FH(97.8%) invalid(0) evasion(5.7%)
Hash(6.4%, qs 2.3%, p 91.9%) matOWrite( 89.94) draw(0) null(5.7% / 20.3%, 0.07%, 0.00%)
Pvs-zero/re(70.36% / 0.61%) ext(17.78%) mat-prune/qs(0.01% / 0.00%) lmr(94.58% / 4.72%)
Root resrc(21.25%) see(4.13%)
EV (301.88%) lazy(29.21%) fut(23.08%) fl(6.13%) nom(0.00%)
4 reply c1d2
allocate time, node-mask 0x1fff
num move 28
bestmove b5b4
4 b5b4 ( 3) depth( 6) pvL( 8) ply(20) nps( 335612) pc(32) cttime(78) ctpoll(2)
sec(1.28, 1.61) nodes(540672) q(14.8%) h(53.2%) f(32.0%) FH(94.7%) invalid(0) evasion(6.1%)
Hash(9.8%, qs 2.5%, p 93.1%) matOWrite( 80.27) draw(0) null(6.4% / 24.8%, 0.00%, 0.00%)
Pvs-zero/re(71.33% / 0.51%) ext(18.73%) mat-prune/qs(0.06% / 0.00%) lmr(100.15% / 3.02%)
Root resrc(20.51%) see(4.65%)
EV (361.77%) lazy(37.69%) fut(31.03%) fl(6.57%) nom(0.09%)
5 reply c3e4
allocate time, node-mask 0x3fff
num move 33
Opponent followPV, score(3) bestmove(d7d5)
!!!HASH ERROR ttmove
pc 0, from 34, to 52, e3g5b
bestmove d7d5
5 d7d5 ( -60) depth( 8) pvL( 9) ply(28) nps( 379696) pc(32) cttime(46) ctpoll(0)
sec(1.08, 1.28) nodes(486771) q(23.1%) h(48.3%) f(28.6%) FH(103.3%) invalid(0) evasion(6.4%)
Hash(6.4%, qs 2.4%, p 93.3%) matOWrite( 85.85) draw(0) null(7.9% / 36.9%, 0.40%, 0.00%)
Pvs-zero/re(73.95% / 0.15%) ext(24.06%) mat-prune/qs(0.08% / 0.00%) lmr(103.33% / 1.28%)
Root resrc(0.00%) see(7.18%)
EV (316.37%) lazy(43.62%) fut(35.68%) fl(7.94%) nom(0.00%)
6 reply e4c5
allocate time, node-mask 0x7fff
num move 31
Opponent followPV, score(-60) bestmove(b8d7)
!!!HASH ERROR ttmove
pc 4, from 63, to 22, h8c7b
bestmove b8d7
6 b8d7 ( -122) depth( 8) pvL(10) ply(27) nps( 421511) pc(32) cttime(51) ctpoll(2)
sec(1.34, 2.77) nodes(1166322) q(20.2%) h(50.9%) f(28.9%) FH(96.8%) invalid(0) evasion(9.9%)
Hash(6.0%, qs 2.7%, p 94.0%) matOWrite( 89.55) draw(0) null(10.0% / 40.4%, 0.67%, 0.00%)
Pvs-zero/re(72.71% / 0.08%) ext(26.66%) mat-prune/qs(1.71% / 0.00%) lmr(112.59% / 1.88%)
Root resrc(0.00%) see(6.56%)
EV (292.42%) lazy(46.37%) fut(38.76%) fl(7.56%) nom(0.05%)
7 reply a2a3
allocate time, node-mask 0x7fff
num move 30
Opponent followPV, score(-122) bestmove(d7c5)
!!!HASH ERROR ttmove
pc 0, from 14, to 0, b7a1
bestmove a5c7
7 a5c7 ( -98) depth( 8) pvL( 9) ply(25) nps( 393019) pc(32) cttime(40) ctpoll(1)
sec(1.29, 2.00) nodes(786432) q(17.5%) h(53.8%) f(28.6%) FH(96.0%) invalid(0) evasion(6.5%)
Hash(8.9%, qs 3.2%, p 93.7%) matOWrite( 87.15) draw(0) null(10.2% / 42.2%, 0.58%, 0.00%)
Pvs-zero/re(74.09% / 0.18%) ext(24.54%) mat-prune/qs(2.59% / 0.00%) lmr(125.16% / 2.13%)
Root resrc(3.70%) see(7.36%)
EV (312.06%) lazy(44.91%) fut(37.63%) fl(6.75%) nom(0.53%)
8 reply c5d7
allocate time, node-mask 0x3fff
num move 32
!!!HASH ERROR ttmove
pc 0, from 8, to 6, b1a7r
!!!HASH ERROR ttmove
pc 0, from 8, to 6, b1a7r
!!!HASH ERROR ttmove
pc 0, from 8, to 6, b1a7r
!!!HASH ERROR ttmove
pc 0, from 8, to 6, b1a7r
!!!HASH ERROR ttmove
pc 0, from 8, to 6, b1a7r
!!!HASH ERROR ttmove
pc 0, from 5, to 24, a6d1r
!!!HASH ERROR ttmove
pc 1, from 34, to 33, e3e2
bestmove c8d7
8 c8d7 ( -105) depth( 8) pvL(11) ply(25) nps( 332093) pc(30) cttime(63) ctpoll(1)
sec(1.19, 2.36) nodes(784736) q(16.5%) h(50.9%) f(32.6%) FH(92.4%) invalid(0) evasion(6.3%)
Hash(10.8%, qs 3.6%, p 96.5%) matOWrite( 83.78) draw(0) null(8.1% / 44.3%, 0.40%, 0.01%)
Pvs-zero/re(72.01% / 0.17%) ext(25.11%) mat-prune/qs(0.91% / 0.00%) lmr(96.05% / 2.66%)
Root resrc(0.00%) see(9.10%)
EV (371.37%) lazy(41.33%) fut(34.72%) fl(6.56%) nom(0.05%)
9 reply a3b4
allocate time, node-mask 0x3fff
num move 34
!!!HASH ERROR ttmove
pc 1, from 34, to 33, e3e2
!!!HASH ERROR ttmove
pc 1, from 34, to 33, e3e2
!!!HASH ERROR ttmove
pc 1, from 34, to 33, e3e2
!!!HASH ERROR ttmove
pc 1, from 34, to 33, e3e2
!!!HASH ERROR ttmove
pc 1, from 34, to 33, e3e2
!!!HASH ERROR ttmove
pc 1, from 34, to 33, e3e2
!!!HASH ERROR ttmove
pc 1, from 34, to 33, e3e2
bestmove g8f6
9 g8f6 ( -91) depth( 7) pvL( 4) ply(24) nps( 364482) pc(29) cttime(38) ctpoll(0)
sec(1.09, 1.04) nodes(377604) q(20.2%) h(51.6%) f(28.1%) FH(103.3%) invalid(0) evasion(6.0%)
Hash(8.8%, qs 2.9%, p 97.6%) matOWrite( 86.43) draw(0) null(7.7% / 39.3%, 0.56%, 0.00%)
Pvs-zero/re(74.53% / 0.17%) ext(28.30%) mat-prune/qs(2.29% / 0.00%) lmr(117.57% / 2.24%)
Root resrc(4.76%) see(9.39%)
EV (328.59%) lazy(42.73%) fut(35.11%) fl(7.60%) nom(0.02%)
10 reply e2e3
allocate time, node-mask 0x3fff
num move 35
bestmove f6e4
10 f6e4 ( -190) depth( 7) pvL( 9) ply(23) nps( 377929) pc(29) cttime(61) ctpoll(1)
sec(1.10, 2.08) nodes(786093) q(15.2%) h(49.3%) f(35.5%) FH(96.4%) invalid(0) evasion(8.9%)
Hash(6.2%, qs 3.0%, p 96.9%) matOWrite( 86.76) draw(0) null(4.6% / 24.6%, 0.23%, 0.00%)
Pvs-zero/re(67.28% / 0.16%) ext(27.84%) mat-prune/qs(0.08% / 0.00%) lmr(66.70% / 1.65%)
Root resrc(5.26%) see(7.38%)
EV (321.84%) lazy(36.58%) fut(28.44%) fl(7.02%) nom(1.13%)
11 reply f1d3
allocate time, node-mask 0x3fff
num move 41
bestmove e8d8
11 e8d8 ( -281) depth( 8) pvL(11) ply(23) nps( 399603) pc(29) cttime(68) ctpoll(1)
sec(1.12, 2.16) nodes(862745) q(13.8%) h(57.1%) f(29.1%) FH(96.4%) invalid(0) evasion(10.4%)
Hash(6.7%, qs 1.6%, p 95.5%) matOWrite( 88.28) draw(0) null(6.6% / 15.5%, 1.15%, 0.00%)
Pvs-zero/re(73.23% / 0.23%) ext(27.09%) mat-prune/qs(3.66% / 0.04%) lmr(132.89% / 3.53%)
Root resrc(28.00%) see(3.12%)
EV (308.60%) lazy(47.99%) fut(37.22%) fl(6.79%) nom(3.98%)
12 reply d3e4
allocate time, node-mask 0x3fff
num move 33
Opponent followPV, score(-281) bestmove(d5e4)
bestmove d5e4
12 d5e4 ( -269) depth( 9) pvL(11) ply(23) nps( 408470) pc(27) cttime(76) ctpoll(1)
sec(1.08, 2.36) nodes(962766) q(12.6%) h(54.9%) f(32.4%) FH(90.5%) invalid(0) evasion(11.6%)
Hash(9.0%, qs 2.2%, p 95.4%) matOWrite( 80.66) draw(0) null(6.9% / 23.5%, 0.98%, 0.01%)
Pvs-zero/re(70.93% / 0.10%) ext(28.32%) mat-prune/qs(3.41% / 0.10%) lmr(110.69% / 4.13%)
Root resrc(0.00%) see(2.83%)
EV (340.15%) lazy(54.67%) fut(42.49%) fl(7.41%) nom(4.76%)
13 reply f3g5
allocate time, node-mask 0x3fff
num move 31
Opponent followPV, score(-269) bestmove(d8e8)
!!!HASH ERROR ttmove
pc 1, from 37, to 53, e6g6n
bestmove d8e8
13 d8e8 ( -270) depth( 8) pvL( 7) ply(21) nps( 378409) pc(27) cttime(67) ctpoll(1)
sec(0.93, 2.22) nodes(841204) q(11.1%) h(50.2%) f(38.7%) FH(91.7%) invalid(0) evasion(9.8%)
Hash(7.2%, qs 3.3%, p 95.8%) matOWrite( 81.68) draw(0) null(6.0% / 19.2%, 0.41%, 0.00%)
Pvs-zero/re(64.10% / 0.18%) ext(21.36%) mat-prune/qs(9.63% / 0.15%) lmr(59.25% / 1.81%)
Root resrc(6.41%) see(3.19%)
EV (318.57%) lazy(58.60%) fut(42.66%) fl(11.05%) nom(4.90%)
14 reply g5e4
allocate time, node-mask 0x3fff
num move 32
Opponent followPV, score(-270) bestmove(h7h5)
bestmove g7g6
14 g7g6 ( -297) depth( 7) pvL( 8) ply(18) nps( 412089) pc(26) cttime(54) ctpoll(1)
sec(0.81, 1.63) nodes(670470) q(10.5%) h(60.4%) f(29.1%) FH(90.2%) invalid(0) evasion(14.5%)
Hash(10.2%, qs 3.9%, p 96.1%) matOWrite( 77.50) draw(0) null(7.3% / 25.5%, 0.34%, 0.00%)
Pvs-zero/re(73.30% / 0.45%) ext(33.89%) mat-prune/qs(4.97% / 0.14%) lmr(145.24% / 2.23%)
Root resrc(19.85%) see(2.08%)
EV (303.75%) lazy(66.95%) fut(55.92%) fl(8.80%) nom(2.23%)
15 reply e4c5
allocate time, node-mask 0x3fff
num move 32
bestmove a8d8
15 a8d8 ( -321) depth( 6) pvL( 6) ply(17) nps( 405563) pc(26) cttime(33) ctpoll(0)
sec(0.77, 0.81) nodes(328101) q(14.6%) h(53.7%) f(31.8%) FH(102.2%) invalid(0) evasion(8.9%)
Hash(7.6%, qs 2.8%, p 96.4%) matOWrite( 82.70) draw(0) null(4.4% / 22.2%, 0.00%, 0.00%)
Pvs-zero/re(69.33% / 0.76%) ext(27.29%) mat-prune/qs(3.31% / 0.67%) lmr(86.84% / 6.26%)
Root resrc(44.90%) see(5.17%)
EV (291.53%) lazy(45.23%) fut(29.10%) fl(7.89%) nom(8.24%)
16 reply e1g1
allocate time, node-mask 0x3fff
num move 30
bestmove e7e6
16 e7e6 ( -301) depth( 7) pvL( 8) ply(20) nps( 400968) pc(26) cttime(50) ctpoll(1)
sec(0.96, 1.47) nodes(589824) q(8.2%) h(56.1%) f(35.6%) FH(83.3%) invalid(0) evasion(9.4%)
Hash(6.7%, qs 2.1%, p 95.9%) matOWrite( 84.23) draw(0) null(7.7% / 24.0%, 0.14%, 0.00%)
Pvs-zero/re(68.32% / 0.45%) ext(22.52%) mat-prune/qs(2.35% / 0.10%) lmr(97.58% / 2.57%)
Root resrc(7.69%) see(3.99%)
EV (343.64%) lazy(54.85%) fut(39.96%) fl(8.13%) nom(6.76%)
17 reply d1f3
allocate time, node-mask 0x3fff
num move 29
Opponent followPV, score(-301) bestmove(f8d6)
bestmove d7c8
17 d7c8 ( -328) depth( 6) pvL( 6) ply(19) nps( 455111) pc(26) cttime(50) ctpoll(1)
sec(0.90, 1.37) nodes(622592) q(11.2%) h(55.5%) f(33.3%) FH(87.2%) invalid(0) evasion(14.4%)
Hash(9.5%, qs 1.9%, p 96.1%) matOWrite( 78.10) draw(0) null(6.7% / 23.8%, 0.00%, 0.00%)
Pvs-zero/re(70.06% / 0.42%) ext(32.34%) mat-prune/qs(3.58% / 0.36%) lmr(105.23% / 1.50%)
Root resrc(13.04%) see(3.84%)
EV (294.83%) lazy(65.10%) fut(48.35%) fl(9.11%) nom(7.65%)
18 reply g2g3
allocate time, node-mask 0x3fff
num move 32
!!!HASH ERROR ttmove
pc 1, from 9, to 28, b2d5
!!!HASH ERROR ttmove
pc 0, from 16, to 63, c1h8
!!!HASH ERROR ttmove
pc 0, from 16, to 63, c1h8
!!!HASH ERROR ttmove
pc 0, from 16, to 63, c1h8
!!!HASH ERROR ttmove
pc 0, from 16, to 63, c1h8
!!!HASH ERROR ttmove
pc 0, from 16, to 63, c1h8
!!!HASH ERROR ttmove
pc 0, from 16, to 63, c1h8
!!!HASH ERROR ttmove
pc 0, from 16, to 63, c1h8
bestmove f8e7
18 f8e7 ( -294) depth( 5) pvL( 6) ply(19) nps( 407456) pc(26) cttime(35) ctpoll(0)
sec(0.91, 0.98) nodes(399307) q(17.2%) h(47.0%) f(35.7%) FH(94.5%) invalid(0) evasion(11.9%)
Hash(7.8%, qs 3.7%, p 96.0%) matOWrite( 83.94) draw(0) null(4.1% / 29.1%, 0.00%, 0.00%)
Pvs-zero/re(68.29% / 0.97%) ext(31.02%) mat-prune/qs(0.66% / 0.26%) lmr(64.14% / 2.83%)
Root resrc(13.70%) see(4.91%)
EV (335.42%) lazy(55.95%) fut(40.35%) fl(10.25%) nom(5.35%)
19 reply d2c3
allocate time, node-mask 0x3fff
num move 33
bestmove h8g8
19 h8g8 ( -280) depth( 6) pvL( 6) ply(24) nps( 456465) pc(26) cttime(116) ctpoll(3)
sec(0.89, 3.70) nodes(1687552) q(14.7%) h(50.3%) f(35.0%) FH(88.3%) invalid(0) evasion(12.4%)
Hash(6.7%, qs 1.9%, p 96.4%) matOWrite( 87.78) draw(0) null(6.1% / 21.7%, 0.19%, 0.00%)
Pvs-zero/re(68.19% / 0.21%) ext(25.72%) mat-prune/qs(4.29% / 0.64%) lmr(83.84% / 3.10%)
Root resrc(35.85%) see(4.11%)
EV (348.56%) lazy(66.89%) fut(46.54%) fl(8.31%) nom(12.03%)
20 reply e3e4
allocate time, node-mask 0x3fff
num move 34
!!!HASH ERROR ttmove
pc 4, from 55, to 16, g8c1b
!!!HASH ERROR ttmove
pc 0, from 15, to 38, b8e7
bestmove c7b8
20 c7b8 ( -280) depth( 5) pvL( 5) ply(17) nps( 391954) pc(26) cttime(26) ctpoll(0)
sec(0.57, 0.67) nodes(260650) q(16.7%) h(49.0%) f(34.3%) FH(94.6%) invalid(0) evasion(9.5%)
Hash(12.4%, qs 6.7%, p 96.5%) matOWrite( 76.54) draw(0) null(4.3% / 33.8%, 0.00%, 0.00%)
Pvs-zero/re(70.22% / 0.89%) ext(30.25%) mat-prune/qs(0.88% / 0.24%) lmr(76.81% / 2.46%)
Root resrc(12.99%) see(4.42%)
EV (357.80%) lazy(55.92%) fut(40.59%) fl(8.88%) nom(6.45%)
21 reply e4e5
allocate time, node-mask 0x1fff
num move 32
Opponent followPV, score(-280) bestmove(b8b6)
!!!HASH ERROR ttmove
pc 2, from 18, to 63, c3h8n
bestmove b8b6
21 b8b6 ( -309) depth( 6) pvL( 8) ply(19) nps( 387341) pc(26) cttime(37) ctpoll(0)
sec(0.59, 0.51) nodes(197157) q(11.6%) h(54.4%) f(33.9%) FH(88.7%) invalid(0) evasion(9.5%)
Hash(9.0%, qs 3.0%, p 96.9%) matOWrite( 76.78) draw(0) null(6.3% / 31.6%, 0.00%, 0.00%)
Pvs-zero/re(70.27% / 0.49%) ext(31.12%) mat-prune/qs(1.09% / 0.19%) lmr(97.11% / 1.23%)
Root resrc(0.00%) see(4.54%)
EV (346.29%) lazy(55.86%) fut(43.24%) fl(8.08%) nom(4.55%)
22 reply b2b3
allocate time, node-mask 0x1fff
num move 32
Opponent followPV, score(-309) bestmove(g6g5)
!!!HASH ERROR ttmove
pc 0, from 7, to 53, a8g6b
bestmove g8f8
22 g8f8 ( -309) depth( 6) pvL( 3) ply(22) nps( 402666) pc(26) cttime(164) ctpoll(2)
sec(0.62, 3.07) nodes(1236992) q(16.2%) h(51.3%) f(32.5%) FH(91.7%) invalid(0) evasion(11.1%)
Hash(10.5%, qs 2.8%, p 98.0%) matOWrite( 82.85) draw(0) null(6.6% / 32.5%, 0.20%, 0.00%)
Pvs-zero/re(71.46% / 0.43%) ext(31.07%) mat-prune/qs(1.31% / 0.28%) lmr(99.60% / 3.18%)
Root resrc(22.92%) see(5.19%)
EV (359.68%) lazy(62.16%) fut(46.30%) fl(7.97%) nom(7.90%)
23 reply f1e1
allocate time, node-mask 0x1fff
num move 29
bestmove h7h5
23 h7h5 ( -319) depth( 7) pvL(10) ply(21) nps( 427317) pc(26) cttime(83) ctpoll(1)
sec(0.46, 1.33) nodes(567478) q(15.6%) h(53.0%) f(31.4%) FH(97.2%) invalid(0) evasion(8.3%)
Hash(8.2%, qs 2.9%, p 98.1%) matOWrite( 80.48) draw(0) null(5.9% / 24.3%, 0.59%, 0.00%)
Pvs-zero/re(70.70% / 0.71%) ext(25.20%) mat-prune/qs(2.35% / 0.35%) lmr(96.35% / 4.04%)
Root resrc(17.39%) see(3.03%)
EV (305.26%) lazy(50.42%) fut(37.20%) fl(9.09%) nom(4.14%)
24 reply e1e4
allocate time, node-mask 0x1fff
num move 28
bestmove h5h4
24 h5h4 ( -279) depth( 7) pvL( 7) ply(17) nps( 468258) pc(26) cttime(46) ctpoll(0)
sec(0.44, 0.55) nodes(255201) q(23.7%) h(57.9%) f(18.4%) FH(128.3%) invalid(0) evasion(7.0%)
Hash(10.5%, qs 3.1%, p 98.9%) matOWrite( 82.03) draw(0) null(8.7% / 30.7%, 0.02%, 0.00%)
Pvs-zero/re(81.07% / 0.91%) ext(9.07%) mat-prune/qs(3.59% / 0.18%) lmr(225.67% / 1.84%)
Root resrc(34.04%) see(3.70%)
EV (247.30%) lazy(62.58%) fut(49.28%) fl(10.18%) nom(3.13%)
25 reply e4f4
allocate time, node-mask 0x1fff
num move 28
bestmove h4g3
25 h4g3 ( -277) depth( 7) pvL(13) ply(22) nps( 490598) pc(25) cttime(136) ctpoll(1)
sec(0.41, 2.04) nodes(999840) q(15.3%) h(53.1%) f(31.6%) FH(90.4%) invalid(0) evasion(14.9%)
Hash(6.4%, qs 1.9%, p 98.0%) matOWrite( 87.97) draw(0) null(7.4% / 31.6%, 0.99%, 0.00%)
Pvs-zero/re(70.48% / 0.26%) ext(32.37%) mat-prune/qs(3.42% / 0.21%) lmr(107.09% / 2.56%)
Root resrc(33.33%) see(4.21%)
EV (278.32%) lazy(63.35%) fut(47.05%) fl(9.31%) nom(6.98%)
26 reply f2g3
allocate time, node-mask 0x1fff
num move 27
bestmove b6c7
26 b6c7 ( -306) depth( 8) pvL( 8) ply(21) nps( 780501) pc(24) cttime(48) ctpoll(0)
sec(0.36, 0.34) nodes(261468) q(8.3%) h(70.6%) f(21.1%) FH(83.8%) invalid(0) evasion(19.1%)
Hash(5.6%, qs 0.6%, p 98.9%) matOWrite( 94.33) draw(0) null(9.0% / 13.3%, 0.08%, 0.00%)
Pvs-zero/re(79.55% / 0.24%) ext(45.52%) mat-prune/qs(5.21% / 0.30%) lmr(282.80% / 0.91%)
Root resrc(72.00%) see(1.25%)
EV (215.40%) lazy(89.14%) fut(76.32%) fl(8.32%) nom(4.50%)
27 reply f3g4
allocate time, node-mask 0x3fff
num move 26
bestmove f8h8
27 f8h8 ( -289) depth( 6) pvL( 9) ply(19) nps( 408142) pc(24) cttime(26) ctpoll(0)
sec(0.36, 0.56) nodes(229376) q(13.6%) h(53.4%) f(33.0%) FH(87.9%) invalid(0) evasion(9.2%)
Hash(8.5%, qs 2.5%, p 99.1%) matOWrite( 88.46) draw(0) null(7.8% / 38.1%, 0.02%, 0.00%)
Pvs-zero/re(71.77% / 0.57%) ext(27.00%) mat-prune/qs(1.34% / 0.04%) lmr(102.38% / 1.70%)
Root resrc(25.00%) see(5.87%)
EV (372.83%) lazy(63.31%) fut(47.58%) fl(7.95%) nom(7.78%)
28 reply f4f2
allocate time, node-mask 0x1fff
num move 34
bestmove e8f8
28 e8f8 ( -471) depth( 7) pvL( 8) ply(22) nps( 576131) pc(24) cttime(36) ctpoll(0)
sec(0.35, 0.30) nodes(175144) q(12.2%) h(55.8%) f(32.0%) FH(88.6%) invalid(0) evasion(20.6%)
Hash(5.6%, qs 1.1%, p 98.9%) matOWrite( 89.15) draw(0) null(5.8% / 12.5%, 0.80%, 0.00%)
Pvs-zero/re(69.10% / 0.28%) ext(37.11%) mat-prune/qs(9.01% / 0.70%) lmr(112.52% / 2.63%)
Root resrc(41.67%) see(2.23%)
EV (274.00%) lazy(79.37%) fut(58.42%) fl(9.67%) nom(11.28%)
29 reply g4g6
allocate time, node-mask 0x1fff
num move 32
Opponent followPV, score(-471) bestmove(e7c5)
bestmove e7c5
29 e7c5 ( -503) depth( 8) pvL(10) ply(18) nps( 553777) pc(22) cttime(35) ctpoll(0)
sec(0.37, 0.27) nodes(149520) q(9.5%) h(59.0%) f(31.5%) FH(79.5%) invalid(0) evasion(24.4%)
Hash(12.8%, qs 2.8%, p 99.5%) matOWrite( 61.06) draw(0) null(5.7% / 15.4%, 0.11%, 0.00%)
Pvs-zero/re(71.60% / 0.50%) ext(33.52%) mat-prune/qs(10.33% / 0.61%) lmr(138.53% / 2.06%)
Root resrc(4.17%) see(2.49%)
EV (288.61%) lazy(75.95%) fut(63.08%) fl(10.52%) nom(2.35%)
30 reply b4c5
allocate time, node-mask 0x1fff
num move 29
bestmove c7e7
30 c7e7 ( -569) depth( 8) pvL( 7) ply(21) nps( 677481) pc(21) cttime(84) ctpoll(0)
sec(0.36, 0.83) nodes(563665) q(11.6%) h(61.2%) f(27.2%) FH(90.9%) invalid(0) evasion(27.3%)
Hash(6.5%, qs 1.4%, p 99.4%) matOWrite( 87.62) draw(0) null(7.7% / 11.5%, 0.48%, 0.03%)
Pvs-zero/re(70.95% / 0.37%) ext(38.28%) mat-prune/qs(9.32% / 0.98%) lmr(162.11% / 2.06%)
Root resrc(58.33%) see(0.97%)
EV (260.65%) lazy(87.57%) fut(72.19%) fl(12.21%) nom(3.16%)
31 reply a1a7
allocate time, node-mask 0x1fff
num move 28
bestmove e7a7
31 e7a7 ( -527) depth( 8) pvL(12) ply(22) nps( 574297) pc(19) cttime(77) ctpoll(0)
sec(0.35, 0.88) nodes(503659) q(11.7%) h(60.7%) f(27.6%) FH(95.1%) invalid(0) evasion(18.7%)
Hash(7.3%, qs 3.3%, p 99.7%) matOWrite( 84.23) draw(0) null(7.4% / 19.8%, 1.35%, 0.00%)
Pvs-zero/re(71.09% / 0.70%) ext(26.92%) mat-prune/qs(5.80% / 0.59%) lmr(154.07% / 7.11%)
Root resrc(13.33%) see(5.68%)
EV (236.67%) lazy(70.12%) fut(51.15%) fl(11.85%) nom(7.12%)
32 reply g6f6
allocate time, node-mask 0x1fff
num move 31
Opponent followPV, score(-527) bestmove(h8g8)
!!!HASH ERROR ttmove
pc 0, from 40, to 45, f1f6q
bestmove h8g8
32 h8g8 (-1031) depth(10) pvL(10) ply(25) nps( 898721) pc(19) cttime(52) ctpoll(0)
sec(0.31, 0.29) nodes(257933) q(7.4%) h(63.7%) f(28.9%) FH(77.6%) invalid(0) evasion(34.8%)
Hash(5.9%, qs 1.7%, p 99.4%) matOWrite( 77.89) draw(0) null(10.2% / 12.5%, 0.01%, 0.00%)
Pvs-zero/re(70.64% / 0.06%) ext(38.03%) mat-prune/qs(8.86% / 2.08%) lmr(174.87% / 0.04%)
Root resrc(9.68%) see(0.25%)
EV (218.65%) lazy(99.51%) fut(82.78%) fl(14.99%) nom(1.74%)
33 reply f6d8
allocate time, node-mask 0x3fff
num move 1
single move
bestmove f8g7
33 f8g7 ( -400) depth(10) pvL( 1) ply( 0) nps( 898721) pc(18) cttime(53) ctpoll(0)
sec(0.35, 0.00) nodes(257933) q(7.4%) h(63.7%) f(28.9%) FH(77.6%) invalid(0) evasion(34.8%)
Hash(5.9%, qs 1.7%, p 99.4%) matOWrite( 77.89) draw(0) null(10.2% / 12.5%, 0.01%, 0.00%)
Pvs-zero/re(70.64% / 0.06%) ext(38.03%) mat-prune/qs(8.86% / 2.08%) lmr(174.87% / 0.04%)
Root resrc(9.68%) see(0.25%)
EV (218.66%) lazy(99.51%) fut(82.78%) fl(14.99%) nom(1.74%)
34 reply d8h4
allocate time, node-mask 0x1fff
num move 25
bestmove a7c7
34 a7c7 ( -528) depth( 6) pvL( 8) ply(18) nps( 705185) pc(18) cttime(41) ctpoll(0)
sec(0.27, 0.34) nodes(236237) q(17.3%) h(51.1%) f(31.6%) FH(102.1%) invalid(0) evasion(26.8%)
Hash(7.8%, qs 2.5%, p 99.6%) matOWrite( 85.44) draw(0) null(3.8% / 12.5%, 0.04%, 0.00%)
Pvs-zero/re(65.49% / 0.66%) ext(33.66%) mat-prune/qs(3.68% / 0.25%) lmr(87.09% / 5.50%)
Root resrc(20.73%) see(4.69%)
EV (242.78%) lazy(85.91%) fut(45.82%) fl(12.16%) nom(27.92%)
35 reply g1g2
allocate time, node-mask 0x1fff
num move 21
bestmove g7f8
35 g7f8 ( -530) depth( 7) pvL( 9) ply(18) nps( 706349) pc(18) cttime(48) ctpoll(0)
sec(0.28, 0.39) nodes(274770) q(14.3%) h(53.0%) f(32.7%) FH(96.6%) invalid(0) evasion(22.8%)
Hash(10.2%, qs 4.5%, p 99.8%) matOWrite( 79.20) draw(0) null(4.6% / 10.4%, 0.12%, 0.00%)
Pvs-zero/re(65.07% / 1.32%) ext(22.83%) mat-prune/qs(2.69% / 0.47%) lmr(86.65% / 6.56%)
Root resrc(11.34%) see(4.19%)
EV (232.98%) lazy(82.74%) fut(35.19%) fl(10.85%) nom(36.71%)
36 reply h4h6
allocate time, node-mask 0x1fff
num move 3
bestmove f8e8
36 f8e8 ( -538) depth( 7) pvL( 5) ply(21) nps( 637360) pc(18) cttime(56) ctpoll(0)
sec(0.27, 0.55) nodes(349911) q(15.9%) h(47.3%) f(36.8%) FH(91.7%) invalid(0) evasion(22.6%)
Hash(11.4%, qs 4.3%, p 99.7%) matOWrite( 69.91) draw(0) null(4.8% / 10.5%, 0.03%, 0.00%)
Pvs-zero/re(62.88% / 0.73%) ext(27.60%) mat-prune/qs(4.22% / 0.09%) lmr(61.67% / 4.99%)
Root resrc(15.00%) see(2.99%)
EV (253.16%) lazy(92.99%) fut(41.05%) fl(12.32%) nom(39.62%)
37 reply h6h7
allocate time, node-mask 0x1fff
num move 26
bestmove g8g4
37 g8g4 ( -612) depth( 8) pvL(13) ply(19) nps( 728736) pc(18) cttime(47) ctpoll(0)
sec(0.26, 0.34) nodes(249228) q(17.7%) h(50.2%) f(32.1%) FH(96.1%) invalid(0) evasion(24.9%)
Hash(12.3%, qs 4.0%, p 99.8%) matOWrite( 73.50) draw(0) null(5.9% / 13.0%, 1.65%, 0.00%)
Pvs-zero/re(66.12% / 0.74%) ext(28.67%) mat-prune/qs(15.70% / 0.50%) lmr(91.65% / 4.15%)
Root resrc(14.29%) see(3.16%)
EV (249.74%) lazy(90.86%) fut(45.74%) fl(12.08%) nom(33.04%)
38 reply h2h3
allocate time, node-mask 0x1fff
num move 28
bestmove g4g6
38 g4g6 ( -693) depth( 9) pvL(11) ply(25) nps( 841782) pc(18) cttime(89) ctpoll(0)
sec(0.27, 0.70) nodes(588406) q(15.9%) h(50.5%) f(33.6%) FH(91.3%) invalid(0) evasion(25.9%)
Hash(9.0%, qs 3.0%, p 99.4%) matOWrite( 81.62) draw(0) null(7.4% / 11.6%, 0.53%, 0.00%)
Pvs-zero/re(65.78% / 0.30%) ext(33.35%) mat-prune/qs(8.49% / 0.64%) lmr(90.54% / 2.27%)
Root resrc(42.86%) see(1.96%)
EV (241.18%) lazy(95.44%) fut(50.80%) fl(13.17%) nom(31.48%)
39 reply h7h8
allocate time, node-mask 0x1fff
num move 3
single move
bestmove e8e7
39 e8e7 ( -576) depth( 2) pvL( 1) ply( 9) nps( 841782) pc(18) cttime(4) ctpoll(0)
sec(0.26, 0.00) nodes(364) q(37.4%) h(34.6%) f(28.0%) FH(130.4%) invalid(0) evasion(25.2%)
Hash(39.8%, qs 34.0%, p 100.0%) matOWrite( 56.00) draw(0) null(0.0% / nan%, nan%, nan%)
Pvs-zero/re(59.34% / 6.94%) ext(8.82%) mat-prune/qs(0.00% / 6.11%) lmr(0.00% / nan%)
Root resrc(33.33%) see(4.58%)
EV (204.20%) lazy(96.07%) fut(22.06%) fl(16.26%) nom(57.76%)
40 reply c3a5
allocate time, node-mask 0x1fff
num move 22
bestmove c7d7
40 c7d7 (-1242) depth( 9) pvL(11) ply(25) nps( 956218) pc(18) cttime(97) ctpoll(0)
sec(0.24, 0.68) nodes(652141) q(14.5%) h(54.8%) f(30.6%) FH(91.2%) invalid(0) evasion(40.8%)
Hash(5.8%, qs 2.5%, p 99.4%) matOWrite( 93.47) draw(0) null(6.8% / 6.2%, 0.00%, 0.00%)
Pvs-zero/re(66.65% / 0.11%) ext(38.14%) mat-prune/qs(23.66% / 3.73%) lmr(116.16% / 0.04%)
Root resrc(68.97%) see(0.09%)
EV (203.46%) lazy(99.97%) fut(72.19%) fl(21.86%) nom(5.92%)
41 reply a5d8
allocate time, node-mask 0x3fff
num move 1
single move
bestmove d7d8
41 d7d8 ( -100) depth( 9) pvL( 1) ply( 0) nps( 956218) pc(17) cttime(98) ctpoll(0)
sec(0.27, 0.00) nodes(652141) q(14.5%) h(54.8%) f(30.6%) FH(91.2%) invalid(0) evasion(40.8%)
Hash(5.8%, qs 2.5%, p 99.4%) matOWrite( 93.47) draw(0) null(6.8% / 6.2%, 0.00%, 0.00%)
Pvs-zero/re(66.65% / 0.11%) ext(38.14%) mat-prune/qs(23.66% / 3.73%) lmr(116.16% / 0.04%)
Root resrc(68.97%) see(0.09%)
EV (203.46%) lazy(99.97%) fut(72.19%) fl(21.86%) nom(5.92%)
42 reply f2f7
allocate time, node-mask 0x1fff
num move 1
single move
bestmove e7f7
42 e7f7 ( 300) depth( 9) pvL( 1) ply( 0) nps( 956218) pc(15) cttime(99) ctpoll(0)
sec(0.17, 0.00) nodes(652141) q(14.5%) h(54.8%) f(30.6%) FH(91.2%) invalid(0) evasion(40.8%)
Hash(5.8%, qs 2.5%, p 99.4%) matOWrite( 93.47) draw(0) null(6.8% / 6.2%, 0.00%, 0.00%)
Pvs-zero/re(66.65% / 0.11%) ext(38.14%) mat-prune/qs(23.66% / 3.73%) lmr(116.16% / 0.04%)
Root resrc(68.97%) see(0.09%)
EV (203.46%) lazy(99.97%) fut(72.19%) fl(21.86%) nom(5.92%)
43 reply h8d8
allocate time, node-mask 0xfff
num move 11
bestmove f7g7
43 f7g7 (-1838) depth( 7) pvL( 5) ply(15) nps( 717691) pc(14) cttime(26) ctpoll(0)
sec(0.08, 0.07) nodes(48803) q(15.8%) h(50.9%) f(33.4%) FH(94.9%) invalid(0) evasion(42.0%)
Hash(10.8%, qs 7.2%, p 99.7%) matOWrite( 82.10) draw(0) null(6.6% / 14.3%, 0.00%, 0.00%)
Pvs-zero/re(62.15% / 0.89%) ext(39.37%) mat-prune/qs(19.05% / 10.80%) lmr(77.73% / 0.17%)
Root resrc(51.72%) see(0.01%)
EV (182.20%) lazy(100.00%) fut(64.70%) fl(34.47%) nom(0.83%)
44 reply d8c8
allocate time, node-mask 0x1fff
num move 8
bestmove g6g5
44 g6g5 (-2273) depth(10) pvL(11) ply(23) nps( 942348) pc(13) cttime(43) ctpoll(0)
sec(0.24, 0.19) nodes(180931) q(9.0%) h(61.9%) f(29.1%) FH(77.7%) invalid(0) evasion(37.4%)
Hash(13.6%, qs 5.6%, p 99.2%) matOWrite( 82.29) draw(0) null(4.6% / 14.3%, 0.00%, 0.00%)
Pvs-zero/re(70.16% / 1.08%) ext(9.05%) mat-prune/qs(17.68% / 8.33%) lmr(163.00% / 0.31%)
Root resrc(52.94%) see(0.03%)
EV (146.15%) lazy(100.00%) fut(69.59%) fl(29.85%) nom(0.55%)
45 reply c8e6
allocate time, node-mask 0x1fff
num move 9
!!!HASH ERROR ttmove
pc 0, from 11, to 6, b4a7q
bestmove g5g6
45 g5g6 (-2022) depth( 9) pvL( 6) ply(21) nps( 885385) pc(12) cttime(56) ctpoll(0)
sec(0.26, 0.35) nodes(309885) q(13.6%) h(56.4%) f(30.1%) FH(95.4%) invalid(0) evasion(38.9%)
Hash(17.4%, qs 9.1%, p 99.3%) matOWrite( 67.07) draw(0) null(4.4% / 8.5%, 0.00%, 0.00%)
Pvs-zero/re(66.08% / 0.42%) ext(27.05%) mat-prune/qs(5.31% / 7.00%) lmr(120.43% / 0.37%)
Root resrc(50.98%) see(0.11%)
EV (175.04%) lazy(100.00%) fut(72.72%) fl(26.77%) nom(0.51%)
46 reply e6d7
allocate time, node-mask 0x1fff
num move 4
!!!HASH ERROR ttmove
pc 0, from 11, to 6, b4a7q
!!!HASH ERROR ttmove
pc 0, from 11, to 6, b4a7q
!!!HASH ERROR ttmove
pc 0, from 11, to 6, b4a7q
bestmove g7h8
46 g7h8 (-1947) depth( 8) pvL( 6) ply(23) nps( 781869) pc(12) cttime(38) ctpoll(0)
sec(0.24, 0.23) nodes(179830) q(11.2%) h(53.8%) f(35.0%) FH(86.8%) invalid(0) evasion(38.2%)
Hash(17.8%, qs 11.2%, p 99.7%) matOWrite( 62.39) draw(0) null(4.1% / 7.0%, 0.00%, 0.00%)
Pvs-zero/re(64.73% / 0.11%) ext(44.42%) mat-prune/qs(3.84% / 6.39%) lmr(94.22% / 0.38%)
Root resrc(31.25%) see(0.97%)
EV (202.29%) lazy(100.00%) fut(71.96%) fl(25.61%) nom(2.43%)
47 reply e5e6
allocate time, node-mask 0x1fff
num move 9
!!!HASH ERROR ttmove
pc 0, from 36, to 17, e5c2q
!!!HASH ERROR ttmove
pc 0, from 36, to 17, e5c2q
bestmove g6g8
47 g6g8 (-2339) depth( 8) pvL( 8) ply(27) nps( 951392) pc(12) cttime(54) ctpoll(0)
sec(0.24, 0.33) nodes(310154) q(20.7%) h(48.5%) f(30.8%) FH(91.9%) invalid(0) evasion(41.2%)
Hash(15.9%, qs 8.3%, p 99.8%) matOWrite( 72.43) draw(0) null(6.8% / 6.7%, 0.00%, 0.00%)
Pvs-zero/re(65.37% / 0.23%) ext(26.86%) mat-prune/qs(8.17% / 14.01%) lmr(89.62% / 0.31%)
Root resrc(70.97%) see(1.91%)
EV (159.54%) lazy(100.00%) fut(61.93%) fl(34.84%) nom(3.23%)
48 reply e6e7
allocate time, node-mask 0x1fff
num move 13
Opponent followPV, score(-2339) bestmove(g8b8)
bestmove g8b8
48 g8b8 (-2795) depth(10) pvL( 2) ply(27) nps( 1020147) pc(12) cttime(96) ctpoll(0)
sec(0.23, 0.61) nodes(627391) q(12.2%) h(53.5%) f(34.3%) FH(85.0%) invalid(0) evasion(43.6%)
Hash(19.0%, qs 9.2%, p 99.9%) matOWrite( 76.63) draw(0) null(5.0% / 10.7%, 0.00%, 0.00%)
Pvs-zero/re(65.83% / 0.44%) ext(41.91%) mat-prune/qs(3.90% / 7.01%) lmr(100.52% / 0.26%)
Root resrc(37.78%) see(1.24%)
EV (175.30%) lazy(100.00%) fut(70.55%) fl(29.04%) nom(0.42%)
49 reply e7e8n
allocate time, node-mask 0x1fff
num move 10
single move
bestmove b8e8
49 b8e8 (-2595) depth( 4) pvL( 1) ply( 9) nps( 1020147) pc(11) cttime(8) ctpoll(0)
sec(0.19, 0.00) nodes(2781) q(4.9%) h(51.4%) f(43.7%) FH(86.6%) invalid(0) evasion(38.3%)
Hash(13.0%, qs 19.9%, p 100.0%) matOWrite( 76.21) draw(0) null(2.6% / 6.2%, 0.00%, 0.00%)
Pvs-zero/re(55.70% / 1.74%) ext(70.86%) mat-prune/qs(4.44% / 2.11%) lmr(42.55% / 4.84%)
Root resrc(30.77%) see(0.00%)
EV (262.32%) lazy(100.00%) fut(71.23%) fl(26.63%) nom(2.14%)
50 reply d7e8
allocate time, node-mask 0x1fff
num move 2
!!!HASH ERROR ttmove
pc 0, from 0, to 0, a1a1
bestmove h8g7
50 h8g7 (-3193) depth( 9) pvL( 2) ply(23) nps( 880644) pc(10) cttime(45) ctpoll(0)
sec(0.18, 0.24) nodes(213116) q(9.9%) h(59.7%) f(30.5%) FH(75.8%) invalid(0) evasion(41.2%)
Hash(30.6%, qs 12.5%, p 99.4%) matOWrite( 64.54) draw(0) null(0.0% / nan%, nan%, nan%)
Pvs-zero/re(69.92% / 2.59%) ext(8.33%) mat-prune/qs(8.01% / 10.06%) lmr(162.40% / 0.67%)
Root resrc(72.22%) see(0.03%)
EV (146.85%) lazy(100.00%) fut(71.45%) fl(28.55%) nom(0.00%)
51 reply b3b4
allocate time, node-mask 0x1fff
num move 3
bestmove g7f6
51 g7f6 (-3293) depth( 8) pvL( 8) ply(21) nps( 895819) pc(10) cttime(43) ctpoll(0)
sec(0.18, 0.24) nodes(218580) q(5.6%) h(60.5%) f(33.9%) FH(75.6%) invalid(0) evasion(39.2%)
Hash(25.9%, qs 11.2%, p 99.6%) matOWrite( 43.53) draw(0) null(0.0% / nan%, nan%, nan%)
Pvs-zero/re(70.65% / 0.32%) ext(42.44%) mat-prune/qs(0.00% / 3.95%) lmr(139.15% / 0.19%)
Root resrc(50.00%) see(0.03%)
EV (173.02%) lazy(100.00%) fut(76.00%) fl(23.86%) nom(0.14%)
52 reply e8c6
allocate time, node-mask 0x1fff
num move 5
bestmove f6f7
52 f6f7 (-3493) depth( 8) pvL( 4) ply(21) nps( 817523) pc(9) cttime(36) ctpoll(0)
sec(0.17, 0.20) nodes(159417) q(18.1%) h(53.2%) f(28.7%) FH(85.8%) invalid(0) evasion(41.5%)
Hash(27.7%, qs 15.7%, p 99.6%) matOWrite( 63.49) draw(0) null(0.0% / nan%, nan%, nan%)
Pvs-zero/re(69.67% / 1.99%) ext(7.44%) mat-prune/qs(0.00% / 18.99%) lmr(134.75% / 1.09%)
Root resrc(60.00%) see(0.02%)
EV (151.37%) lazy(100.00%) fut(67.91%) fl(31.22%) nom(0.87%)
53 reply b4b5
allocate time, node-mask 0x1fff
num move 4
bestmove f7g8
53 f7g8 (-7990) depth( 8) pvL( 1) ply(19) nps( 761637) pc(9) cttime(27) ctpoll(0)
sec(0.17, 0.12) nodes(94443) q(10.9%) h(61.9%) f(27.2%) FH(104.1%) invalid(0) evasion(39.1%)
Hash(25.9%, qs 14.4%, p 99.7%) matOWrite( 46.35) draw(0) null(0.0% / nan%, nan%, nan%)
Pvs-zero/re(68.42% / 0.61%) ext(21.66%) mat-prune/qs(0.46% / 0.86%) lmr(154.77% / 0.53%)
Root resrc(37.04%) see(0.29%)
EV (161.29%) lazy(100.00%) fut(76.49%) fl(23.46%) nom(0.05%)
54 reply c6d7
allocate time, node-mask 0x1fff
num move 2
bestmove g8h8
54 g8h8 (-7990) depth( 2) pvL( 1) ply( 5) nps( 761637) pc(9) cttime(4) ctpoll(0)
sec(0.18, 0.00) nodes(129) q(32.6%) h(45.0%) f(22.5%) FH(203.4%) invalid(0) evasion(42.8%)
Hash(43.3%, qs 60.0%, p 100.0%) matOWrite( 60.00) draw(0) null(0.0% / nan%, nan%, nan%)
Pvs-zero/re(42.64% / 10.91%) ext(24.14%) mat-prune/qs(0.00% / 0.00%) lmr(0.00% / nan%)
Root resrc(25.00%) see(0.00%)
EV (156.00%) lazy(100.00%) fut(73.08%) fl(25.00%) nom(1.92%)
55 reply b5b6
allocate time, node-mask 0x1fff
num move 1
single move
bestmove h8g8
55 h8g8 (-1500) depth( 2) pvL( 1) ply( 0) nps( 761637) pc(9) cttime(5) ctpoll(0)
sec(0.19, 0.00) nodes(129) q(32.6%) h(45.0%) f(22.5%) FH(203.4%) invalid(0) evasion(42.3%)
Hash(43.3%, qs 60.0%, p 100.0%) matOWrite( 60.00) draw(0) null(0.0% / nan%, nan%, nan%)
Pvs-zero/re(42.64% / 10.91%) ext(24.14%) mat-prune/qs(0.00% / 0.00%) lmr(0.00% / nan%)
Root resrc(25.00%) see(0.00%)
EV (158.00%) lazy(100.00%) fut(72.15%) fl(24.68%) nom(3.16%)
56 reply b6b7
allocate time, node-mask 0x1fff
num move 2
bestmove g8h8
56 g8h8 (-7998) depth(-1) pvL( 1) ply( 0) nps( 761637) pc(9) cttime(1) ctpoll(0)
sec(0.20, 0.00) nodes(0) q(nan%) h(nan%) f(nan%) FH(nan%) invalid(0) evasion(0.0%)
Hash(100.0%, qs nan%, p 100.0%) matOWrite( nan) draw(0) null(nan% / nan%, nan%, nan%)
Pvs-zero/re(nan% / nan%) ext(nan%) mat-prune/qs(nan% / nan%) lmr(nan% / nan%)
Root resrc(nan%) see(nan%)
EV (inf%) lazy(100.00%) fut(0.00%) fl(0.00%) nom(100.00%)
Chan Rasjid
Posts: 588
Joined: Thu Mar 09, 2006 4:47 pm
Location: Singapore

Re: Help - can't clear bug with tt-move.

Post by Chan Rasjid »

bob wrote:Some questions.

(1) is this a single-thread search? A SMP search can easily do this if care is not taken to prevent two threads from modifying the same hash entry at the same time.

(2) a bounds-checker might help if you store into another array either right before or right after the hash table memory, so that a bad subscript will stuff something into the table and overwrite good data with bad.

(3) I assume you have some sort of move "verification" that tests the best move each time you retrieve a hash entry? Just for fun, what about doing that same verification process when you store any best move, just to be sure that this is something that is getting corrupted after it is stored, rather than during the store.
1) Single Thread.
2) I''ll soon see into bad subscripts; I made changes on computing hashkey after reading a recent post by Cleveland about storing entries in same bucket when only side-to-move differs.
3) I have "verified" independent verification on store and retrieve.

But why debug mode all clear with many games !

Best Regards,
Rasjid.
Chan Rasjid
Posts: 588
Joined: Thu Mar 09, 2006 4:47 pm
Location: Singapore

Re: Help - can't clear bug with tt-move.

Post by Chan Rasjid »

bob wrote: ...
Another idea. What about the very end of the table? When I did my new "hash path" idea, I used buckets of size 8. But cleverly forgot that if you probe into a table of size 2^N entries, you need 2^N+7 entries to take care of the hash probe to that last entry + the next 7. Did you get the malloc() size corrected for the extra bucket entries? Or if you are going in a negative direction, can you every probe at entry 0 plus the 3 before it? Either way leads to trouble, obviously...
I always remember this somehow :D

I malloc(size +128) which covers 8 extra entries.

I loop through the bucket backwards but tests pointer-to-entry >= 1st-entry. So should be ok.

Rasjid.