stockfish
9 years agoBig renaming of move's helpers
Marco Costalba [Sun, 1 Jan 2012 15:00:00 +0000 (16:00 +0100)]
Big renaming of move's helpers

The aim is to have shorter names without losing
readibility but, if possible, increasing it.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoSimplify Book APIs
Marco Costalba [Sat, 31 Dec 2011 16:52:14 +0000 (17:52 +0100)]
Simplify Book APIs

Retire open(), close() and name() from public visibility
and greately simplify the code. It is amazing how much
can be squeezed out of an already mature code !

No functional change

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRestore development version
Marco Costalba [Thu, 29 Dec 2011 10:49:49 +0000 (11:49 +0100)]
Restore development version

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoStockfish 2.2
Marco Costalba [Thu, 29 Dec 2011 10:09:11 +0000 (11:09 +0100)]
Stockfish 2.2

stockfish bench signature is: 5457475

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix cond_signal() semantics when using OLD_LOCKS
Marco Costalba [Sat, 31 Dec 2011 14:27:14 +0000 (15:27 +0100)]
Fix cond_signal() semantics when using OLD_LOCKS

In Windows when OLD_LOCKS is defined we use SetEvent() to mimic
the semantic of the POSIX pthread_cond_signal().

Unfortunatly there is not a direct mapping because with SetEvent()
the state of an event object remains signaled until it is set
explicitly to the nonsignaled state or until a single waiting thread
has been released. Instead in case of pthread_cond_signal(), if there
are no waiting threads it has no effect. What we may want is something
like PulseEvent() instead of SetEvent(). Unfortunatly it is documented
by Mcrosoft as 'unreliable' due to spurious wakes up that could
filter out the signal resetting. So we opt to reset manually any
pending signaled state before to go to sleep.

This fixes the strange misbehaves during 'stockfish bench'
when using OLD_LOCKS under Windows.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoUnify BitCountType selection
Marco Costalba [Sat, 31 Dec 2011 08:46:43 +0000 (09:46 +0100)]
Unify BitCountType selection

Now that HasPopCnt is a compile time constant we can
centralize and unify the BitCountType selection.

Also rename count_1s() in the more standard popcount()

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix Windows 64 build
Marco Costalba [Fri, 30 Dec 2011 23:11:49 +0000 (00:11 +0100)]
Fix Windows 64 build

Broken by previous patch.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoReformat types.h
Marco Costalba [Fri, 30 Dec 2011 16:08:07 +0000 (17:08 +0100)]
Reformat types.h

Retire obsolete code and reshuffle stuff.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoSimplify debug functions
Marco Costalba [Fri, 30 Dec 2011 15:14:24 +0000 (16:14 +0100)]
Simplify debug functions

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoAssorted cleanups in benchmark.cpp
Marco Costalba [Fri, 30 Dec 2011 13:40:35 +0000 (14:40 +0100)]
Assorted cleanups in benchmark.cpp

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRetire RootMove::nodes
Marco Costalba [Fri, 30 Dec 2011 13:16:15 +0000 (14:16 +0100)]
Retire RootMove::nodes

Was used for time management but is no more used
today.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoUpdate copyright year to 2012
Marco Costalba [Fri, 30 Dec 2011 12:24:41 +0000 (13:24 +0100)]
Update copyright year to 2012

And refresh Readme.txt while there.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoSimplify printing of engine info
Marco Costalba [Fri, 30 Dec 2011 11:53:51 +0000 (12:53 +0100)]
Simplify printing of engine info

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRetire run-time detection of hardware POPCNT
Marco Costalba [Fri, 30 Dec 2011 10:30:26 +0000 (11:30 +0100)]
Retire run-time detection of hardware POPCNT

It was meant to build a single binary optimized
for any kind of CPU: with and without hardware POPCNT.

This is a nice idea but in practice was never used, or
people builds binary with popcnt enabled or not, mainly
according to their type of CPU. And it was also never
used in the official Jim's builds where, in case, would
be easier for a number of reasons, do build two different
versions: with and without SEE42 support.

So retire this feature and simplify the code.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix an off-by-one bug in ucioption.cpp
Marco Costalba [Thu, 29 Dec 2011 17:25:08 +0000 (18:25 +0100)]
Fix an off-by-one bug in ucioption.cpp

Harmless but anyhow wrong.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoBetter use STL algorithms in Endgame functions
Marco Costalba [Thu, 29 Dec 2011 12:18:03 +0000 (13:18 +0100)]
Better use STL algorithms in Endgame functions

This leads to a further and unexpected simplification
of this already very size optimized code.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoWait for main thread to finish before to exit
Marco Costalba [Thu, 29 Dec 2011 08:55:09 +0000 (09:55 +0100)]
Wait for main thread to finish before to exit

Currently after a 'quit' command UI thread raises stop
signal, exits from uci_loop() and calls Threads.exit()
while the search threads are still active.

In Threads.exit() main thread is asked to terminate, but
if it is parked in idle_loop() it will exit and free its
resources (in particular the shared Movepicker object) while
sibling slaves are still active and this leads to a crash.

The fix is to let the UI thread always wait for main thread
to finish the search before to return from uci_loop().

Found by Valgrind when running with 8 threads.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoUse for_each() in Endgames d'tor
Marco Costalba [Wed, 28 Dec 2011 23:13:49 +0000 (00:13 +0100)]
Use for_each() in Endgames d'tor

And fix some comments while there.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoAdd user-defined conversions to UCIOption
Marco Costalba [Wed, 28 Dec 2011 17:27:18 +0000 (18:27 +0100)]
Add user-defined conversions to UCIOption

Greatly improves the usage. User defined conversions
are a novelity for SF, another amazing C++ facility
at work !

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix score_to_uci()
Marco Costalba [Wed, 28 Dec 2011 13:18:56 +0000 (14:18 +0100)]
Fix score_to_uci()

The condition for a mate score was wrong:

abs(v) < VALUE_MATE - PLY_MAX * ONE_PLY

instead of

abs(v) < VALUE_MATE_IN_PLY_MAX

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoBetter document how mate scores are stored in TT
Marco Costalba [Wed, 28 Dec 2011 12:22:09 +0000 (13:22 +0100)]
Better document how mate scores are stored in TT

During the search we score a mate as "plies to mate
from the root" to compare in an homogeneous way the
values returned by different sub-trees. However we
store in TT a mate score as "plies to mate from the
current position" the let the TT value remain valid
across the game.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRetire SquaresByColorBB[] and enum SquareColor
Marco Costalba [Wed, 28 Dec 2011 09:49:55 +0000 (10:49 +0100)]
Retire SquaresByColorBB[] and enum SquareColor

Use same_color_squares() instead.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRename Pieces
Marco Costalba [Tue, 27 Dec 2011 18:26:27 +0000 (19:26 +0100)]
Rename Pieces

Align with PieceType naming convention and
make them more readable.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoDocument mate distance pruning
Marco Costalba [Tue, 27 Dec 2011 15:01:33 +0000 (16:01 +0100)]
Document mate distance pruning

It is simple but somewhat tricky code that deserves
a bit of documentation. A bit of renaming while there.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoAssert enhancements in search
Marco Costalba [Tue, 27 Dec 2011 00:00:44 +0000 (01:00 +0100)]
Assert enhancements in search

Add the check that alpha < beta - 1 if and only if PvNode is true.
The current code would not flag PvNode and alpha == beta - 1. In
other words, the || is not an exclusive OR!.

Also sync assert conditions of search() and qsearch()

Suggested by Rein Halbersma.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoReformat UCI option code
Marco Costalba [Mon, 26 Dec 2011 15:21:13 +0000 (16:21 +0100)]
Reformat UCI option code

Make a better use of C++ operators overloading to
streamline the APIs.

Also sync polyglot.ini file while there.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRename getters functions removing 'get_' prefix
Marco Costalba [Sun, 25 Dec 2011 10:50:59 +0000 (11:50 +0100)]
Rename getters functions removing 'get_' prefix

Follow the suggested Qt style:

http://doc.qt.nokia.com/qq/qq13-apis.html

It seems to me simpler and easier to read.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRestore std::cout instead of printf()
Marco Costalba [Sun, 25 Dec 2011 08:04:28 +0000 (09:04 +0100)]
Restore std::cout instead of printf()

I am not able to reproduce the speed regression anymore,
and also we were using cout even before speed regression
so probably the reason is not there.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoCorrectly define operators in types.h
Marco Costalba [Sat, 24 Dec 2011 08:55:35 +0000 (09:55 +0100)]
Correctly define operators in types.h

Be consistent with the way these operators are defined
in plain C (and in C++).

Spotted by Lucas Braesch.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoDon't update killers for evasions
Marco Costalba [Thu, 8 Dec 2011 16:54:37 +0000 (17:54 +0100)]
Don't update killers for evasions

We don't use killers to order evasions, so it
seems natural do not consider an evasion cut-off
move as a possible killer. Test shows almost no
change, as it should be becuase this is a really
tiny change, but neverthless seems the correct
thing to do.

After 11893 games
Mod vs Orig 1773 - 1696 - 8424 ELO +2 (+-3.4)

Idea from Critter.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoUse ADL to skip std:: qualifier
Marco Costalba [Sun, 18 Dec 2011 19:48:59 +0000 (20:48 +0100)]
Use ADL to skip std:: qualifier

Take advantage of argument-dependent lookup (ADL) to
avoid specifying std:: qualifier in some STL functions.
When a function argument refers to a namespace (in this
case std) then the compiler will search the unqualified
function in that namespace too.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoDisable again buffering at startup
Marco Costalba [Sat, 17 Dec 2011 15:56:36 +0000 (16:56 +0100)]
Disable again buffering at startup

Partially revert efd21679980dfd59
Without this patch SF does not send "bestmove" to GUI.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoHeaders cleanup in ucioption.cpp
Marco Costalba [Sat, 17 Dec 2011 14:58:19 +0000 (15:58 +0100)]
Headers cleanup in ucioption.cpp

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoUse printf() instead of std::cout()
Marco Costalba [Sat, 17 Dec 2011 13:53:11 +0000 (14:53 +0100)]
Use printf() instead of std::cout()

Seems sensibly faster: On a

./stockfish bench > /dev/null

We have +2% on mingw and even +5% on MSVC !

Also removed the nice but complex enum set960 machinery,
use directly the underlying move_to_uci() function.

Speed regression reported by Heinz van Saanen.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRetire update_history() Inline the only caller site
Marco Costalba [Fri, 16 Dec 2011 09:23:25 +0000 (10:23 +0100)]
Retire update_history() Inline the only caller site

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix book move with searchmoves compatibility
Marco Costalba [Thu, 15 Dec 2011 06:25:45 +0000 (07:25 +0100)]
Fix book move with searchmoves compatibility

Do not return the book move if is not among the
RootMoves,in particular if we have been asked to
search on a move subset with "searchmoves" then
return book move only if it is among this subset.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoSimplify id_loop() signature
Marco Costalba [Wed, 14 Dec 2011 11:12:28 +0000 (12:12 +0100)]
Simplify id_loop() signature

And related assorted cleanup of this
very important function.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoReformat sending of PV information
Marco Costalba [Wed, 14 Dec 2011 08:21:00 +0000 (09:21 +0100)]
Reformat sending of PV information

Introduce pv_info_to_log() and pv_info_to_uci() and
greatly cleanup this stuff.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFurther simplify aspiration code
Marco Costalba [Wed, 14 Dec 2011 05:18:33 +0000 (06:18 +0100)]
Further simplify aspiration code

Actually after last patch it happens that delta
starts always with the fixed value of 16.

So further remove useless code.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoSimplify aspiration window calculation
Marco Costalba [Wed, 7 Dec 2011 16:51:02 +0000 (17:51 +0100)]
Simplify aspiration window calculation

It seems that we just need to look at previous score to
compute aspiration window size.

After 5350 games:
Mod vs Orig 800 - 803  - 3647 ELO +0 (+- 5.2)

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRetire RootMoveList
Marco Costalba [Mon, 12 Dec 2011 16:55:20 +0000 (17:55 +0100)]
Retire RootMoveList

Diretcly use the underlying std::vector<Move> and the
STL algorithms. Also a bit of cleanup while there.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix another crash triggered by previous patch
Marco Costalba [Sun, 11 Dec 2011 10:42:16 +0000 (11:42 +0100)]
Fix another crash triggered by previous patch

It is ok to redirect st pointer to startState, but the latter
should be updated with the content pointed by the st of the
original position. The bug is hidden when startState and *st
are the same as is the case of searching from start position,
but as soon as moves are made (as is the case when splitting)
the bug leads to a crash.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix a crash when quitting while searching
Marco Costalba [Sun, 11 Dec 2011 09:07:16 +0000 (10:07 +0100)]
Fix a crash when quitting while searching

The Position object used by UI thread is a local variable in
uci_loop(), so after receiving "quit" command the function
returns and the position is freed from the stack.

This should not be a problem becuase in start_thinking() we copy
the position to RootPosition that is the one used by main search
thread. Unfortunatly we blindly copy also StateInfo pointer that
still points to the startState struct inside UI position. So the
pointer becomes stale as soon as UI thread leaves uci_loop() and
because this happens while main search thread is still recovering
after the 'stop' signal we have a crash.

The fix is to update the pointer to the correct startState after
the copy.

Found with Valgrind.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoPrune silly comments in search()
Marco Costalba [Sat, 10 Dec 2011 18:14:13 +0000 (19:14 +0100)]
Prune silly comments in search()

Comments should be informative but not pedantic / obvious.
The only exception is the function description where we
indulge a bit on the "chatty" side, but has always been like
this since Glaurung times, so we continue with this tradition.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoAllow to prune also first move
Marco Costalba [Thu, 8 Dec 2011 18:25:52 +0000 (19:25 +0100)]
Allow to prune also first move

Tested togheter with previous patch; shows no regression and
is a semplification.

After 5817 games:
Mod vs Orig 939 - 892 - 3986 ELO +2 (+- 5.1)

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoDon't update bestValue when pruning
Marco Costalba [Thu, 8 Dec 2011 18:12:17 +0000 (19:12 +0100)]
Don't update bestValue when pruning

Simply return a fail-low score

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix description of endgame scaling functions
Marco Costalba [Sat, 10 Dec 2011 09:14:25 +0000 (10:14 +0100)]
Fix description of endgame scaling functions

Triggered by a comment of Eelco on talkchess. Also
a bit of cleanup while there.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix compile for 64 bits
Marco Costalba [Thu, 8 Dec 2011 12:55:27 +0000 (13:55 +0100)]
Fix compile for 64 bits

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoSet captureThreshold according to static evaluation
Marco Costalba [Thu, 8 Dec 2011 12:48:18 +0000 (13:48 +0100)]
Set captureThreshold according to static evaluation

Consider negative captures as good if
still enough to reach beta.

After 7502 games:
Mod vs Orig 1225 - 1158 - 5119 ELO +3 (+- 4.5)

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRemove some (int) casts
Marco Costalba [Wed, 7 Dec 2011 07:21:25 +0000 (08:21 +0100)]
Remove some (int) casts

A cast rarely is the right solution. In this case was enough
to redifine 3 variables with type size_t instead of int

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRetire all extensions (but checks) for non-PV nodes
Marco Costalba [Wed, 7 Dec 2011 06:45:44 +0000 (07:45 +0100)]
Retire all extensions (but checks) for non-PV nodes

It seems we don't have any added value. Note that the
moves that were used to be extended are still flagged
as dangerous so to avoid at least pruning them.

After 9555 games
Mod vs Orig 1562 - 1540 - 6453 ELO +0 (+- 4)

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoPrefer empty() to size()
Marco Costalba [Tue, 6 Dec 2011 13:18:04 +0000 (14:18 +0100)]
Prefer empty() to size()

As Heinz says:

"Function empty() should have a constant run-time even
 on lousy compilers and you spare the not.

The change is even measurable: + 100-150 nodes/sec. Wow:-)"

Patch from Heinz van Saanen

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoUse operator() instead of apply() in endgames
Marco Costalba [Mon, 5 Dec 2011 19:58:23 +0000 (20:58 +0100)]
Use operator() instead of apply() in endgames

It is more idiomatic for a functor (a function object) as are
the endgames.

Suggested by Rein Halbersma.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoFix disambiguation bug in move_to_san()
Marco Costalba [Sun, 4 Dec 2011 11:24:15 +0000 (12:24 +0100)]
Fix disambiguation bug in move_to_san()

A pinned piece cannot move and so does not play any role
in SAN disambiguation.

Reported by Steven Edwards.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoMove SearchStack under Search namespace
Marco Costalba [Sun, 4 Dec 2011 10:46:31 +0000 (11:46 +0100)]
Move SearchStack under Search namespace

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRetire move.h
Marco Costalba [Sun, 4 Dec 2011 09:53:40 +0000 (10:53 +0100)]
Retire move.h

Also some assorted comments fixes and other trivia.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoPrefer 0 to EmptyBoardBB
Marco Costalba [Sat, 3 Dec 2011 10:56:11 +0000 (11:56 +0100)]
Prefer 0 to EmptyBoardBB

Easier and even faster or at least easier to optimize.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoRetire neighboring_files_bb() overload
Marco Costalba [Sat, 3 Dec 2011 10:43:07 +0000 (11:43 +0100)]
Retire neighboring_files_bb() overload

Rarely used and we prefer to not hide the complexity.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoDon't disable IO buffering at startup
Marco Costalba [Sat, 3 Dec 2011 09:54:44 +0000 (10:54 +0100)]
Don't disable IO buffering at startup

It was never clear to me why we needed this trick, and now
that we rely only on C++ std::getline() and std::cout for
input / output it is even more a mistery what this code does.

So disable it and wait to see if someone screams ;-)

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoTidy up comments in uci.cpp
Marco Costalba [Sat, 3 Dec 2011 09:41:50 +0000 (10:41 +0100)]
Tidy up comments in uci.cpp

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
9 years agoTidy up comments in thread.cpp
Marco Costalba [Mon, 28 Nov 2011 14:54:40 +0000 (15:54 +0100)]
Tidy up comments in thread.cpp

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoInclude <cstring> in search.h
Marco Costalba [Mon, 28 Nov 2011 06:30:31 +0000 (07:30 +0100)]
Include <cstring> in search.h

Now we use memset() directly there.

Spotted by Justin Blanchard.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoLittle reformat of elapsed_search_time()
Marco Costalba [Sun, 27 Nov 2011 21:36:13 +0000 (22:36 +0100)]
Little reformat of elapsed_search_time()

Change name and argument type.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoDetach search arguments from UI thread
Marco Costalba [Sun, 27 Nov 2011 16:07:17 +0000 (17:07 +0100)]
Detach search arguments from UI thread

Detach from the UI thread the input arguments used by
the search threads so that the UI thread is able to receive
and process any command sent by the GUI while other threads
keep searching.

With this patch there is no more need to block the UI
thread after a "stop", so it is a more reliable and
robust solution than the previous patch.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoAfter a "stop" do not read new input until search finishes
Marco Costalba [Sun, 27 Nov 2011 11:16:23 +0000 (12:16 +0100)]
After a "stop" do not read new input until search finishes

Unfortunatly xboard sends immediately the new position to
search after sending "stop" when we have a ponder miss.

Becuase main thread position is not copied but is referenced
directly from root position and the latter is modified by
the "position.." UCI command we end up with the working position
that changes under our feet while the search is still recovering
after the "stop" and this causes a crash.

This happens only with the (broken) xboard, native UCI does not
have this problem.

Reported by otello1984

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoFix a race in pondering mode
Marco Costalba [Sat, 26 Nov 2011 15:29:54 +0000 (16:29 +0100)]
Fix a race in pondering mode

Fixes an hang when playing with ponder ON. Perhaps there is still
a very small race but now it seems engine does not hang anymore.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoIntroduce Search namespace
Marco Costalba [Sat, 26 Nov 2011 11:07:35 +0000 (12:07 +0100)]
Introduce Search namespace

Move global search-related variables under "Search" namespace.

As a side effect we can move uci_async_command() and
wait_for_stop_or_ponderhit() away from search.cpp

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoRewrite async I/O
Marco Costalba [Wed, 23 Nov 2011 19:07:29 +0000 (20:07 +0100)]
Rewrite async I/O

Use the starting thread to wait for GUI input and instead use
the other threads to search. The consequence is that now think()
is alwasy started on a differnt thread than the caller that
returns immediately waiting for input. This reformat greatly
simplifies the code and is more in line with the common way
to implement this feature.

As a side effect now we don't need anymore Makefile tricks
with sleep() to allow profile builds.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoReformat search dispatch code
Marco Costalba [Sat, 19 Nov 2011 12:55:26 +0000 (13:55 +0100)]
Reformat search dispatch code

Reduce indentation level and lines of code and tidy up
some comment.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoFix regression with printing of debug info
Marco Costalba [Sat, 19 Nov 2011 13:37:26 +0000 (14:37 +0100)]
Fix regression with printing of debug info

Output of debug info each second was disabled
due to recent patches.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoDon't check for early stop when StopOnPonderhit is set
Marco Costalba [Sat, 19 Nov 2011 10:30:32 +0000 (11:30 +0100)]
Don't check for early stop when StopOnPonderhit is set

If we are pondering we will stop the search only when
GUI sends "ponderhit" or "stop" commands or when we reach
maximum depth. In all the other cases we continue to search
so there is no need to verify for available time.

Also better clarify why wait_for_stop_or_ponderhit() before
to exit in some cases.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoEarly stop: retire redundant Rml.size() == 1 case
Marco Costalba [Sat, 19 Nov 2011 10:19:12 +0000 (11:19 +0100)]
Early stop: retire redundant Rml.size() == 1 case

In case there is only 1 legal move we will stop the
search at depth 10 anyway because the exclusion search
probe will fail low.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoRewrite early stop logic
Marco Costalba [Sat, 8 Oct 2011 12:01:18 +0000 (13:01 +0100)]
Rewrite early stop logic

In the "easy move" paradigm we verify if the best move has
ever changed over a good number of iterations and if the
biggest part of the searched nodes are consumed on it.
This is a kind of hacky ad indirect heuristic to deduce
if one move is much better than others.

Rewrite the early stop condition to verify directly if one
move is much better than others performing an exclusion
search.

Idea to use exclusion search for time management if form Critter.

After 12245 games at 30"+0.1
Mod vs Orig 1776 - 1775 - 8694 ELO +0 (+-3.4)

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoCLOP: Passed pawns weights tuning
Marco Costalba [Mon, 14 Nov 2011 08:02:01 +0000 (09:02 +0100)]
CLOP: Passed pawns weights tuning

Tuned with CLOP against a pool of 3 engines. Result
verified with a direct match:

After 11720 games at 10"+0.1
Mod vs Orig 1922 - 1832 - 7966 ELO +2 (+-3.6)

So no change in self match but if CLOP is right it should
be a bit better against an engine pool.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoRename value in bestValue in id_loop()
Marco Costalba [Sun, 13 Nov 2011 09:54:30 +0000 (10:54 +0100)]
Rename value in bestValue in id_loop()

The value returned by root search it is actually
our best value, so rename the variable to reflect this.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoRewrite link time optimization in Makefile
Marco Costalba [Sat, 12 Nov 2011 09:10:01 +0000 (10:10 +0100)]
Rewrite link time optimization in Makefile

Instead of binding link time optimization to the choice of
popcount support, do the right thing and add -flto option
when gcc 4.5 or later is detected.

Although it should be supported also under mingw, it happens
that it doesn't, at least on my 4.6.1 due to some known bugs.

Thanks to Mike for helping me with this patch.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoSimplify passed pawns logic
Marco Costalba [Sat, 12 Nov 2011 08:03:18 +0000 (09:03 +0100)]
Simplify passed pawns logic

Remove the bonus for no *friendly* pieces in the pawn's path and
reduce a bit the bonus based on kings proximity.

This patch is part of to the ongoing effort to remove form evaluation
all the terms that do not add value.

After 16284 games:

Mod vs Orig 2728 - 2651 - 10911 ELO +1 (+- 3.1)

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoFix regression: engine hangs while pondering
Marco Costalba [Thu, 10 Nov 2011 08:20:41 +0000 (09:20 +0100)]
Fix regression: engine hangs while pondering

After a "stop" due to a ponder miss Xboard sends
immediately the new position to search, without
waiting for engine to effectively stop the search.

It is not clear if this is a GUI bug (as I suspect)
or allowed behaviour, but because it won't be fixed
anyway workaround this issue making listener thread
to switch to in-sync mode as soon as a "stop" command
is received.

Thanks to Mike Whiteley for reporting this.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoStop is not an unknown command
Marco Costalba [Thu, 10 Nov 2011 08:10:44 +0000 (09:10 +0100)]
Stop is not an unknown command

If GUI sends stop while we are waiting for
a command do not reply with a silly:

Unknown command: stop

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoAnother fix to profile-build on gcc 4.6
Marco Costalba [Wed, 9 Nov 2011 04:03:46 +0000 (05:03 +0100)]
Another fix to profile-build on gcc 4.6

Oliver reports profile builds error with new gcc 4.6, he says:

"We need to add -lgov with profile-generate AND profile-use.
So it has to be added to the second stage of building too.

The problem occurred first with the introduction of gcc4.6 and
I think this is because the previous version did find the gcov
library automatically. gcc4.6 needs more precise options and
does less guesses. I have seen it in debian, Ubuntu and also with
mingw on Windows. And all use gcc4.6."

This patch fixes the issue.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoFix profile-build
Marco Costalba [Tue, 8 Nov 2011 06:34:44 +0000 (07:34 +0100)]
Fix profile-build

After async I/O patches 'bench' changed behaviour and now waits for
input at the end of the test run. This is due to listener thread stay
blocked on std::getline() even after test run is finished, as soon as
we feed something the thread unblocks and then quickly exits.

This is not a big problem, but has the bad side effect of breaking
profile builds that hang forever at the end of the test run.

The tricky workaround is to create a pipe that connects to stockfish
input and then, when test run is finished, breaking the pipe: this
makes std::getline() immediately return.

So this patch adds a 'sleep 10' piped into 'stockfish bench' test run
command. After 10 seconds sleep ends, the pipe breaks and 'bench'
finishes as usual.

Thanks to Oliver Korff for reporting the issue, and to Mike Whiteley
for having co-authored this solution.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoReformat all_slaves_finished()
Marco Costalba [Sun, 6 Nov 2011 12:37:18 +0000 (13:37 +0100)]
Reformat all_slaves_finished()

Rename and move under ThreadsManager class.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoBetter document and reshuffle stuff in think()
Marco Costalba [Sun, 6 Nov 2011 12:13:54 +0000 (13:13 +0100)]
Better document and reshuffle stuff in think()

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoBetter define wait_for_stop_or_ponderhit()
Marco Costalba [Sun, 6 Nov 2011 10:59:07 +0000 (11:59 +0100)]
Better define wait_for_stop_or_ponderhit()

Use do_uci_async_cmd() instead of process input commands
directly and clarify that what we are waiting for is
something that is able to raise StopRequest flag.

Also fix some stale comments in do_uci_async_cmd(). Here
we need to reset Limits.ponder only upon receiving "ponderhit".
In the case of "quit" or "stop" resetting Limits.ponder has no
effect because the search is going to be stopped anyway.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoUse a timer to avoid polling
Marco Costalba [Sat, 5 Nov 2011 10:19:21 +0000 (11:19 +0100)]
Use a timer to avoid polling

The timer will be fired asynchronously to handle
time management flags, while other threads are
searching.

This implementation uses a thread waiting on a
timed condition variable instead of real timers.
This approach allow to reduce platform dependant
code to a minimum and also is the most portable given
that timers libraries are very different among platforms
and also the best ones are not compatible with olds
Windows.

Also retire the now unused polling code.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoRetire now unused input_available()
Marco Costalba [Sat, 5 Nov 2011 07:37:48 +0000 (08:37 +0100)]
Retire now unused input_available()

With our new listener thread we don't need anymore
this ugly and platform dependent code.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoRewrite how commands from GUI are read
Marco Costalba [Sat, 5 Nov 2011 06:53:19 +0000 (07:53 +0100)]
Rewrite how commands from GUI are read

