sounds like you might be fine then, but to point out the relavence of his comment in relation to qnodes and hashing and percentage of search nodes, you hash every time a qnode is called, in fact from my counters teh greatest number of hash hits are comming at depth 0 or the first call, which taking bobs suggestion of hashing before evaluating, saves me some evaluate work, but because qnodes are such a large number, at least 60% of all search nodes typically, there can be a complaint if you are not careful, that you are filling up your hash table with end nodes and possibly eraseing earier nodes that would do more work for you if they were allowed to create cuttofs.
Outside of hashing i dont know of any qnode counting method that is better or worse except as you have realized, to be able to speak comparitively with others
That sounds a bit dangerous. What about capturing one side's last pawn? That could easily change a score from losing to a drawish ending. I think a lot of people miss these things in qsearch. Something like a "losing" BxP could really change the score a lot.
You must not be counting them correctly. Most likely you are counting the first level q-search nodes as normal nodes. Otherwise for every frontier node, you must call qsearch which produces a q-search node.
well pulsar is not sophisticated enough to keep track of draws right now so its not an issue. But there is no reason to think it wouldnt play the move. i would give it the current evaluate score, plus the full value of the pawn with no recapture in the test i outlined. If that wasnt enough to improve alpha, particularly when alpha is deprecated to alpha -50, it must feel it can win more material in other lines.
The problem i have when i'm generous in what i search in qsearch, is it really slows the program down. It may pay off on select moves but i figure overall it kills me. If i just do all captures then qsearch nodes go up to 80% of search and i might get almost one less depth on average. Special cases arent worth giving up a depth.
I figure qsearch is the search of last resort. I rely on it to correct errors in search, i.e. a false sense that it can stand pat after search and call it a day. but overall i want my search to happen in search not qsearch, as qsearch, not playing 80% or more of the moves, is not going to be a subsitute for regular search.
jdart wrote:
That said, I have for many years kept a small eval cache that holds recent full evaluations (it doesn't hold evals that are cut off early by futility checking in the eval code). The call to evaluate() checks the cache and returns the cached value if it is there. Depth doesn't matter for this: either the value exists in the cache or it doesn't and if does it is valid.
--Jon
Hi Jon,
Can you give some statistics about the effectiveness of the eval cache, such as number of entries and hit rate?
jdart wrote:
That said, I have for many years kept a small eval cache that holds recent full evaluations (it doesn't hold evals that are cut off early by futility checking in the eval code). The call to evaluate() checks the cache and returns the cached value if it is there. Depth doesn't matter for this: either the value exists in the cache or it doesn't and if does it is valid.
--Jon
Hi Jon,
Can you give some statistics about the effectiveness of the eval cache, such as number of entries and hit rate?
Thanks,
Jan
A sample output from Critter after 14 ply search in position WAC.196:
jdart wrote:
That said, I have for many years kept a small eval cache that holds recent full evaluations (it doesn't hold evals that are cut off early by futility checking in the eval code). The call to evaluate() checks the cache and returns the cached value if it is there. Depth doesn't matter for this: either the value exists in the cache or it doesn't and if does it is valid.
--Jon
Hi Jon,
Can you give some statistics about the effectiveness of the eval cache, such as number of entries and hit rate?
Thanks,
Jan
A sample output from Critter after 14 ply search in position WAC.196: