]> git.sesse.net Git - stockfish/log
10 years agoSimplify a condition in search()
Marco Costalba [Sun, 13 Jan 2013 11:34:31 +0000 (12:34 +0100)]
Simplify a condition in search()

And rearrange best value update in case of SpNode.

No functional change.

10 years agoClarify SAN disambiguation in case of a pinned piece
Marco Costalba [Sat, 12 Jan 2013 12:19:06 +0000 (13:19 +0100)]
Clarify SAN disambiguation in case of a pinned piece

In SAN notation when two pieces of the same type can
move to a given destination square, a disambiguation
additional info (like starting file) shall be added
to the SAN move.

If one of the two pieces is pinned, the corresponding
move _could_ be illegal and in this case disambiguation
is not needed. But to be pinned alone it is not enough
to deduce that the move is illegal, for instance in this

R3rk2/2r6/8/8/8/8/8/K7 b - - 0 1

The move Rc8 is ambiguous although the rook in e8 is pinned
and the correct SAN notation should be Rcc8.

No functional change.

10 years agoAsync 'stop' command
Marco Costalba [Sun, 6 Jan 2013 11:49:01 +0000 (12:49 +0100)]
Async 'stop' command

Don't wait for the search to finish after a 'stop'
command, but keep processing the GUI input if any.

Also explicitly wake up the main thread (that could be
sleeping) after a 'stop' or 'quit' command and do not
rely on wait_for_search_finished() doing it for us.

This patch cleans up the code and functions's definitions,
but it is risky and needs a good test under different
conditions to be sure it does not introduces hungs up.

No functional change.

10 years agoRevert so called "fromNull patch"
Marco Costalba [Sun, 6 Jan 2013 21:55:35 +0000 (22:55 +0100)]
Revert so called "fromNull patch"

Revert patch c581b7ea3627482

Seems a regression after testing from Gary:
ELO: 7.24 +- 99%: 17.03 95%: 12.93
LOS: 97.86%
Wins: 439 Losses: 381 Draws: 1962

And mine:
After 5410 games at 15"+0.05
Wins: 936 Losses: 1141 Draws: 3333  ELO -13

Moreover we know that there is a regression in the range
of patches which include the fromNull patch.

Probably this is not the only regression since 2.3.1 and
perhaps the idea under fromNull is good, but at the moment,
while in deep regression hunting, better to be on the safe
side and revert it entirely.

My guess on why this is a regression is that using the
negated evaluation of previous ply in case of null search
fails to take in account the king safety asymmetry between
the two colors. This is of course just a guess.

bench 5503830

10 years agoHave fun with union in book.cpp
Marco Costalba [Sat, 5 Jan 2013 14:24:18 +0000 (15:24 +0100)]
Have fun with union in book.cpp

Fancy way to use an union to map polyglot
zobrist keys in one go.

Also some renaming while there.

No functional change.

10 years agoRetire 'Cowardice' and 'Aggressiveness' UCI options
Marco Costalba [Fri, 4 Jan 2013 15:49:24 +0000 (16:49 +0100)]
Retire 'Cowardice' and 'Aggressiveness' UCI options

They are not self-describing and create a lot of user
requests about them.

Given that the values are already well tuned there
is no need to expose them as UCI options.

No functional change.

10 years agoRetire 'mate in x' hack
Marco Costalba [Fri, 4 Jan 2013 15:29:13 +0000 (16:29 +0100)]
Retire 'mate in x' hack

Sometimes is faster, but not always and on very long mates
produces strange scores probably due to truncation of PV

So simply perform normal search also in case of UCI 'mate x'
command, with the only difference that when a mate in x is
found search returns immediately.

No functional change.

10 years agoDon't exit if unable to find bench file
Marco Costalba [Fri, 4 Jan 2013 13:52:21 +0000 (14:52 +0100)]
Don't exit if unable to find bench file

Now that we can call 'bench' command also from
interactive terminal it makes no more sense to
exit the application if the user types a wrong
file name.

No functional change.

10 years agoTeach file_to_char() about upper/lower case
Marco Costalba [Fri, 4 Jan 2013 13:10:35 +0000 (14:10 +0100)]
Teach file_to_char() about upper/lower case

This allows to further simplify Position::fen()

No functional change.

10 years agoReformat FEN construction
Marco Costalba [Fri, 4 Jan 2013 11:32:13 +0000 (12:32 +0100)]
Reformat FEN construction

Simplify and shrink code.

No functional change.

10 years agoRemove some obsolete asserts on TT values
Marco Costalba [Mon, 31 Dec 2012 15:28:40 +0000 (16:28 +0100)]
Remove some obsolete asserts on TT values

Now that insert_pv_in_tt() stores VALUE_NONE in
TT's position evaluation those 2 asserts are

No functional change.

10 years agoAllow to pass a 'seed' to RKISS
Marco Costalba [Mon, 31 Dec 2012 10:57:49 +0000 (11:57 +0100)]
Allow to pass a 'seed' to RKISS

This somewhat simplifies the code.

Suggested by Lucas Braesch.

No functional change.

10 years agoMicro-optimization in evaluate_space()
Marco Costalba [Mon, 31 Dec 2012 10:26:12 +0000 (11:26 +0100)]
Micro-optimization in evaluate_space()

Since &-ing with SpaceMask restricts the set to the home
half of the board, it is possible to use just one popcount
instead of 2 by shifting "safe" to the other half of the
board. This gives a small speedup especially on systems
where hardware popcount is not available.

Patch kindly sent by Richard Vida.

No functional change.

10 years agoAdd 'mate' limit to 'bench' command
Marco Costalba [Sun, 30 Dec 2012 14:48:37 +0000 (15:48 +0100)]
Add 'mate' limit to 'bench' command

It is now possible to run SF on a 'mate in x' testsuite.

For instance in case of a file with fen strings of
positions with mate in 10 we can now 'bench' on it:

stockfish bench 128 1 10 mate_in_10.epd mate

No functional change.

10 years agoHandle UCI command "mate in x moves"
Marco Costalba [Sun, 30 Dec 2012 10:40:20 +0000 (11:40 +0100)]
Handle UCI command "mate in x moves"

Following a user request I added the handling of UCI:

go mate x

Currently we just return from a PV node if x moves have been
done. Probably not the best approach. I have looked at Fruit/Toga
sources and there is even simpler: engine falls back on a fixed
depth search.

No functional change.

10 years agoRevert evaluation cache
Marco Costalba [Thu, 27 Dec 2012 11:13:31 +0000 (12:13 +0100)]
Revert evaluation cache

And return on using TT as backing store for position

Tests (even on single thread) show eval cache was a regression.
In multi thread result should be even worst because eval cache
is a per-thread struct, while TT is shared.

After 4957 games at 15"+0.05 (single thread)
eval cache vs master 969 - 1093 - 2895  -9 ELO

So previous reported result of +18 ELO was probably due to an
issue in the testing framework (a bug in cutechess-cli) that
has been fixed in the meanwhile.

bench: 5386711

10 years agoAdd list of legal moves to Position::pretty()
Marco Costalba [Thu, 27 Dec 2012 10:08:20 +0000 (11:08 +0100)]
Add list of legal moves to Position::pretty()

Along the same lines of previous patch now we add
the list of the legal moves in the given position.

No functional change.

10 years agoAdd checkers info to Position::pretty()
Marco Costalba [Wed, 26 Dec 2012 17:22:56 +0000 (18:22 +0100)]
Add checkers info to Position::pretty()

In case current position is under check, list the
squares of the checker(s) pieces.

This should satisfy a specific user request.

No functional change.

10 years agoRemove two obsolete asserts in prevents_move
Marco Costalba [Wed, 26 Dec 2012 11:27:09 +0000 (12:27 +0100)]
Remove two obsolete asserts in prevents_move

Now that this function is called also to calculate
move's extensions the asserts are no more valid.

No functional change.

10 years agoRename yields_to_threat and prevents_threat
Marco Costalba [Wed, 26 Dec 2012 11:15:55 +0000 (12:15 +0100)]
Rename yields_to_threat and prevents_threat

Follow Lucas suggestions and better name these
two functions.

No functional change.

10 years agoIntroduce Null Threat extension
Marco Costalba [Mon, 24 Dec 2012 08:07:17 +0000 (09:07 +0100)]
Introduce Null Threat extension

In case of null search at low depths returns a fail low
due to a threat then, rather than return beta-1 (to cause
a re-search at full depth in the parent node), we set a flag
threatExtension = true (false by default) that will cause
moves that prevent the threat to be extended of one ply
in the following search.

Idea and patch is by Lucas Braesch.

Lucas also did the tests:
1500 games in 5"+0.05":
SF_threatExtension vs SF_20121222: 366 - 331 - 803 [51.2%] LOS=90.8%

3000 games in 10"+0.1":
SF_threatExtension vs SF_20121222: 610 - 559 - 1831 [50.8%] LOS=93.2%

Tests confirmed by Gary after 10570 games,
ELO: 2.79 +- 99%: 8.72 95%: 6.63
LOS: 94.08%
Wins: 1523 Losses: 1438 Draws: 7607

And finally by me at 15"+0.05, single thread, 3824 games
threatExtension vs master 768 - 692 - 2364  +7 ELO

bench 4918443

10 years agoFix a couple of extra spaces
Marco Costalba [Tue, 25 Dec 2012 17:48:41 +0000 (18:48 +0100)]
Fix a couple of extra spaces

No functional change.

10 years agoRetire Position::in_check()
Marco Costalba [Tue, 25 Dec 2012 16:59:35 +0000 (17:59 +0100)]
Retire Position::in_check()

It is redundant with Position::checkers()

No functional change.

10 years agoRetire Position::move_is_legal()
Marco Costalba [Tue, 25 Dec 2012 10:40:28 +0000 (11:40 +0100)]
Retire Position::move_is_legal()

Use the new contains() method of struct MoveList

No functional change.

10 years agoSmall tweak in is_pseudo_legal()
Marco Costalba [Tue, 25 Dec 2012 10:22:55 +0000 (11:22 +0100)]
Small tweak in is_pseudo_legal()

This is difficult code becuase a bug here could lead
to very subtle crashes in case of SMP games where we
have TT move corruption due to concurrent access.

Anyhow I have fully verified te code throwing at it
random moves. It shoudl work.

No functional change.

10 years agoIntroduce namespace Pawns
Marco Costalba [Sat, 22 Dec 2012 10:21:06 +0000 (11:21 +0100)]
Introduce namespace Pawns

And retire old struct PawnTable along the same lines
of previous patch.

No functional change.

10 years agoIntroduce namespace Material
Marco Costalba [Sun, 16 Dec 2012 11:00:54 +0000 (12:00 +0100)]
Introduce namespace Material

And retire old struct MaterialTable simplifying the code.

No functional change.

10 years agoDon't need to check for bestValue < beta to split
Marco Costalba [Sat, 15 Dec 2012 12:11:10 +0000 (13:11 +0100)]
Don't need to check for bestValue < beta to split

With rearrangement of fail high code this condition
is no more necessary.

Found by Jörg Oster.

No fuctional change.

10 years agoRemove an extra semicolon
Marco Costalba [Sat, 15 Dec 2012 10:20:04 +0000 (11:20 +0100)]
Remove an extra semicolon

No functional change.

10 years agoRevert store of distinct upper and lower bounds
Marco Costalba [Sat, 15 Dec 2012 10:11:38 +0000 (11:11 +0100)]
Revert store of distinct upper and lower bounds

Test by Joona prooves the new feature don't value 70 added lines of code.

Grand totals after 10040 games (crashes: 0) for tt_both

master_9edc7 - 6a93488_6a934: 1756 - 1688 - 6596 ELO +2 (+- 2.7)

Confirmed by test of Gary:

After 8680 games:
ELO: 0.80 +- 99%: 9.62 95%: 7.31
LOS: 65.38%
Wins: 1288 Losses: 1268 Draws: 6130

Thanks a lot to both for testing it !!!

bench 5149248

10 years agoMerge branch 'eval_cache'
Marco Costalba [Mon, 10 Dec 2012 08:22:13 +0000 (09:22 +0100)]
Merge branch 'eval_cache'

Unusually good result. Defenitly needs further verifications.

After 2160 games at 15"+0.05
Mod vs Orig 486 - 367 - 1307 ELO +19

bench: 6261882

10 years agoFix comparison with alpha, not beta
Marco Costalba [Sun, 9 Dec 2012 13:19:21 +0000 (14:19 +0100)]
Fix comparison with alpha, not beta

This silly bug seems the reason of the unsual bench

bench: 6261882

10 years agoEnsure valueLower <= valueUpper
Marco Costalba [Sun, 9 Dec 2012 12:43:04 +0000 (13:43 +0100)]
Ensure valueLower <= valueUpper

In case a TTEntry stores both an upper and a lower bound
ensure that upper bound is not smaller than lower bound.

bench 1813815

10 years agoStore distinct upper and lower bound scores
Marco Costalba [Sun, 9 Dec 2012 10:08:37 +0000 (11:08 +0100)]
Store distinct upper and lower bound scores

This is more complex than what I'd like but I
was unable to split in small chunks.

Here we add 2 slots to TTEntry (valueUpper and depthUpper)
so that sizeof(TTEntry) returns to the original 16 bytes
and we can pack exactly 4 entries in a 64 bytes cache line.

Now we save an upper bound score alongside a lower (exact)
score. The idea is to increase TT cut-offs rates becuase
there is now an higher probability for a node to use TT info.

This patch is highly experimental and probably needs further
steps as is hinted by an unrealistic bench number:

bench: 2022385

10 years agoMicro-optimize color_of()
Marco Costalba [Wed, 5 Dec 2012 10:05:32 +0000 (11:05 +0100)]
Micro-optimize color_of()

In almost all cases we already know in advance that
color_of() argument is different from NO_PIECE.

So avoid the check for NO_PIECE in color_of() and
test at caller site in the very few places where
this case could occur.

As a nice side effect, this patch fixes a (bogus)
warning under some versions of gcc.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoUpdate Readme.txt now that we support 64 threads
thaspel [Tue, 4 Dec 2012 10:29:26 +0000 (11:29 +0100)]
Update Readme.txt now that we support 64 threads

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoMerge branch 'eval_cache'
Marco Costalba [Tue, 4 Dec 2012 06:57:46 +0000 (07:57 +0100)]
Merge branch 'eval_cache'

Use an eval cache instead of TT to store node
position evaluations.

It is already an improvment and, because it frees
two TT entry slots, paves the way to extend TT to
store both upper and lower bounds.

After 4855 games, single thread, 15"+0.05
Mod vs Orig 1165 -920 - 2770 ELO +18

bench: 5149248

10 years agoIncrease MAX_THREADS to 64
Marco Costalba [Mon, 3 Dec 2012 13:13:16 +0000 (14:13 +0100)]
Increase MAX_THREADS to 64

And document why this is an hard limit. It
seems for some (lucky) people 32 threads
are not enough.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoReintroduce eval optimizaion from null search
Marco Costalba [Sat, 1 Dec 2012 17:06:29 +0000 (18:06 +0100)]
Reintroduce eval optimizaion from null search

Now that conversion to eval cache is finished
we can reintroduce this optimization.

bench: 5149248

10 years agoDon't save eval score in TT
Marco Costalba [Sat, 1 Dec 2012 14:18:08 +0000 (15:18 +0100)]
Don't save eval score in TT

This patch completes the removal of eval info
in TT table.

No functional change.

10 years agoDon't use TT just to save a node evaluation
Marco Costalba [Sat, 1 Dec 2012 14:12:18 +0000 (15:12 +0100)]
Don't use TT just to save a node evaluation

In search(), after we evalute the position, in case there
isn't any TT entry we create one with just the evaluation

This patches removes that code. The reason becuase the patch
deserves a single commit it is becuase introduces a (very small)
functional change due to the fact that the total number of
TT stores is less now and this slightly alters the TT hits
of our benchmark.

bench: 4983262

10 years agoDon't read eval from TT anymore
Marco Costalba [Sat, 1 Dec 2012 13:51:49 +0000 (14:51 +0100)]
Don't read eval from TT anymore

Rely fully on eval cache. Note that we still save eval
info to TT, this is not needed at this moment and will be
removed in future patches. We keep it so to have a "non
functional change" patch.

No functional change.

10 years agoRetire eval optimization from null search
Marco Costalba [Sat, 1 Dec 2012 13:48:13 +0000 (14:48 +0100)]
Retire eval optimization from null search

Simplify things preparing for further changes.

bench: 4983282

10 years agoAdd eval cache infrastructure
Marco Costalba [Sat, 1 Dec 2012 12:51:14 +0000 (13:51 +0100)]
Add eval cache infrastructure

With this patch series we want to introduce a per-thread
evaluation cache to store node evaluation and do not
rely anymore on the TT table for this.

This patch just introduces the infrastructure.

No functional change.

10 years agoDon't double check for move legality
Marco Costalba [Tue, 27 Nov 2012 19:05:03 +0000 (20:05 +0100)]
Don't double check for move legality

In case of a RootNode or a SpNode move has
been already checked for legality so we can
skip a redundant check.

Spotted by Frank Genot.

No functional change.

10 years agoUpdate bestValue when futility pruning
Marco Costalba [Mon, 26 Nov 2012 15:13:36 +0000 (16:13 +0100)]
Update bestValue when futility pruning

In qsearch we should update the bestValue as we do
in case of futilityValue < beta, also when pruning
moves with non-positive see.

Spotted by Lucas Braesch

Bench: 5695710

10 years agoAvoid spamming the GUI in multipv search
Marco Costalba [Sun, 18 Nov 2012 10:33:14 +0000 (11:33 +0100)]
Avoid spamming the GUI in multipv search

Send the PV lines to GUI only once at the end of the
PV search loop or just in case of long searches.

We need to sync also sending of "currmove" info to
avoid sending info on current move without first
informing the GUI on the PV line we are searching on.

No functional change.

10 years agoTriviality in move_gives_check()
Marco Costalba [Sat, 17 Nov 2012 11:57:58 +0000 (12:57 +0100)]
Triviality in move_gives_check()

It seems even a bit faster, although handling of the special
cases is not the hot path.

No functional change.

10 years agoBetter document fail-high condition
Marco Costalba [Sat, 17 Nov 2012 11:44:19 +0000 (12:44 +0100)]
Better document fail-high condition

At this point we have already verified (value > alpha)
and this implies, in case of a non-PV node, where search
window size is zero, that value >= beta.

This is not so self-evident, so document the code with
an assert condition.

No functional change.

10 years agoDon't access std::cout from Position::print()
Marco Costalba [Sun, 11 Nov 2012 12:18:10 +0000 (13:18 +0100)]
Don't access std::cout from Position::print()

Let the caller to decide where to redirect (cout or cerr) the
ASCII representation of the position. Rename the function to
reflect this.

Renamed also from_fen() and to_fen() to set() and fen() respectively.

No functional change.

10 years agoRestore old BOUND_EXACT logic in qsearch
Marco Costalba [Sun, 11 Nov 2012 10:49:02 +0000 (11:49 +0100)]
Restore old BOUND_EXACT logic in qsearch

In case a PvNode node has a static evaluation above alpha but
no available moves we want to flag the node as BOUND_EXACT,
not as BOUND_UPPER as is currently.

The behaviour was recently introduced with patch d471c49700fbe8281
of 3/10/2012

Spotted by Hongzhi Cheng.

bench: 5558464

10 years agoRevert "Don't prune discovered checks"
Marco Costalba [Sun, 11 Nov 2012 10:04:58 +0000 (11:04 +0100)]
Revert "Don't prune discovered checks"

Both Lucas re-test and Jean-Francois confirrm it
is a regression.

Here Jean-Francois's results after 3600 games :
Score of 96d3b1c92b8 vs 3b87314: 690 - 729 - 2181 [0.495] 3600
ELO: -3.86 +- 99%: 14.94 95%: 11.35
LOS: 15.03%
Wins: 690 Losses: 729 Draws: 2181 Total: 3600

Bench: 5404066

10 years agoDon't prune discovered checks
Marco Costalba [Wed, 7 Nov 2012 17:20:39 +0000 (18:20 +0100)]
Don't prune discovered checks

Don't prune and eventually extend check moves of type
DISCO_CHECK (pun intended, Lucas will understand :-) ).

Patch from Lucas Braesch that has also tested it:

Result: 879-661-2137, score=52.96%, LOS=100.00% (time 10"+0.1")

I have started a verification test right now.

bench: 6004966

10 years agoPrevious patch test results
Marco Costalba [Wed, 7 Nov 2012 17:05:45 +0000 (18:05 +0100)]
Previous patch test results

From Jean-Francois's

Final result after 5000 games :
Score of c581b7e vs a878312: 1163 - 970 - 2867 [0.519] 5000
ELO: 13.35 +- 99%: 12.71 95%: 9.65
LOS: 100.00%
Wins: 1163 Losses: 970 Draws: 2867 Total: 5000

From me

After 3266 games at 20"+0,05
Score of c581b7e vs a878312: 612 - 607 - 2047

So no regression at longer TC and perhaps a little gain at
fast TC.

10 years agoAnother attempt at evaluation shortcut
Marco Costalba [Mon, 5 Nov 2012 09:13:48 +0000 (10:13 +0100)]
Another attempt at evaluation shortcut

In this case we try a rather drastic
approach: we simply don't futility prune
in qsearch when arriving from a null move.

So we save evaluating and also save to mess
with eval margins at all because margin is used
only in futility.

Also accuracy should not be affected, actually it
improves because we don't prune anything anymore.

bench: 5404066

10 years agoTemporary revert previous patch
Marco Costalba [Mon, 5 Nov 2012 06:28:42 +0000 (07:28 +0100)]
Temporary revert previous patch

Performs well at very short TC of 40/4+0.05 (courtesy of Jean-Francois):
Wins: 2503 Losses: 2146 Draws: 5581 Total: 10230 +12 ELO

But is poor at longer TC of 20"+0.05
Wins: 321 Losses: 373 Draws: 1141 Total: 1808 -10 ELO

The patch was clearly a tradoff between speed and accuracy and
the most interesting part of it are test results that can be
commented as follows:

- A short TC is very sensible to any speed increase
- A longer TC is more sensible to accuracy and less to speed

So a patch that does not change speed is suitable to be tested at
short TC, while a speed/accuracy compromise patch is IMO better to
be tested at longer TC to verify loss of accuracy can be tolerated.

In this case the revert is only temporary. We will come back again
once we will be able to preserve the evaluation margin.

bench: 5809010

10 years agoSkip evaluate() call after a null move
Marco Costalba [Sun, 4 Nov 2012 09:21:40 +0000 (10:21 +0100)]
Skip evaluate() call after a null move

Reuse the evaluation of the parent with inverted sign and
set margin to zero (this is an hack!).

This is done only in qsearch where almost 15% of calls are
from a null move. In normal search the number of nodes where

(ss-1)->currentMove == MOVE_NULL

is almost zero and so there is no need of using this trick.

The big advantage of this patch is a speed-up due to skipped
evaluate() calls, that are very costly.

Functionality is of course affected and we will need to proper
test it later. For now we just register a 3-4% speed up.

Suggested by Hongzhi Cheng.

bench: 5051328

10 years agoCorrectly fix "break from split" patch
Marco Costalba [Sat, 3 Nov 2012 16:06:49 +0000 (17:06 +0100)]
Correctly fix "break from split" patch

In case split cut-offs we return with still
some moves to go but we really want to break
out from the loop now.

No functional change.

10 years agoRelax constrain in prevents_threat()
Marco Costalba [Sat, 3 Nov 2012 14:48:34 +0000 (15:48 +0100)]
Relax constrain in prevents_threat()

When testing if a move blocks the threat path there is no
reason to require the threat to be a slider. Indeed threat
can be a double pawn push like in this example:

r1bq1rk1/ppp1np1p/4n1p1/3p4/3P2Q1/2P1B3/PPBN2PP/R4RK1 w - - 0 16

Where white's move Rf6 blocks the threat f5.

As a nice side effect we can retire the now useless helper

This patch kicks in only very rare cases, indeed the bench is
still the same!

bench: 5809010

10 years agoSync connected_threat() and yields_to_threat()
Marco Costalba [Sat, 3 Nov 2012 14:33:46 +0000 (15:33 +0100)]
Sync connected_threat() and yields_to_threat()

Rename stuff so to sync as much as posisble the
two related functions.

No functional change.

10 years agoDon't 'break' upon returning from split()
Marco Costalba [Sat, 3 Nov 2012 13:37:10 +0000 (14:37 +0100)]
Don't 'break' upon returning from split()

There is no guarantee that split() consumes all the node's
moves. Indeed split() can return without performing any job
for instance because MAX_SPLITPOINTS_PER_THREAD is reached
or becuase no available threads are found (this latter case
is much more common).

So search must continue in those cases and we cannot force
exiting from move's loop.

Bug introduced by 1ac417edb845 of 5/10/2012

Spotted by Frank Genot.

No functional change.

10 years agoRemove a redundant condition in connected_moves()
Marco Costalba [Sat, 3 Nov 2012 12:45:10 +0000 (13:45 +0100)]
Remove a redundant condition in connected_moves()

If a previous move attacks the king (with the piece
of the threat move removed) then must be a discovered
check, otherwise it means that first move gave check
and we were not able to do a null move.

Also renamed stuff to better document the function's

No functional change.

10 years agoRelax constrain in connected_moves()
Marco Costalba [Sat, 3 Nov 2012 12:25:23 +0000 (13:25 +0100)]
Relax constrain in connected_moves()

When testing if a piece is moving through the squares
vacated by a previous move there is no reason to require
the piece to be a slider, indeed we can have a double
pawn push like in this example:

r1q2rk1/2p1bppp/2Pp4/pN5b/Q1P1p3/4B2P/PP1R1PP1/1K5R w - - 3 18

Where black's move f5 is connected to previous move Be7 that
frees the path.

Or we can have a castle move:

r1bqkb1r/pppp1ppp/2n1pn2/1B6/4P3/2N2N2/PPPP1PPP/R1BQK2R b KQkq - 5 1

Where a previous move Bb5 allows the white to castle king side.

This time patch is mine ;-)

new bench: 5809010

10 years agoReformat connected_moves()
Marco Costalba [Sat, 3 Nov 2012 11:57:07 +0000 (12:57 +0100)]
Reformat connected_moves()

Prepare code for the next patch that
will affect functionality.

No functional change.

10 years agoFix an off-by-one bug in multi pv print
Marco Costalba [Fri, 2 Nov 2012 23:30:46 +0000 (00:30 +0100)]
Fix an off-by-one bug in multi pv print

We send to GUI multi-pv info after each cycle,
not just once at the end of the PV loop. This is
because at high depths a single root search can
be very slow and we want to update the gui as
soon as we have a new PV score.

Idea is good but implementation is broken because
sort() takes as arguments a pointer to the first
element and one past the last element.

So fix the bug and rename sort arguments to better
reflect their meaning.

Another hit by Hongzhi Cheng.  Impressive!

No functional change.

10 years agoFix a condition in connected_moves()
Marco Costalba [Fri, 2 Nov 2012 16:04:51 +0000 (17:04 +0100)]
Fix a condition in connected_moves()

When checking if the moving piece p1 in a previous
move m1 defends the destination square of a move m2
we have to use the occupancy with the from square of
m2 removed so to take in account the case in which
f2 will block an x-ray attack from p1.

For instance in this position:
r2k3r/p1pp1pb1/qn3np1/1N2P3/1p3P2/2B5/PPP3QP/R3K2R b KQ - 1 9

The move eXf6 is connected to the previous move Bc3 that
defends the destination square f6.

With this patch we have about 10% more moves detected as
'connected'. Anyhow the absolute number is very low, about
4000 more moves out of 6M nodes searched.

Another issue spotted by Hongzhi "Hawk Eye" Cheng ;-)

new bench: 5757373

10 years agoMicro-optimize pop_lsb() for 64bit case
Marco Costalba [Thu, 1 Nov 2012 08:30:03 +0000 (09:30 +0100)]
Micro-optimize pop_lsb() for 64bit case

On Intel, perhaps due to 'lea' instruction this way of
zeroing the lsb of *b seems faster than a shift+negate.

On perft (where any speed difference is magnified) I
got a 6% speed up on my Intel i5 64bit.

Suggested by Hongzhi Cheng.

No functional change.

10 years agoFix a warning under MSVC
Marco Costalba [Fri, 2 Nov 2012 10:41:49 +0000 (11:41 +0100)]
Fix a warning under MSVC

Compiler complies that 'cnt' is initialized but
unused (in !CheckThreeFold case). Moving the
definition of 'cnt'out of the loop  seems to do
the trick.

No functional change.

10 years agoPass InCheck as template parameter of qsearch()
Marco Costalba [Thu, 1 Nov 2012 13:49:54 +0000 (14:49 +0100)]
Pass InCheck as template parameter of qsearch()

Instead of use a variable so to resolve many conditions
already at compile time. In quiesce is also where we
have most of the InCheck nodes and is one of the most
performance critical code paths.

Speed up of 1.5% with Clang and 1% with gcc

Suggested by Hongzhi Cheng.

No functional change.

10 years agoUse correct occupancy in connected_threat()
Marco Costalba [Tue, 30 Oct 2012 19:21:22 +0000 (20:21 +0100)]
Use correct occupancy in connected_threat()

When checking if a move defends the threatened piece
we correctly remove from the occupancy bitboard the
moved piece. This patch removes from the occupancy also
the threatening piece so to consider the cases of moves
that defend the threatened piece x-raying through the
threat move.

As example in this position:
r3k2r/p1ppqp2/Bn4p1/3p1n2/4P1N1/5Q1P/PPP2P1P/R3K2R w KQkq - 1 10

The threat black move is dxe4. With this patch we include
(and so don't prune) white's Bb7 that would be pruned otherwise.

The number of affected position is very low, around 1% of cases,
so we don't expect ELO changes, neverthless this is the logical
and natural thing to do.

Patch suggested by Hongzhicheng.

new bench: 5323798

10 years agoRetire move_attacks_square()
Marco Costalba [Tue, 30 Oct 2012 18:56:19 +0000 (19:56 +0100)]
Retire move_attacks_square()

There is only one call site. This patch is a
preparation for the next one that will affect

No functional change.

10 years agoGet rid of ReducedStateInfo struct
Marco Costalba [Sun, 28 Oct 2012 16:12:40 +0000 (17:12 +0100)]
Get rid of ReducedStateInfo struct

ReducedStateInfo is a redundant struct that is also
prone to errors, indeed must be updated any time is
updated StateInfo. It is a trick to partial copy a
StateInfo object in do_move().

This patch takes advantage of builtin macro offsetof()
to directly calculate the number of quad words to copy.
Note that we still use memcpy to do the actual job of
copying the (48 bytes) of data.

Idea by Richard Vida.

No functional and no performance change.

10 years agoCreative formatting in uci.cpp
Marco Costalba [Sun, 28 Oct 2012 10:09:47 +0000 (11:09 +0100)]
Creative formatting in uci.cpp

Have some fun breaking the indentation rules :-)

No functional change.

10 years agoDetect drawish KQKP endings
Gary Linscott [Sun, 28 Oct 2012 02:27:19 +0000 (22:27 -0400)]
Detect drawish KQKP endings

Based off of the rules from the wikipedia page,
here: http://en.wikipedia.org/wiki/Queen_versus_pawn_endgame.

bench does not change: 5312693 but patch is real, has been
tested on specific positions.

10 years agoReformat check_is_dangerous()
Marco Costalba [Sat, 27 Oct 2012 12:25:31 +0000 (14:25 +0200)]
Reformat check_is_dangerous()

And shuffle some code at search.cpp tail.

No functional change.

10 years agoUse std::stack instead of fixed size array
Marco Costalba [Fri, 26 Oct 2012 16:01:13 +0000 (18:01 +0200)]
Use std::stack instead of fixed size array

Only in not performance critical code like pretty_pv(),
otherwise continue to use the good old C-style arrays
like in extract/insert PV where I have done some code
refactoring anyhow.

No functional change.

10 years agoFix broken uci notation for promotions
Marco Costalba [Fri, 26 Oct 2012 14:04:59 +0000 (16:04 +0200)]
Fix broken uci notation for promotions

Silly typo (introduced in e304db9d1ecf6a23) completely
messed up move notation in case of promotions causing
"Illegal move" warning in cutechess-cli.

Reported by Jörg Oster.

No functional change.

10 years agoFix asserts due to TT access races
Marco Costalba [Fri, 26 Oct 2012 10:33:58 +0000 (12:33 +0200)]
Fix asserts due to TT access races

In multi-threads runs with debug on we experience some
asserts due to the fact that TT access is intrinsecally
racy and its contents cannot be always trusted so must
be validated before to be used and this is what the
patch does.

No functional case.

10 years agoExtend full 3 fold detection to PvNodes
Marco Costalba [Fri, 26 Oct 2012 09:08:06 +0000 (11:08 +0200)]
Extend full 3 fold detection to PvNodes

And restore old behaviour of not returning from a RootNode
without updating RootMoves[].

Also renamed is_draw() template parameters to reflect a
'positive' logic (Check instead of Skip) that is easier
to follow.

New bench: 5312693

10 years agoMerge pull request #34 from jromang/repetition
Marco Costalba [Fri, 26 Oct 2012 09:01:10 +0000 (02:01 -0700)]
Merge pull request #34 from jromang/repetition

Improve 3 fold repetition detection

10 years agoFull three fold repetition detection only at root node
Jean-Francois Romang [Thu, 25 Oct 2012 13:57:44 +0000 (15:57 +0200)]
Full three fold repetition detection only at root node

10 years agoEnable true 3 fold detection in search
Jean-Francois Romang [Thu, 25 Oct 2012 06:54:05 +0000 (06:54 +0000)]
Enable true 3 fold detection in search

10 years agoAllow full repetition detection
Jean-Francois Romang [Tue, 23 Oct 2012 20:33:45 +0000 (20:33 +0000)]
Allow full repetition detection

Based on sshivaji 6ee19aa5389ce60181907ba53bbb50642f2d5657 commit

10 years agoFix an assert when we stop the search
Marco Costalba [Wed, 24 Oct 2012 22:07:16 +0000 (00:07 +0200)]
Fix an assert when we stop the search

When signal 'stop' is raised we return bestValue
that could be still set at -VALUE_INFINITE and
this triggers an assert. Fix it by returning
a value we know for sure is not +-VALUE_INFINITE.

Reported by 平岡拓也 Hiraoka.

No functional change.

10 years agoRename RootPosition and shuffle think()
Marco Costalba [Wed, 24 Oct 2012 12:37:52 +0000 (14:37 +0200)]
Rename RootPosition and shuffle think()

Just slightly code reshuffles, noting interesting here...

No functional change.

10 years agoDrop Chess960 and UCIMultiPV globals and rename MultiPV
Marco Costalba [Wed, 24 Oct 2012 11:14:16 +0000 (13:14 +0200)]
Drop Chess960 and UCIMultiPV globals and rename MultiPV

No functional change.

10 years agoWrap in a class Skill Level code
Marco Costalba [Wed, 24 Oct 2012 10:05:20 +0000 (12:05 +0200)]
Wrap in a class Skill Level code

Note that the actual pickup is done in the class
d'tor so to be sure it is always triggered, even
in case of a sudden exit due to a 'stop' signal.

No functional change.

10 years agoShuffle aspiration window loop
Marco Costalba [Wed, 24 Oct 2012 08:34:36 +0000 (10:34 +0200)]
Shuffle aspiration window loop

No functional change.

10 years agoRetire refine_eval()
Marco Costalba [Mon, 22 Oct 2012 07:50:00 +0000 (09:50 +0200)]
Retire refine_eval()

Inline its content and better comment what it does through
some renaming.

No functional change.

10 years agoDon't copy a full Position object in print()
Marco Costalba [Sun, 21 Oct 2012 22:53:17 +0000 (00:53 +0200)]
Don't copy a full Position object in print()

Function move_to_san() requires the Position to be
passed by referenced because a do/undo move is done
inside the function to detect a possible mate and to
add to the san string the corresponding '#' suffix.

Instead of passing a copy of current position pass
directly the original position object after const
casting it. This has the advantage to avoid a costly
Position copy, on the down side a bench test could
report different searched nodes if print(move) is
used, due to the additionals do_move() calls.

No functional change.

10 years agoDon't need to init board[] with NO_PIECE
Marco Costalba [Sun, 21 Oct 2012 12:03:44 +0000 (14:03 +0200)]
Don't need to init board[] with NO_PIECE

Now that NO_PIECE == 0 the common memset() will
do the work.

No functional change.

10 years agoChange NO_PIECE value and shrink PieceValue[]
Marco Costalba [Sun, 21 Oct 2012 09:49:05 +0000 (11:49 +0200)]
Change NO_PIECE value and shrink PieceValue[]

This requires changing color_of() definition.

No functional change.

10 years agoUse self-describing constants instead of numbers
Marco Costalba [Sun, 21 Oct 2012 08:41:23 +0000 (10:41 +0200)]
Use self-describing constants instead of numbers

And remove now useless comments.

No functional change.

10 years agoMove RootColor from Eval to Search
Marco Costalba [Sun, 21 Oct 2012 07:12:02 +0000 (09:12 +0200)]
Move RootColor from Eval to Search

No functional change.

10 years agoContempt factor: use DrawValue also in case of stealmates
Marco Costalba [Sat, 20 Oct 2012 09:02:37 +0000 (11:02 +0200)]
Contempt factor: use DrawValue also in case of stealmates

Spotted by Jörg Oster.

No functional change (when contempt factor is not used).

10 years agoFix compatibility with old Windows 95 and 98
Marco Costalba [Sat, 20 Oct 2012 08:32:35 +0000 (10:32 +0200)]
Fix compatibility with old Windows 95 and 98

Report and patches by bnemias.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoMerge pull request #33 from daylen/master
Marco Costalba [Sat, 20 Oct 2012 08:07:27 +0000 (01:07 -0700)]
Merge pull request #33 from daylen/master

Further improve OS X compatibility

Change the minimum supported version from 10.6 to 10.0

No functional change.

10 years agoFurther improve compatibility when compiling on OS X
Daylen Yang [Tue, 16 Oct 2012 07:13:16 +0000 (00:13 -0700)]
Further improve compatibility when compiling on OS X

Change the minimum supported version from 10.6 to 10.0

10 years agoFix Makefile for PowerPC with prefetch enabled
Marco Costalba [Sun, 14 Oct 2012 23:13:41 +0000 (01:13 +0200)]
Fix Makefile for PowerPC with prefetch enabled

Existing Makefile is buggy for PowerPC, it has no
SSE, yet it is given it if Prefetch is enabled,
because it isn't ARMv7.

Patch from Matthew Brades.

No functional change.

10 years agoDocument why is safe ttValue == VALUE_NONE
Marco Costalba [Sun, 14 Oct 2012 10:36:05 +0000 (12:36 +0200)]
Document why is safe ttValue == VALUE_NONE

We can have ttValue == VALUE_NONE when we use a TT
slot to just save a position static evaluation, but
in this case we also save DEPTH_NONE so to avoid
using the ttValue in search. This happens to work,
but due to a number of lucky and tricky cases that
we now documnet through a bunch of asserts and a
little change to value_from_tt() that has no real
effect but clarifing the code.

No functional change.