Instead of polling for input use a dedicated listener
thread to read commands from the GUI independently
from other threads.

To do this properly we have to delegate to the listener
all the reading from the GUI: while searching but also
while waiting for a command, like in std::getline().

So we have two possible behaviours: in-sync mode, in which
the thread mimics std::getline() and the caller blocks until
something is read from GUI, and async mode where the listener
continuously reads and processes GUI commands while other
threads are searching.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoFurther touches to magic bitboards code
Marco Costalba [Tue, 1 Nov 2011 08:07:23 +0000 (09:07 +0100)]
Further touches to magic bitboards code

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoFix compile error in cpu_count()
Marco Costalba [Mon, 31 Oct 2011 19:03:30 +0000 (20:03 +0100)]
Fix compile error in cpu_count()

The std::min() template function requires both arguments
to be of the same type.

But here we have the integer MAX_THREADS compared to a long:

long sysconf(int name);

So cast to integer and fix the compile.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoDocument magics bitboards code
Marco Costalba [Mon, 31 Oct 2011 14:37:46 +0000 (15:37 +0100)]
Document magics bitboards code

Add comments and rename stuff to better clarify what the
magic bitboard initialization code does.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoMerge pull request #1 from Panthee/master
mcostalba [Mon, 31 Oct 2011 12:32:18 +0000 (05:32 -0700)]
Merge pull request #1 from Panthee/master

Code Cleanup - Replacing macros Min() and Max() with corresponding STL algorithms std::min() and std::max()

10 years agoRetire update_gains()
Alexander Kure [Mon, 31 Oct 2011 07:28:59 +0000 (03:28 -0400)]
Retire update_gains()

10 years agoReplaced macros Min() and Max() with corresponding STL algorithms std::min() and...
Alexander Kure [Mon, 31 Oct 2011 04:38:44 +0000 (00:38 -0400)]
Replaced macros Min() and Max() with corresponding STL algorithms std::min() and std::max()

10 years agoRetire update_gains()
Marco Costalba [Sun, 30 Oct 2011 21:52:59 +0000 (22:52 +0100)]
Retire update_gains()

Called from one place only.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoFix small bug in move_attacks_square()
Marco Costalba [Sun, 30 Oct 2011 17:59:12 +0000 (18:59 +0100)]
Fix small bug in move_attacks_square()

We test if the piece moved in 'to' attacks the square 's' with:

bit_is_set(attacks_from(piece, to), s))

But we should instead consider the new occupancy, changed after
the piece is moved, and so test with:

bit_is_set(attacks_from(piece, to, occ), s))

Otherwise we can miss some cases, for instance a queen in b1 that
moves in c1 is not detected to attack a1 while instead she does.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoInline pinned_pieces() and discovered_check_candidates()
Marco Costalba [Sun, 30 Oct 2011 17:16:28 +0000 (18:16 +0100)]
Inline pinned_pieces() and discovered_check_candidates()

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoCode style and 80 chars cols in Position::from_fen()
Marco Costalba [Sun, 30 Oct 2011 14:46:00 +0000 (15:46 +0100)]
Code style and 80 chars cols in Position::from_fen()

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoSync do_move() and undo_move()
Marco Costalba [Sun, 30 Oct 2011 10:26:06 +0000 (11:26 +0100)]
Sync do_move() and undo_move()

It is not possible to unify due to the fact that the
sequence steps are reversed. What we can do is to try
to sync comments and code as much as we can to easy
reading and documentation.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoExplicitly use a dedicated bitboard for occupied squares
Marco Costalba [Sun, 30 Oct 2011 10:11:45 +0000 (11:11 +0100)]
Explicitly use a dedicated bitboard for occupied squares

Instead of byTypeBB[0]. This better self-documents the code.

No functional and speed change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
10 years agoRetire do_capture_move()
Marco Costalba [Sun, 30 Oct 2011 09:57:00 +0000 (10:57 +0100)]
Retire do_capture_move()

It is called only in do_move() that now has been fully
expanded. This is the most time consuming function of
all the engine.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>