mirror of
https://github.com/opelly27/Stockfish.git
synced 2026-05-20 10:57:43 +00:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 48cfdfcc46 | |||
| fa7b244dc9 | |||
| 29ad6a73fc | |||
| ac48b16708 | |||
| 38b1c4b6b8 | |||
| 162dbeaee8 | |||
| 85146ca0a9 | |||
| 02e12a69a7 | |||
| 6e8116e38f | |||
| 29f7fab2a9 | |||
| 2af986bf31 | |||
| b67146b100 | |||
| c1b1a94d81 | |||
| 17212e5fcc | |||
| 46921dff27 | |||
| 941016e7a2 | |||
| 290caf9960 | |||
| 43fa3a4d64 | |||
| 64b4836d12 | |||
| 5df7d62eb9 | |||
| 82179c70dc | |||
| de17652e47 | |||
| 647b79b556 |
+7
-28
@@ -21,10 +21,6 @@
|
|||||||
### Executable name. Do not change
|
### Executable name. Do not change
|
||||||
EXE = stockfish
|
EXE = stockfish
|
||||||
|
|
||||||
### Installation dir definitions
|
|
||||||
PREFIX = /usr/local
|
|
||||||
BINDIR = $(PREFIX)/bin
|
|
||||||
|
|
||||||
|
|
||||||
### ==========================================================================
|
### ==========================================================================
|
||||||
### Compiler speed switches for both GCC and ICC. These settings are generally
|
### Compiler speed switches for both GCC and ICC. These settings are generally
|
||||||
@@ -96,18 +92,14 @@ help:
|
|||||||
@echo "make osx-icc64 > x86-Mac OS X 64 bit. Compiler = icpc"
|
@echo "make osx-icc64 > x86-Mac OS X 64 bit. Compiler = icpc"
|
||||||
@echo "make osx-icc32-profile > OSX 32 bit. Compiler = icpc + automatic pgo-build"
|
@echo "make osx-icc32-profile > OSX 32 bit. Compiler = icpc + automatic pgo-build"
|
||||||
@echo "make osx-icc64-profile > OSX 64 bit. Compiler = icpc + automatic pgo-build"
|
@echo "make osx-icc64-profile > OSX 64 bit. Compiler = icpc + automatic pgo-build"
|
||||||
@echo "make hpux > HP-UX. Compiler = aCC"
|
|
||||||
@echo "make strip > Strip executable"
|
@echo "make strip > Strip executable"
|
||||||
@echo "make clean > Clean up"
|
@echo "make clean > Clean up"
|
||||||
@echo ""
|
@echo ""
|
||||||
|
|
||||||
all: $(EXE) .depend
|
all: $(EXE) .depend
|
||||||
|
|
||||||
test check: default
|
|
||||||
@$(PGOBENCH)
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
$(RM) *.o .depend *~ $(EXE) core bench.txt
|
$(RM) *.o .depend *~ $(EXE)
|
||||||
|
|
||||||
|
|
||||||
### Possible targets. You may add your own ones here
|
### Possible targets. You may add your own ones here
|
||||||
@@ -197,7 +189,6 @@ osx-ppc32:
|
|||||||
CXX='g++' \
|
CXX='g++' \
|
||||||
CXXFLAGS="$(GCCFLAGS)" \
|
CXXFLAGS="$(GCCFLAGS)" \
|
||||||
CXXFLAGS+='-arch ppc' \
|
CXXFLAGS+='-arch ppc' \
|
||||||
CXXFLAGS+='-DBIGENDIAN' \
|
|
||||||
LDFLAGS+='-arch ppc' \
|
LDFLAGS+='-arch ppc' \
|
||||||
all
|
all
|
||||||
|
|
||||||
@@ -206,7 +197,6 @@ osx-ppc64:
|
|||||||
CXX='g++' \
|
CXX='g++' \
|
||||||
CXXFLAGS="$(GCCFLAGS)" \
|
CXXFLAGS="$(GCCFLAGS)" \
|
||||||
CXXFLAGS+='-arch ppc64' \
|
CXXFLAGS+='-arch ppc64' \
|
||||||
CXXFLAGS+='-DBIGENDIAN' \
|
|
||||||
LDFLAGS+='-arch ppc64' \
|
LDFLAGS+='-arch ppc64' \
|
||||||
all
|
all
|
||||||
|
|
||||||
@@ -214,16 +204,16 @@ osx-x86:
|
|||||||
$(MAKE) \
|
$(MAKE) \
|
||||||
CXX='g++' \
|
CXX='g++' \
|
||||||
CXXFLAGS="$(GCCFLAGS)" \
|
CXXFLAGS="$(GCCFLAGS)" \
|
||||||
CXXFLAGS+='-arch i386 -mdynamic-no-pic' \
|
CXXFLAGS+='-arch i386' \
|
||||||
LDFLAGS+='-arch i386 -mdynamic-no-pic' \
|
LDFLAGS+='-arch i386' \
|
||||||
all
|
all
|
||||||
|
|
||||||
osx-x86_64:
|
osx-x86_64:
|
||||||
$(MAKE) \
|
$(MAKE) \
|
||||||
CXX='g++' \
|
CXX='g++' \
|
||||||
CXXFLAGS="$(GCCFLAGS)" \
|
CXXFLAGS="$(GCCFLAGS)" \
|
||||||
CXXFLAGS+='-arch x86_64 -mdynamic-no-pic' \
|
CXXFLAGS+='-arch x86_64' \
|
||||||
LDFLAGS+='-arch x86_64 -mdynamic-no-pic' \
|
LDFLAGS+='-arch x86_64' \
|
||||||
all
|
all
|
||||||
|
|
||||||
osx-icc32:
|
osx-icc32:
|
||||||
@@ -306,12 +296,6 @@ osx-icc64-profile:
|
|||||||
$(MAKE) osx-icc64-profile-use
|
$(MAKE) osx-icc64-profile-use
|
||||||
@rm -rf profdir bench.txt
|
@rm -rf profdir bench.txt
|
||||||
|
|
||||||
hpux:
|
|
||||||
$(MAKE) \
|
|
||||||
CXX='/opt/aCC/bin/aCC -AA +hpxstd98 -DBIGENDIAN -mt +O3 -DNDEBUG' \
|
|
||||||
CXXFLAGS="" \
|
|
||||||
LDFLAGS="" \
|
|
||||||
all
|
|
||||||
|
|
||||||
|
|
||||||
strip:
|
strip:
|
||||||
@@ -322,14 +306,9 @@ strip:
|
|||||||
$(EXE): $(OBJS)
|
$(EXE): $(OBJS)
|
||||||
$(CXX) $(LDFLAGS) -o $@ $(OBJS)
|
$(CXX) $(LDFLAGS) -o $@ $(OBJS)
|
||||||
|
|
||||||
### Installation
|
|
||||||
install: default
|
|
||||||
-mkdir -p -m 755 $(BINDIR)
|
|
||||||
-cp $(EXE) $(BINDIR)
|
|
||||||
-strip $(BINDIR)/$(EXE)
|
|
||||||
|
|
||||||
### Dependencies. Do not change
|
### Dependencies. Do not change
|
||||||
.depend:
|
.depend:
|
||||||
-@$(CXX) -msse -MM $(OBJS:.o=.cpp) > $@ 2> /dev/null
|
$(CXX) -msse -MM $(OBJS:.o=.cpp) > $@
|
||||||
|
|
||||||
-include .depend
|
include .depend
|
||||||
|
|||||||
+2
-3
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -49,7 +49,6 @@ Application::Application() {
|
|||||||
Position::init_piece_square_tables();
|
Position::init_piece_square_tables();
|
||||||
init_eval(1);
|
init_eval(1);
|
||||||
init_bitbases();
|
init_bitbases();
|
||||||
init_search();
|
|
||||||
init_threads();
|
init_threads();
|
||||||
|
|
||||||
// Make random number generation less deterministic, for book moves
|
// Make random number generation less deterministic, for book moves
|
||||||
@@ -59,7 +58,7 @@ Application::Application() {
|
|||||||
|
|
||||||
Application::~Application() {
|
Application::~Application() {
|
||||||
|
|
||||||
exit_threads();
|
stop_threads();
|
||||||
quit_eval();
|
quit_eval();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -84,9 +84,9 @@ void benchmark(const string& commandLine) {
|
|||||||
}
|
}
|
||||||
csStr >> threads;
|
csStr >> threads;
|
||||||
csVal >> val;
|
csVal >> val;
|
||||||
if (val < 1 || val > MAX_THREADS)
|
if (val < 1 || val > THREAD_MAX)
|
||||||
{
|
{
|
||||||
cerr << "The number of threads must be between 1 and " << MAX_THREADS << endl;
|
cerr << "The number of threads must be between 1 and " << THREAD_MAX << endl;
|
||||||
Application::exit_with_failure();
|
Application::exit_with_failure();
|
||||||
}
|
}
|
||||||
set_option_value("Hash", ttSize);
|
set_option_value("Hash", ttSize);
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+14
-25
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -297,8 +297,8 @@ void init_bitboards() {
|
|||||||
|
|
||||||
#if defined(IS_64BIT) && !defined(USE_BSFQ)
|
#if defined(IS_64BIT) && !defined(USE_BSFQ)
|
||||||
|
|
||||||
static CACHE_LINE_ALIGNMENT
|
CACHE_LINE_ALIGNMENT
|
||||||
const int BitTable[64] = {
|
static const int BitTable[64] = {
|
||||||
0, 1, 2, 7, 3, 13, 8, 19, 4, 25, 14, 28, 9, 34, 20, 40, 5, 17, 26, 38, 15,
|
0, 1, 2, 7, 3, 13, 8, 19, 4, 25, 14, 28, 9, 34, 20, 40, 5, 17, 26, 38, 15,
|
||||||
46, 29, 48, 10, 31, 35, 54, 21, 50, 41, 57, 63, 6, 12, 18, 24, 27, 33, 39,
|
46, 29, 48, 10, 31, 35, 54, 21, 50, 41, 57, 63, 6, 12, 18, 24, 27, 33, 39,
|
||||||
16, 37, 45, 47, 30, 53, 49, 56, 62, 11, 23, 32, 36, 44, 52, 55, 61, 22, 43,
|
16, 37, 45, 47, 30, 53, 49, 56, 62, 11, 23, 32, 36, 44, 52, 55, 61, 22, 43,
|
||||||
@@ -368,38 +368,27 @@ Square pop_1st_bit(Bitboard* bb) {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Optimized bitScanReverse32() implementation by Pascal Georges. Note
|
|
||||||
// that first bit is 1, this allow to differentiate between 0 and 1.
|
|
||||||
static CACHE_LINE_ALIGNMENT
|
|
||||||
const char MsbTable[256] = {
|
|
||||||
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
||||||
5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8
|
|
||||||
};
|
|
||||||
|
|
||||||
int bitScanReverse32(uint32_t b)
|
int bitScanReverse32(uint32_t b)
|
||||||
{
|
{
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
if (b > 0xFFFF)
|
if (b > 0xFFFF) {
|
||||||
{
|
|
||||||
b >>= 16;
|
b >>= 16;
|
||||||
result += 16;
|
result += 16;
|
||||||
}
|
}
|
||||||
if (b > 0xFF)
|
if (b > 0xFF) {
|
||||||
{
|
|
||||||
b >>= 8;
|
b >>= 8;
|
||||||
result += 8;
|
result += 8;
|
||||||
}
|
}
|
||||||
return result + MsbTable[b];
|
if (b > 0xF) {
|
||||||
|
b >>= 4;
|
||||||
|
result += 4;
|
||||||
|
}
|
||||||
|
if (b > 0x3) {
|
||||||
|
b >>= 2;
|
||||||
|
result += 2;
|
||||||
|
}
|
||||||
|
return result + (b > 0) + (b > 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+53
-20
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -26,18 +26,64 @@
|
|||||||
|
|
||||||
// Select type of intrinsic bit count instruction to use, see
|
// Select type of intrinsic bit count instruction to use, see
|
||||||
// README.txt on how to pgo compile with POPCNT support.
|
// README.txt on how to pgo compile with POPCNT support.
|
||||||
#if !defined(USE_POPCNT)
|
|
||||||
#define POPCNT_INTRINSIC(x) 0
|
#if defined(__INTEL_COMPILER) && defined(USE_POPCNT) // Intel compiler
|
||||||
#elif defined(_MSC_VER)
|
|
||||||
#define POPCNT_INTRINSIC(x) (int)__popcnt64(x)
|
#include <nmmintrin.h>
|
||||||
#elif defined(__GNUC__)
|
|
||||||
|
inline bool cpu_has_popcnt() {
|
||||||
|
|
||||||
|
int CPUInfo[4] = {-1};
|
||||||
|
__cpuid(CPUInfo, 0x00000001);
|
||||||
|
return (CPUInfo[2] >> 23) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define POPCNT_INTRINSIC(x) _mm_popcnt_u64(x)
|
||||||
|
|
||||||
|
#elif defined(_MSC_VER) && defined(USE_POPCNT) // Microsoft compiler
|
||||||
|
|
||||||
|
#include <intrin.h>
|
||||||
|
|
||||||
|
inline bool cpu_has_popcnt() {
|
||||||
|
|
||||||
|
int CPUInfo[4] = {-1};
|
||||||
|
__cpuid(CPUInfo, 0x00000001);
|
||||||
|
return (CPUInfo[2] >> 23) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define POPCNT_INTRINSIC(x) __popcnt64(x)
|
||||||
|
|
||||||
|
#elif defined(__GNUC__) && defined(USE_POPCNT) // Gcc compiler
|
||||||
|
|
||||||
|
inline void __cpuid(unsigned int op,
|
||||||
|
unsigned int *eax, unsigned int *ebx,
|
||||||
|
unsigned int *ecx, unsigned int *edx)
|
||||||
|
{
|
||||||
|
*eax = op;
|
||||||
|
*ecx = 0;
|
||||||
|
__asm__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
|
||||||
|
: "0" (*eax), "2" (*ecx));
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool cpu_has_popcnt() {
|
||||||
|
|
||||||
|
unsigned int eax, ebx, ecx, edx;
|
||||||
|
__cpuid(1, &eax, &ebx, &ecx, &edx);
|
||||||
|
return (ecx >> 23) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
#define POPCNT_INTRINSIC(x) ({ \
|
#define POPCNT_INTRINSIC(x) ({ \
|
||||||
unsigned long __ret; \
|
unsigned long __ret; \
|
||||||
__asm__("popcnt %1, %0" : "=r" (__ret) : "r" (x)); \
|
__asm__("popcnt %1, %0" : "=r" (__ret) : "r" (x)); \
|
||||||
__ret; })
|
__ret; })
|
||||||
|
|
||||||
#endif
|
#else // Safe fallback for unsupported compilers or when USE_POPCNT is disabled
|
||||||
|
|
||||||
|
inline bool cpu_has_popcnt() { return false; }
|
||||||
|
|
||||||
|
#define POPCNT_INTRINSIC(x) 0
|
||||||
|
|
||||||
|
#endif // cpu_has_popcnt() and POPCNT_INTRINSIC() definitions
|
||||||
|
|
||||||
|
|
||||||
/// Software implementation of bit count functions
|
/// Software implementation of bit count functions
|
||||||
@@ -104,23 +150,10 @@ inline int count_1s_max_15(Bitboard b) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Detect hardware POPCNT support
|
|
||||||
inline bool cpu_has_popcnt() {
|
|
||||||
|
|
||||||
int CPUInfo[4] = {-1};
|
|
||||||
__cpuid(CPUInfo, 0x00000001);
|
|
||||||
return (CPUInfo[2] >> 23) & 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Global constant initialized at startup that is set to true if
|
// Global constant initialized at startup that is set to true if
|
||||||
// CPU on which application runs supports POPCNT intrinsic. Unless
|
// CPU on which application runs supports POPCNT intrinsic. Unless
|
||||||
// USE_POPCNT is not defined.
|
// USE_POPCNT is not defined.
|
||||||
#if defined(USE_POPCNT)
|
|
||||||
const bool CpuHasPOPCNT = cpu_has_popcnt();
|
const bool CpuHasPOPCNT = cpu_has_popcnt();
|
||||||
#else
|
|
||||||
const bool CpuHasPOPCNT = false;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// Global constant used to print info about the use of 64 optimized
|
// Global constant used to print info about the use of 64 optimized
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -390,7 +390,7 @@ void Book::close() {
|
|||||||
/// Book::file_name() returns the file name of the currently active book,
|
/// Book::file_name() returns the file name of the currently active book,
|
||||||
/// or the empty string if no book is open.
|
/// or the empty string if no book is open.
|
||||||
|
|
||||||
const string Book::file_name() { // Not const to compile on HP-UX 11.X
|
const string Book::file_name() const {
|
||||||
|
|
||||||
return is_open() ? fileName : "";
|
return is_open() ? fileName : "";
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-5
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -53,14 +53,11 @@ struct BookEntry {
|
|||||||
};
|
};
|
||||||
|
|
||||||
class Book : private std::ifstream {
|
class Book : private std::ifstream {
|
||||||
Book(const Book&); // just decleared..
|
|
||||||
Book& operator=(const Book&); // ..to avoid a warning
|
|
||||||
public:
|
public:
|
||||||
Book() {}
|
|
||||||
~Book();
|
~Book();
|
||||||
void open(const std::string& fName);
|
void open(const std::string& fName);
|
||||||
void close();
|
void close();
|
||||||
const std::string file_name();
|
const std::string file_name() const;
|
||||||
Move get_move(const Position& pos);
|
Move get_move(const Position& pos);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+2
-3
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -48,8 +48,7 @@ inline void operator+= (Depth &d, int i) { d = Depth(int(d) + i); }
|
|||||||
inline void operator+= (Depth &d1, Depth d2) { d1 += int(d2); }
|
inline void operator+= (Depth &d1, Depth d2) { d1 += int(d2); }
|
||||||
inline Depth operator- (Depth d, int i) { return Depth(int(d) - i); }
|
inline Depth operator- (Depth d, int i) { return Depth(int(d) - i); }
|
||||||
inline Depth operator- (Depth d1, Depth d2) { return Depth(int(d1) - int(d2)); }
|
inline Depth operator- (Depth d1, Depth d2) { return Depth(int(d1) - int(d2)); }
|
||||||
inline void operator-= (Depth &d, int i) { d = Depth(int(d) - i); }
|
inline void operator-= (Depth & d, int i) { d = Depth(int(d) - i); }
|
||||||
inline void operator-= (Depth &d1, Depth d2) { d1 -= int(d2); }
|
|
||||||
inline Depth operator* (Depth d, int i) { return Depth(int(d) * i); }
|
inline Depth operator* (Depth d, int i) { return Depth(int(d) * i); }
|
||||||
inline Depth operator* (int i, Depth d) { return Depth(int(d) * i); }
|
inline Depth operator* (int i, Depth d) { return Depth(int(d) * i); }
|
||||||
inline void operator*= (Depth &d, int i) { d = Depth(int(d) * i); }
|
inline void operator*= (Depth &d, int i) { d = Depth(int(d) * i); }
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+49
-23
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -224,19 +224,15 @@ namespace {
|
|||||||
|
|
||||||
const int AttackWeight[] = { 0, 0, KnightAttackWeight, BishopAttackWeight, RookAttackWeight, QueenAttackWeight };
|
const int AttackWeight[] = { 0, 0, KnightAttackWeight, BishopAttackWeight, RookAttackWeight, QueenAttackWeight };
|
||||||
|
|
||||||
// Bonuses for safe checks
|
// Bonuses for safe checks, initialized from UCI options
|
||||||
const int QueenContactCheckBonus = 3;
|
int QueenContactCheckBonus, DiscoveredCheckBonus;
|
||||||
const int DiscoveredCheckBonus = 3;
|
int QueenCheckBonus, RookCheckBonus, BishopCheckBonus, KnightCheckBonus;
|
||||||
const int QueenCheckBonus = 2;
|
|
||||||
const int RookCheckBonus = 1;
|
|
||||||
const int BishopCheckBonus = 1;
|
|
||||||
const int KnightCheckBonus = 1;
|
|
||||||
|
|
||||||
// Scan for queen contact mates?
|
// Scan for queen contact mates?
|
||||||
const bool QueenContactMates = true;
|
const bool QueenContactMates = true;
|
||||||
|
|
||||||
// Bonus for having a mate threat
|
// Bonus for having a mate threat, initialized from UCI options
|
||||||
const int MateThreatBonus = 3;
|
int MateThreatBonus;
|
||||||
|
|
||||||
// InitKingDanger[] contains bonuses based on the position of the defending
|
// InitKingDanger[] contains bonuses based on the position of the defending
|
||||||
// king.
|
// king.
|
||||||
@@ -257,8 +253,8 @@ namespace {
|
|||||||
|
|
||||||
// Pawn and material hash tables, indexed by the current thread id.
|
// Pawn and material hash tables, indexed by the current thread id.
|
||||||
// Note that they will be initialized at 0 being global variables.
|
// Note that they will be initialized at 0 being global variables.
|
||||||
MaterialInfoTable* MaterialTable[MAX_THREADS];
|
MaterialInfoTable* MaterialTable[THREAD_MAX];
|
||||||
PawnInfoTable* PawnTable[MAX_THREADS];
|
PawnInfoTable* PawnTable[THREAD_MAX];
|
||||||
|
|
||||||
// Sizes of pawn and material hash tables
|
// Sizes of pawn and material hash tables
|
||||||
const int PawnTableSize = 16384;
|
const int PawnTableSize = 16384;
|
||||||
@@ -309,7 +305,7 @@ template<bool HasPopCnt>
|
|||||||
Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) {
|
Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) {
|
||||||
|
|
||||||
assert(pos.is_ok());
|
assert(pos.is_ok());
|
||||||
assert(threadID >= 0 && threadID < MAX_THREADS);
|
assert(threadID >= 0 && threadID < THREAD_MAX);
|
||||||
assert(!pos.is_check());
|
assert(!pos.is_check());
|
||||||
|
|
||||||
memset(&ei, 0, sizeof(EvalInfo));
|
memset(&ei, 0, sizeof(EvalInfo));
|
||||||
@@ -440,13 +436,28 @@ Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) {
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
/// quick_evaluate() does a very approximate evaluation of the current position.
|
||||||
|
/// It currently considers only material and piece square table scores. Perhaps
|
||||||
|
/// we should add scores from the pawn and material hash tables?
|
||||||
|
|
||||||
|
Value quick_evaluate(const Position &pos) {
|
||||||
|
|
||||||
|
assert(pos.is_ok());
|
||||||
|
|
||||||
|
static const ScaleFactor sf[2] = {SCALE_FACTOR_NORMAL, SCALE_FACTOR_NORMAL};
|
||||||
|
|
||||||
|
Value v = scale_by_game_phase(pos.value(), MaterialInfoTable::game_phase(pos), sf);
|
||||||
|
return (pos.side_to_move() == WHITE ? v : -v);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// init_eval() initializes various tables used by the evaluation function
|
/// init_eval() initializes various tables used by the evaluation function
|
||||||
|
|
||||||
void init_eval(int threads) {
|
void init_eval(int threads) {
|
||||||
|
|
||||||
assert(threads <= MAX_THREADS);
|
assert(threads <= THREAD_MAX);
|
||||||
|
|
||||||
for (int i = 0; i < MAX_THREADS; i++)
|
for (int i = 0; i < THREAD_MAX; i++)
|
||||||
{
|
{
|
||||||
if (i >= threads)
|
if (i >= threads)
|
||||||
{
|
{
|
||||||
@@ -468,7 +479,7 @@ void init_eval(int threads) {
|
|||||||
|
|
||||||
void quit_eval() {
|
void quit_eval() {
|
||||||
|
|
||||||
for (int i = 0; i < MAX_THREADS; i++)
|
for (int i = 0; i < THREAD_MAX; i++)
|
||||||
{
|
{
|
||||||
delete PawnTable[i];
|
delete PawnTable[i];
|
||||||
delete MaterialTable[i];
|
delete MaterialTable[i];
|
||||||
@@ -864,13 +875,16 @@ namespace {
|
|||||||
// capturing a single attacking piece can therefore result in a score
|
// capturing a single attacking piece can therefore result in a score
|
||||||
// change far bigger than the value of the captured piece.
|
// change far bigger than the value of the captured piece.
|
||||||
Score v = apply_weight(make_score(SafetyTable[attackUnits], 0), WeightKingSafety[Us]);
|
Score v = apply_weight(make_score(SafetyTable[attackUnits], 0), WeightKingSafety[Us]);
|
||||||
|
|
||||||
ei.value -= Sign[Us] * v;
|
ei.value -= Sign[Us] * v;
|
||||||
ei.futilityMargin[Us] += mg_value(v);
|
|
||||||
|
if (Us == pos.side_to_move())
|
||||||
|
ei.futilityMargin += mg_value(v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// evaluate_passed_pawns_of_color() evaluates the passed pawns of the given color
|
// evaluate_passed_pawns() evaluates the passed pawns of the given color
|
||||||
|
|
||||||
template<Color Us>
|
template<Color Us>
|
||||||
void evaluate_passed_pawns_of_color(const Position& pos, int movesToGo[], Square pawnToGo[], EvalInfo& ei) {
|
void evaluate_passed_pawns_of_color(const Position& pos, int movesToGo[], Square pawnToGo[], EvalInfo& ei) {
|
||||||
@@ -1204,17 +1218,29 @@ namespace {
|
|||||||
|
|
||||||
void init_safety() {
|
void init_safety() {
|
||||||
|
|
||||||
int maxSlope = 30;
|
QueenContactCheckBonus = get_option_value_int("Queen Contact Check Bonus");
|
||||||
int peak = 0x500;
|
QueenCheckBonus = get_option_value_int("Queen Check Bonus");
|
||||||
double a = 0.4;
|
RookCheckBonus = get_option_value_int("Rook Check Bonus");
|
||||||
double b = 0.0;
|
BishopCheckBonus = get_option_value_int("Bishop Check Bonus");
|
||||||
|
KnightCheckBonus = get_option_value_int("Knight Check Bonus");
|
||||||
|
DiscoveredCheckBonus = get_option_value_int("Discovered Check Bonus");
|
||||||
|
MateThreatBonus = get_option_value_int("Mate Threat Bonus");
|
||||||
|
|
||||||
|
int maxSlope = get_option_value_int("King Safety Max Slope");
|
||||||
|
int peak = get_option_value_int("King Safety Max Value") * 256 / 100;
|
||||||
|
double a = get_option_value_int("King Safety Coefficient") / 100.0;
|
||||||
|
double b = get_option_value_int("King Safety X Intercept");
|
||||||
|
bool quad = (get_option_value_string("King Safety Curve") == "Quadratic");
|
||||||
|
bool linear = (get_option_value_string("King Safety Curve") == "Linear");
|
||||||
|
|
||||||
for (int i = 0; i < 100; i++)
|
for (int i = 0; i < 100; i++)
|
||||||
{
|
{
|
||||||
if (i < b)
|
if (i < b)
|
||||||
SafetyTable[i] = Value(0);
|
SafetyTable[i] = Value(0);
|
||||||
else
|
else if (quad)
|
||||||
SafetyTable[i] = Value((int)(a * (i - b) * (i - b)));
|
SafetyTable[i] = Value((int)(a * (i - b) * (i - b)));
|
||||||
|
else if (linear)
|
||||||
|
SafetyTable[i] = Value((int)(100 * a * (i - b)));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 100; i++)
|
for (int i = 0; i < 100; i++)
|
||||||
|
|||||||
+4
-5
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -47,8 +47,6 @@ class Position;
|
|||||||
|
|
||||||
struct EvalInfo {
|
struct EvalInfo {
|
||||||
|
|
||||||
EvalInfo() { futilityMargin[0] = futilityMargin[1] = Value(0); }
|
|
||||||
|
|
||||||
// Middle game and endgame evaluations
|
// Middle game and endgame evaluations
|
||||||
Score value;
|
Score value;
|
||||||
|
|
||||||
@@ -96,8 +94,8 @@ struct EvalInfo {
|
|||||||
Score mobility;
|
Score mobility;
|
||||||
|
|
||||||
// Extra futility margin. This is added to the standard futility margin
|
// Extra futility margin. This is added to the standard futility margin
|
||||||
// in the quiescence search. One for each color.
|
// in the quiescence search.
|
||||||
Value futilityMargin[2];
|
Value futilityMargin;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -106,6 +104,7 @@ struct EvalInfo {
|
|||||||
////
|
////
|
||||||
|
|
||||||
extern Value evaluate(const Position& pos, EvalInfo& ei, int threadID);
|
extern Value evaluate(const Position& pos, EvalInfo& ei, int threadID);
|
||||||
|
extern Value quick_evaluate(const Position& pos);
|
||||||
extern void init_eval(int threads);
|
extern void init_eval(int threads);
|
||||||
extern void quit_eval();
|
extern void quit_eval();
|
||||||
extern void read_weights(Color sideToMove);
|
extern void read_weights(Color sideToMove);
|
||||||
|
|||||||
+4
-27
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -42,7 +42,6 @@ History::History() { clear(); }
|
|||||||
|
|
||||||
void History::clear() {
|
void History::clear() {
|
||||||
memset(history, 0, 2 * 8 * 64 * sizeof(int));
|
memset(history, 0, 2 * 8 * 64 * sizeof(int));
|
||||||
memset(maxStaticValueDelta, 0, 2 * 8 * 64 * sizeof(int));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -62,7 +61,7 @@ void History::success(Piece p, Square to, Depth d) {
|
|||||||
if (history[p][to] >= HistoryMax)
|
if (history[p][to] >= HistoryMax)
|
||||||
for (int i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
for (int j = 0; j < 64; j++)
|
for (int j = 0; j < 64; j++)
|
||||||
history[i][j] /= 2;
|
history[i][j] /= 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -76,12 +75,8 @@ void History::failure(Piece p, Square to, Depth d) {
|
|||||||
assert(square_is_ok(to));
|
assert(square_is_ok(to));
|
||||||
|
|
||||||
history[p][to] -= int(d) * int(d);
|
history[p][to] -= int(d) * int(d);
|
||||||
|
if (history[p][to] < 0)
|
||||||
// Prevent history underflow
|
history[p][to] = 0;
|
||||||
if (history[p][to] <= -HistoryMax)
|
|
||||||
for (int i = 0; i < 16; i++)
|
|
||||||
for (int j = 0; j < 64; j++)
|
|
||||||
history[i][j] /= 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -95,21 +90,3 @@ int History::move_ordering_score(Piece p, Square to) const {
|
|||||||
|
|
||||||
return history[p][to];
|
return history[p][to];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// History::set_gain() and History::gain() store and retrieve the
|
|
||||||
/// gain of a move given the delta of the static position evaluations
|
|
||||||
/// before and after the move.
|
|
||||||
|
|
||||||
void History::set_gain(Piece p, Square to, Value delta)
|
|
||||||
{
|
|
||||||
if (delta >= maxStaticValueDelta[p][to])
|
|
||||||
maxStaticValueDelta[p][to] = delta;
|
|
||||||
else
|
|
||||||
maxStaticValueDelta[p][to]--;
|
|
||||||
}
|
|
||||||
|
|
||||||
Value History::gain(Piece p, Square to) const
|
|
||||||
{
|
|
||||||
return Value(maxStaticValueDelta[p][to]);
|
|
||||||
}
|
|
||||||
|
|||||||
+3
-7
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -28,7 +28,6 @@
|
|||||||
#include "depth.h"
|
#include "depth.h"
|
||||||
#include "move.h"
|
#include "move.h"
|
||||||
#include "piece.h"
|
#include "piece.h"
|
||||||
#include "value.h"
|
|
||||||
|
|
||||||
|
|
||||||
////
|
////
|
||||||
@@ -50,12 +49,9 @@ public:
|
|||||||
void success(Piece p, Square to, Depth d);
|
void success(Piece p, Square to, Depth d);
|
||||||
void failure(Piece p, Square to, Depth d);
|
void failure(Piece p, Square to, Depth d);
|
||||||
int move_ordering_score(Piece p, Square to) const;
|
int move_ordering_score(Piece p, Square to) const;
|
||||||
void set_gain(Piece p, Square to, Value delta);
|
|
||||||
Value gain(Piece p, Square to) const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int history[16][64]; // [piece][square]
|
int history[16][64]; // [piece][square]
|
||||||
int maxStaticValueDelta[16][64]; // [piece][from_square][to_square]
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -65,13 +61,13 @@ private:
|
|||||||
|
|
||||||
/// HistoryMax controls how often the history counters will be scaled down:
|
/// HistoryMax controls how often the history counters will be scaled down:
|
||||||
/// When the history score for a move gets bigger than HistoryMax, all
|
/// When the history score for a move gets bigger than HistoryMax, all
|
||||||
/// entries in the table are divided by 2. It is difficult to guess what
|
/// entries in the table are divided by 4. It is difficult to guess what
|
||||||
/// the ideal value of this constant is. Scaling down the scores often has
|
/// the ideal value of this constant is. Scaling down the scores often has
|
||||||
/// the effect that parts of the search tree which have been searched
|
/// the effect that parts of the search tree which have been searched
|
||||||
/// recently have a bigger importance for move ordering than the moves which
|
/// recently have a bigger importance for move ordering than the moves which
|
||||||
/// have been searched a long time ago.
|
/// have been searched a long time ago.
|
||||||
|
|
||||||
const int HistoryMax = 50000 * OnePly;
|
const int HistoryMax = 25000 * OnePly;
|
||||||
|
|
||||||
|
|
||||||
#endif // !defined(HISTORY_H_INCLUDED)
|
#endif // !defined(HISTORY_H_INCLUDED)
|
||||||
|
|||||||
+2
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -99,4 +99,5 @@ typedef CRITICAL_SECTION Lock;
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif // !defined(LOCK_H_INCLUDED)
|
#endif // !defined(LOCK_H_INCLUDED)
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+6
-64
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,9 +27,6 @@
|
|||||||
# include <sys/time.h>
|
# include <sys/time.h>
|
||||||
# include <sys/types.h>
|
# include <sys/types.h>
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
# if defined(__hpux)
|
|
||||||
# include <sys/pstat.h>
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
@@ -41,7 +38,6 @@
|
|||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <cstring>
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
@@ -54,7 +50,7 @@ using namespace std;
|
|||||||
/// Version number. If this is left empty, the current date (in the format
|
/// Version number. If this is left empty, the current date (in the format
|
||||||
/// YYMMDD) is used as a version number.
|
/// YYMMDD) is used as a version number.
|
||||||
|
|
||||||
static const string EngineVersion = "1.7";
|
static const string EngineVersion = "1.6.3";
|
||||||
static const string AppName = "Stockfish";
|
static const string AppName = "Stockfish";
|
||||||
static const string AppTag = "";
|
static const string AppTag = "";
|
||||||
|
|
||||||
@@ -183,32 +179,23 @@ int get_system_time() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// builtin_cpu_count() tries to detect the number of CPU cores, if
|
/// cpu_count() tries to detect the number of CPU cores.
|
||||||
/// hyper-threading is enabled this is the number of logical processors.
|
|
||||||
|
|
||||||
#if !defined(_MSC_VER)
|
#if !defined(_MSC_VER)
|
||||||
|
|
||||||
# if defined(_SC_NPROCESSORS_ONLN)
|
# if defined(_SC_NPROCESSORS_ONLN)
|
||||||
static int builtin_cpu_count() {
|
int cpu_count() {
|
||||||
return Min(sysconf(_SC_NPROCESSORS_ONLN), 8);
|
return Min(sysconf(_SC_NPROCESSORS_ONLN), 8);
|
||||||
}
|
}
|
||||||
# elif defined(__hpux)
|
|
||||||
static int builtin_cpu_count() {
|
|
||||||
struct pst_dynamic psd;
|
|
||||||
if (pstat_getdynamic(&psd, sizeof(psd), (size_t)1, 0) == -1)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return Min(psd.psd_proc_cnt, 8);
|
|
||||||
}
|
|
||||||
# else
|
# else
|
||||||
static int builtin_cpu_count() {
|
int cpu_count() {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static int builtin_cpu_count() {
|
int cpu_count() {
|
||||||
SYSTEM_INFO s;
|
SYSTEM_INFO s;
|
||||||
GetSystemInfo(&s);
|
GetSystemInfo(&s);
|
||||||
return Min(s.dwNumberOfProcessors, 8);
|
return Min(s.dwNumberOfProcessors, 8);
|
||||||
@@ -217,51 +204,6 @@ static int builtin_cpu_count() {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/// HT_enabled() returns true if hyper-threading is enabled on current machine
|
|
||||||
|
|
||||||
static bool HT_enabled() {
|
|
||||||
|
|
||||||
char CPUString[0x20];
|
|
||||||
int CPUInfo[4] = {-1};
|
|
||||||
int nIds, nLogicalCPU, nCores;
|
|
||||||
|
|
||||||
// Detect CPU producer
|
|
||||||
__cpuid(CPUInfo, 0);
|
|
||||||
nIds = CPUInfo[0];
|
|
||||||
|
|
||||||
memset(CPUString, 0, sizeof(CPUString));
|
|
||||||
memcpy(&CPUString[0], &CPUInfo[1], sizeof(int));
|
|
||||||
memcpy(&CPUString[4], &CPUInfo[3], sizeof(int));
|
|
||||||
memcpy(&CPUString[8], &CPUInfo[2], sizeof(int));
|
|
||||||
|
|
||||||
// Not an Intel CPU or CPUID.4 not supported
|
|
||||||
if (strcmp(CPUString, "GenuineIntel") || nIds < 4)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Detect if HT Technology is supported
|
|
||||||
__cpuid(CPUInfo, 1);
|
|
||||||
if (!((CPUInfo[3] >> 28) & 1))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
nLogicalCPU = (CPUInfo[1] >> 16) & 0xFF;
|
|
||||||
|
|
||||||
// Detect number of cores
|
|
||||||
__cpuid(CPUInfo, 4);
|
|
||||||
nCores = 1 + ((CPUInfo[0] >> 26) & 0x3F);
|
|
||||||
|
|
||||||
return nLogicalCPU > nCores;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// cpu_count() tries to detect the number of physical CPU cores taking
|
|
||||||
/// in account hyper-threading.
|
|
||||||
|
|
||||||
int cpu_count() {
|
|
||||||
|
|
||||||
return HT_enabled() ? builtin_cpu_count() / 2 : builtin_cpu_count();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
From Beowulf, from Olithink
|
From Beowulf, from Olithink
|
||||||
*/
|
*/
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+26
-6
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -86,10 +86,10 @@ inline void insertion_sort(T* firstMove, T* lastMove)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Our dedicated sort in range [firstMove, lastMove), first splits
|
// Our dedicated sort in range [firstMove, lastMove), it is well
|
||||||
// positive scores from ramining then order seaprately the two sets.
|
// tuned for non-captures where we have a lot of zero scored moves.
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline void sort_moves(T* firstMove, T* lastMove, T** lastPositive)
|
inline void sort_moves(T* firstMove, T* lastMove)
|
||||||
{
|
{
|
||||||
T tmp;
|
T tmp;
|
||||||
T *p, *d;
|
T *p, *d;
|
||||||
@@ -114,9 +114,29 @@ inline void sort_moves(T* firstMove, T* lastMove, T** lastPositive)
|
|||||||
|
|
||||||
} while (p != d);
|
} while (p != d);
|
||||||
|
|
||||||
// Sort just positive scored moves, remaining only when we get there
|
// Sort positives
|
||||||
insertion_sort<T>(firstMove, p);
|
insertion_sort<T>(firstMove, p);
|
||||||
*lastPositive = p;
|
|
||||||
|
d = lastMove;
|
||||||
|
p--;
|
||||||
|
|
||||||
|
// Split zero vs negatives
|
||||||
|
do {
|
||||||
|
while ((++p)->score == 0);
|
||||||
|
|
||||||
|
if (p != d)
|
||||||
|
{
|
||||||
|
while (--d != p && d->score < 0);
|
||||||
|
|
||||||
|
tmp = *p;
|
||||||
|
*p = *d;
|
||||||
|
*d = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (p != d);
|
||||||
|
|
||||||
|
// Sort negatives
|
||||||
|
insertion_sort<T>(p, lastMove);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Picks up the best move in range [curMove, lastMove), one per cycle.
|
// Picks up the best move in range [curMove, lastMove), one per cycle.
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+33
-40
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -71,11 +71,11 @@ namespace {
|
|||||||
/// move ordering is at the current node.
|
/// move ordering is at the current node.
|
||||||
|
|
||||||
MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
|
MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
|
||||||
const History& h, SearchStack* ss, Value beta) : pos(p), H(h) {
|
const History& h, SearchStack* ss) : pos(p), H(h) {
|
||||||
int searchTT = ttm;
|
int searchTT = ttm;
|
||||||
ttMoves[0].move = ttm;
|
ttMoves[0].move = ttm;
|
||||||
|
finished = false;
|
||||||
lastBadCapture = badCaptures;
|
lastBadCapture = badCaptures;
|
||||||
badCaptureThreshold = 0;
|
|
||||||
|
|
||||||
pinned = p.pinned_pieces(pos.side_to_move());
|
pinned = p.pinned_pieces(pos.side_to_move());
|
||||||
|
|
||||||
@@ -91,26 +91,12 @@ MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
|
|||||||
if (p.is_check())
|
if (p.is_check())
|
||||||
phasePtr = EvasionsPhaseTable;
|
phasePtr = EvasionsPhaseTable;
|
||||||
else if (d > Depth(0))
|
else if (d > Depth(0))
|
||||||
{
|
|
||||||
// Consider sligtly negative captures as good if at low
|
|
||||||
// depth and far from beta.
|
|
||||||
if (ss && ss->eval < beta - PawnValueMidgame && d < 3 * OnePly)
|
|
||||||
badCaptureThreshold = -PawnValueMidgame;
|
|
||||||
|
|
||||||
phasePtr = MainSearchPhaseTable;
|
phasePtr = MainSearchPhaseTable;
|
||||||
} else if (d == Depth(0))
|
else if (d == Depth(0))
|
||||||
phasePtr = QsearchWithChecksPhaseTable;
|
phasePtr = QsearchWithChecksPhaseTable;
|
||||||
else
|
else
|
||||||
{
|
|
||||||
phasePtr = QsearchWithoutChecksPhaseTable;
|
phasePtr = QsearchWithoutChecksPhaseTable;
|
||||||
|
|
||||||
// Skip TT move if is not a capture or a promotion, this avoids
|
|
||||||
// qsearch tree explosion due to a possible perpetual check or
|
|
||||||
// similar rare cases when TT table is full.
|
|
||||||
if (ttm != MOVE_NONE && !pos.move_is_capture_or_promotion(ttm))
|
|
||||||
searchTT = ttMoves[0].move = MOVE_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
phasePtr += !searchTT - 1;
|
phasePtr += !searchTT - 1;
|
||||||
go_next_phase();
|
go_next_phase();
|
||||||
}
|
}
|
||||||
@@ -143,7 +129,7 @@ void MovePicker::go_next_phase() {
|
|||||||
case PH_NONCAPTURES:
|
case PH_NONCAPTURES:
|
||||||
lastMove = generate_noncaptures(pos, moves);
|
lastMove = generate_noncaptures(pos, moves);
|
||||||
score_noncaptures();
|
score_noncaptures();
|
||||||
sort_moves(moves, lastMove, &lastGoodNonCapture);
|
sort_moves(moves, lastMove);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_BAD_CAPTURES:
|
case PH_BAD_CAPTURES:
|
||||||
@@ -156,7 +142,7 @@ void MovePicker::go_next_phase() {
|
|||||||
case PH_EVASIONS:
|
case PH_EVASIONS:
|
||||||
assert(pos.is_check());
|
assert(pos.is_check());
|
||||||
lastMove = generate_evasions(pos, moves);
|
lastMove = generate_evasions(pos, moves);
|
||||||
score_evasions_or_checks();
|
score_evasions();
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_QCAPTURES:
|
case PH_QCAPTURES:
|
||||||
@@ -165,12 +151,12 @@ void MovePicker::go_next_phase() {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_QCHECKS:
|
case PH_QCHECKS:
|
||||||
|
// Perhaps we should order moves move here? FIXME
|
||||||
lastMove = generate_non_capture_checks(pos, moves);
|
lastMove = generate_non_capture_checks(pos, moves);
|
||||||
score_evasions_or_checks();
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case PH_STOP:
|
case PH_STOP:
|
||||||
lastMove = curMove + 1; // Avoids another go_next_phase() call
|
lastMove = curMove + 1; // hack to be friendly for get_next_move()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@@ -230,16 +216,16 @@ void MovePicker::score_noncaptures() {
|
|||||||
piece = pos.piece_on(from);
|
piece = pos.piece_on(from);
|
||||||
hs = H.move_ordering_score(piece, to);
|
hs = H.move_ordering_score(piece, to);
|
||||||
|
|
||||||
// Ensure history has always highest priority
|
// Ensure history is always preferred to pst
|
||||||
if (hs > 0)
|
if (hs > 0)
|
||||||
hs += 10000;
|
hs += 1000;
|
||||||
|
|
||||||
// Gain table based scoring
|
// pst based scoring
|
||||||
cur->score = hs + 16 * H.gain(piece, to);
|
cur->score = hs + mg_value(pos.pst_delta(piece, from, to));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MovePicker::score_evasions_or_checks() {
|
void MovePicker::score_evasions() {
|
||||||
// Try good captures ordered by MVV/LVA, then non-captures if
|
// Try good captures ordered by MVV/LVA, then non-captures if
|
||||||
// destination square is not under attack, ordered by history
|
// destination square is not under attack, ordered by history
|
||||||
// value, and at the end bad-captures and non-captures with a
|
// value, and at the end bad-captures and non-captures with a
|
||||||
@@ -247,15 +233,11 @@ void MovePicker::score_evasions_or_checks() {
|
|||||||
Move m;
|
Move m;
|
||||||
int seeScore;
|
int seeScore;
|
||||||
|
|
||||||
// Skip if we don't have at least two moves to order
|
|
||||||
if (lastMove < moves + 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (MoveStack* cur = moves; cur != lastMove; cur++)
|
for (MoveStack* cur = moves; cur != lastMove; cur++)
|
||||||
{
|
{
|
||||||
m = cur->move;
|
m = cur->move;
|
||||||
if ((seeScore = pos.see_sign(m)) < 0)
|
if ((seeScore = pos.see_sign(m)) < 0)
|
||||||
cur->score = seeScore - HistoryMax; // Be sure are at the bottom
|
cur->score = seeScore;
|
||||||
else if (pos.move_is_capture(m))
|
else if (pos.move_is_capture(m))
|
||||||
cur->score = pos.midgame_value_of_piece_on(move_to(m))
|
cur->score = pos.midgame_value_of_piece_on(move_to(m))
|
||||||
- pos.type_of_piece_on(move_from(m)) + HistoryMax;
|
- pos.type_of_piece_on(move_from(m)) + HistoryMax;
|
||||||
@@ -269,8 +251,6 @@ void MovePicker::score_evasions_or_checks() {
|
|||||||
/// are no more moves left.
|
/// are no more moves left.
|
||||||
/// It picks the move with the biggest score from a list of generated moves taking
|
/// It picks the move with the biggest score from a list of generated moves taking
|
||||||
/// care not to return the tt move if has already been searched previously.
|
/// care not to return the tt move if has already been searched previously.
|
||||||
/// Note that this function is not thread safe so should be lock protected by
|
|
||||||
/// caller when accessed through a shared MovePicker object.
|
|
||||||
|
|
||||||
Move MovePicker::get_next_move() {
|
Move MovePicker::get_next_move() {
|
||||||
|
|
||||||
@@ -297,7 +277,7 @@ Move MovePicker::get_next_move() {
|
|||||||
{
|
{
|
||||||
// Check for a non negative SEE now
|
// Check for a non negative SEE now
|
||||||
int seeValue = pos.see_sign(move);
|
int seeValue = pos.see_sign(move);
|
||||||
if (seeValue >= badCaptureThreshold)
|
if (seeValue >= 0)
|
||||||
return move;
|
return move;
|
||||||
|
|
||||||
// Losing capture, move it to the badCaptures[] array, note
|
// Losing capture, move it to the badCaptures[] array, note
|
||||||
@@ -320,11 +300,6 @@ Move MovePicker::get_next_move() {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case PH_NONCAPTURES:
|
case PH_NONCAPTURES:
|
||||||
|
|
||||||
// Sort negative scored moves only when we get there
|
|
||||||
if (curMove == lastGoodNonCapture)
|
|
||||||
insertion_sort(lastGoodNonCapture, lastMove);
|
|
||||||
|
|
||||||
move = (curMove++)->move;
|
move = (curMove++)->move;
|
||||||
if ( move != ttMoves[0].move
|
if ( move != ttMoves[0].move
|
||||||
&& move != ttMoves[1].move
|
&& move != ttMoves[1].move
|
||||||
@@ -365,3 +340,21 @@ Move MovePicker::get_next_move() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A variant of get_next_move() which takes a lock as a parameter, used to
|
||||||
|
/// prevent multiple threads from picking the same move at a split point.
|
||||||
|
|
||||||
|
Move MovePicker::get_next_move(Lock &lock) {
|
||||||
|
|
||||||
|
lock_grab(&lock);
|
||||||
|
if (finished)
|
||||||
|
{
|
||||||
|
lock_release(&lock);
|
||||||
|
return MOVE_NONE;
|
||||||
|
}
|
||||||
|
Move m = get_next_move();
|
||||||
|
if (m == MOVE_NONE)
|
||||||
|
finished = true;
|
||||||
|
|
||||||
|
lock_release(&lock);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|||||||
+8
-5
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "depth.h"
|
#include "depth.h"
|
||||||
#include "history.h"
|
#include "history.h"
|
||||||
|
#include "lock.h"
|
||||||
#include "position.h"
|
#include "position.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -49,22 +50,24 @@ class MovePicker {
|
|||||||
MovePicker& operator=(const MovePicker&); // silence a warning under MSVC
|
MovePicker& operator=(const MovePicker&); // silence a warning under MSVC
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL, Value beta = -VALUE_INFINITE);
|
MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL);
|
||||||
Move get_next_move();
|
Move get_next_move();
|
||||||
|
Move get_next_move(Lock& lock);
|
||||||
int number_of_evasions() const;
|
int number_of_evasions() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void score_captures();
|
void score_captures();
|
||||||
void score_noncaptures();
|
void score_noncaptures();
|
||||||
void score_evasions_or_checks();
|
void score_evasions();
|
||||||
void go_next_phase();
|
void go_next_phase();
|
||||||
|
|
||||||
const Position& pos;
|
const Position& pos;
|
||||||
const History& H;
|
const History& H;
|
||||||
MoveStack ttMoves[2], killers[2];
|
MoveStack ttMoves[2], killers[2];
|
||||||
int badCaptureThreshold, phase;
|
bool finished;
|
||||||
|
int phase;
|
||||||
const uint8_t* phasePtr;
|
const uint8_t* phasePtr;
|
||||||
MoveStack *curMove, *lastMove, *lastGoodNonCapture, *lastBadCapture;
|
MoveStack *curMove, *lastMove, *lastBadCapture;
|
||||||
Bitboard pinned;
|
Bitboard pinned;
|
||||||
MoveStack moves[256], badCaptures[64];
|
MoveStack moves[256], badCaptures[64];
|
||||||
};
|
};
|
||||||
|
|||||||
+27
-17
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -226,16 +226,21 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
|
|||||||
Bitboard b = outpost_mask(Us, s) & theirPawns & (FileFBB | FileGBB | FileHBB);
|
Bitboard b = outpost_mask(Us, s) & theirPawns & (FileFBB | FileGBB | FileHBB);
|
||||||
while (b)
|
while (b)
|
||||||
{
|
{
|
||||||
// Give a bonus according to the distance of the nearest enemy pawn
|
|
||||||
Square s2 = pop_1st_bit(&b);
|
Square s2 = pop_1st_bit(&b);
|
||||||
int v = StormLeverBonus[f] - 2 * square_distance(s, s2);
|
|
||||||
|
|
||||||
// If enemy pawn has no pawn beside itself is particularly vulnerable.
|
|
||||||
// Big bonus, especially against a weakness on the rook file
|
|
||||||
if (!(theirPawns & neighboring_files_bb(s2) & rank_bb(s2)))
|
if (!(theirPawns & neighboring_files_bb(s2) & rank_bb(s2)))
|
||||||
v *= (square_file(s2) == FILE_H ? 4 : 2);
|
{
|
||||||
|
// The enemy pawn has no pawn beside itself, which makes it
|
||||||
bonus += v;
|
// particularly vulnerable. Big bonus, especially against a
|
||||||
|
// weakness on the rook file.
|
||||||
|
if (square_file(s2) == FILE_H)
|
||||||
|
bonus += 4*StormLeverBonus[f] - 8*square_distance(s, s2);
|
||||||
|
else
|
||||||
|
bonus += 2*StormLeverBonus[f] - 4*square_distance(s, s2);
|
||||||
|
} else
|
||||||
|
// There is at least one enemy pawn beside the enemy pawn we look
|
||||||
|
// at, which means that the pawn has somewhat better chances of
|
||||||
|
// defending itself by advancing. Smaller bonus.
|
||||||
|
bonus += StormLeverBonus[f] - 2*square_distance(s, s2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pi->ksStormValue[Us] += bonus;
|
pi->ksStormValue[Us] += bonus;
|
||||||
@@ -247,16 +252,21 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
|
|||||||
Bitboard b = outpost_mask(Us, s) & theirPawns & (FileABB | FileBBB | FileCBB);
|
Bitboard b = outpost_mask(Us, s) & theirPawns & (FileABB | FileBBB | FileCBB);
|
||||||
while (b)
|
while (b)
|
||||||
{
|
{
|
||||||
// Give a bonus according to the distance of the nearest enemy pawn
|
|
||||||
Square s2 = pop_1st_bit(&b);
|
Square s2 = pop_1st_bit(&b);
|
||||||
int v = StormLeverBonus[f] - 4 * square_distance(s, s2);
|
|
||||||
|
|
||||||
// If enemy pawn has no pawn beside itself is particularly vulnerable.
|
|
||||||
// Big bonus, especially against a weakness on the rook file
|
|
||||||
if (!(theirPawns & neighboring_files_bb(s2) & rank_bb(s2)))
|
if (!(theirPawns & neighboring_files_bb(s2) & rank_bb(s2)))
|
||||||
v *= (square_file(s2) == FILE_A ? 4 : 2);
|
{
|
||||||
|
// The enemy pawn has no pawn beside itself, which makes it
|
||||||
bonus += v;
|
// particularly vulnerable. Big bonus, especially against a
|
||||||
|
// weakness on the rook file.
|
||||||
|
if (square_file(s2) == FILE_A)
|
||||||
|
bonus += 4*StormLeverBonus[f] - 16*square_distance(s, s2);
|
||||||
|
else
|
||||||
|
bonus += 2*StormLeverBonus[f] - 8*square_distance(s, s2);
|
||||||
|
} else
|
||||||
|
// There is at least one enemy pawn beside the enemy pawn we look
|
||||||
|
// at, which means that the pawn has somewhat better chances of
|
||||||
|
// defending itself by advancing. Smaller bonus.
|
||||||
|
bonus += StormLeverBonus[f] - 4*square_distance(s, s2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pi->qsStormValue[Us] += bonus;
|
pi->qsStormValue[Us] += bonus;
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+31
-35
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -44,6 +44,8 @@ using std::string;
|
|||||||
//// Variables
|
//// Variables
|
||||||
////
|
////
|
||||||
|
|
||||||
|
int Position::castleRightsMask[64];
|
||||||
|
|
||||||
Key Position::zobrist[2][8][64];
|
Key Position::zobrist[2][8][64];
|
||||||
Key Position::zobEp[64];
|
Key Position::zobEp[64];
|
||||||
Key Position::zobCastle[16];
|
Key Position::zobCastle[16];
|
||||||
@@ -74,39 +76,15 @@ CheckInfo::CheckInfo(const Position& pos) {
|
|||||||
checkSq[KING] = EmptyBoardBB;
|
checkSq[KING] = EmptyBoardBB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Position c'tors. Here we always create a slower but safer copy of
|
|
||||||
/// the original position or the FEN string, we want the new born Position
|
|
||||||
/// object do not depend on any external data. Instead if we know what we
|
|
||||||
/// are doing and we need speed we can create a position with default
|
|
||||||
/// c'tor Position() and then use just fast_copy().
|
|
||||||
|
|
||||||
Position::Position() {}
|
|
||||||
|
|
||||||
Position::Position(const Position& pos) {
|
Position::Position(const Position& pos) {
|
||||||
|
copy(pos);
|
||||||
memcpy(this, &pos, sizeof(Position));
|
|
||||||
detach(); // Always detach() in copy c'tor to avoid surprises
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Position::Position(const string& fen) {
|
Position::Position(const string& fen) {
|
||||||
|
|
||||||
from_fen(fen);
|
from_fen(fen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Position::detach() copies the content of the current state and castling
|
|
||||||
/// masks inside the position itself. This is needed when the st pointee could
|
|
||||||
/// become stale, as example because the caller is about to going out of scope.
|
|
||||||
|
|
||||||
void Position::detach() {
|
|
||||||
|
|
||||||
startState = *st;
|
|
||||||
st = &startState;
|
|
||||||
st->previous = NULL; // as a safe guard
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Position::from_fen() initializes the position object with the given FEN
|
/// Position::from_fen() initializes the position object with the given FEN
|
||||||
/// string. This function is not very robust - make sure that input FENs are
|
/// string. This function is not very robust - make sure that input FENs are
|
||||||
/// correct (this is assumed to be the responsibility of the GUI).
|
/// correct (this is assumed to be the responsibility of the GUI).
|
||||||
@@ -341,9 +319,8 @@ void Position::print(Move m) const {
|
|||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
if (m != MOVE_NONE)
|
if (m != MOVE_NONE)
|
||||||
{
|
{
|
||||||
Position p(*this);
|
|
||||||
string col = (color_of_piece_on(move_from(m)) == BLACK ? ".." : "");
|
string col = (color_of_piece_on(move_from(m)) == BLACK ? ".." : "");
|
||||||
std::cout << "Move is: " << col << move_to_san(p, m) << std::endl;
|
std::cout << "Move is: " << col << move_to_san(*this, m) << std::endl;
|
||||||
}
|
}
|
||||||
for (Rank rank = RANK_8; rank >= RANK_1; rank--)
|
for (Rank rank = RANK_8; rank >= RANK_1; rank--)
|
||||||
{
|
{
|
||||||
@@ -368,11 +345,20 @@ void Position::print(Move m) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Position::copy() creates a copy of the input position.
|
||||||
|
|
||||||
|
void Position::copy(const Position& pos) {
|
||||||
|
|
||||||
|
memcpy(this, &pos, sizeof(Position));
|
||||||
|
saveState(); // detach and copy state info
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Position:hidden_checkers<>() returns a bitboard of all pinned (against the
|
/// Position:hidden_checkers<>() returns a bitboard of all pinned (against the
|
||||||
/// king) pieces for the given color and for the given pinner type. Or, when
|
/// king) pieces for the given color and for the given pinner type. Or, when
|
||||||
/// template parameter FindPinned is false, the pieces of the given color
|
/// template parameter FindPinned is false, the pieces of the given color
|
||||||
/// candidate for a discovery check against the enemy king.
|
/// candidate for a discovery check against the enemy king.
|
||||||
/// Bitboard checkersBB must be already updated when looking for pinners.
|
/// Note that checkersBB bitboard must be already updated.
|
||||||
|
|
||||||
template<bool FindPinned>
|
template<bool FindPinned>
|
||||||
Bitboard Position::hidden_checkers(Color c) const {
|
Bitboard Position::hidden_checkers(Color c) const {
|
||||||
@@ -406,8 +392,7 @@ Bitboard Position::hidden_checkers(Color c) const {
|
|||||||
|
|
||||||
|
|
||||||
/// Position:pinned_pieces() returns a bitboard of all pinned (against the
|
/// Position:pinned_pieces() returns a bitboard of all pinned (against the
|
||||||
/// king) pieces for the given color. Note that checkersBB bitboard must
|
/// king) pieces for the given color.
|
||||||
/// be already updated.
|
|
||||||
|
|
||||||
Bitboard Position::pinned_pieces(Color c) const {
|
Bitboard Position::pinned_pieces(Color c) const {
|
||||||
|
|
||||||
@@ -417,8 +402,7 @@ Bitboard Position::pinned_pieces(Color c) const {
|
|||||||
|
|
||||||
/// Position:discovered_check_candidates() returns a bitboard containing all
|
/// Position:discovered_check_candidates() returns a bitboard containing all
|
||||||
/// pieces for the given side which are candidates for giving a discovered
|
/// pieces for the given side which are candidates for giving a discovered
|
||||||
/// check. Contrary to pinned_pieces() here there is no need of checkersBB
|
/// check.
|
||||||
/// to be already updated.
|
|
||||||
|
|
||||||
Bitboard Position::discovered_check_candidates(Color c) const {
|
Bitboard Position::discovered_check_candidates(Color c) const {
|
||||||
|
|
||||||
@@ -1457,6 +1441,19 @@ int Position::see(Square from, Square to) const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Position::saveState() copies the content of the current state
|
||||||
|
/// inside startState and makes st point to it. This is needed
|
||||||
|
/// when the st pointee could become stale, as example because
|
||||||
|
/// the caller is about to going out of scope.
|
||||||
|
|
||||||
|
void Position::saveState() {
|
||||||
|
|
||||||
|
startState = *st;
|
||||||
|
st = &startState;
|
||||||
|
st->previous = NULL; // as a safe guard
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Position::clear() erases the position object to a pristine state, with an
|
/// Position::clear() erases the position object to a pristine state, with an
|
||||||
/// empty board, white to move, and no castling rights.
|
/// empty board, white to move, and no castling rights.
|
||||||
|
|
||||||
@@ -1658,7 +1655,6 @@ Value Position::compute_non_pawn_material(Color c) const {
|
|||||||
/// Position::is_draw() tests whether the position is drawn by material,
|
/// Position::is_draw() tests whether the position is drawn by material,
|
||||||
/// repetition, or the 50 moves rule. It does not detect stalemates, this
|
/// repetition, or the 50 moves rule. It does not detect stalemates, this
|
||||||
/// must be done by the search.
|
/// must be done by the search.
|
||||||
// FIXME: Currently we are not handling 50 move rule correctly when in check
|
|
||||||
|
|
||||||
bool Position::is_draw() const {
|
bool Position::is_draw() const {
|
||||||
|
|
||||||
@@ -1672,7 +1668,7 @@ bool Position::is_draw() const {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Draw by repetition?
|
// Draw by repetition?
|
||||||
for (int i = 4; i <= Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2)
|
for (int i = 2; i < Min(Min(gamePly, st->rule50), st->pliesFromNull); i += 2)
|
||||||
if (history[gamePly - i] == st->key)
|
if (history[gamePly - i] == st->key)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|||||||
+7
-13
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -146,9 +146,9 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
Position();
|
Position() {}
|
||||||
explicit Position(const Position& pos);
|
Position(const Position& pos);
|
||||||
explicit Position(const std::string& fen);
|
Position(const std::string& fen);
|
||||||
|
|
||||||
// Text input/output
|
// Text input/output
|
||||||
void from_fen(const std::string& fen);
|
void from_fen(const std::string& fen);
|
||||||
@@ -156,6 +156,7 @@ public:
|
|||||||
void print(Move m = MOVE_NONE) const;
|
void print(Move m = MOVE_NONE) const;
|
||||||
|
|
||||||
// Copying
|
// Copying
|
||||||
|
void copy(const Position& pos);
|
||||||
void flipped_copy(const Position& pos);
|
void flipped_copy(const Position& pos);
|
||||||
|
|
||||||
// The piece on a given square
|
// The piece on a given square
|
||||||
@@ -223,9 +224,6 @@ public:
|
|||||||
bool move_is_passed_pawn_push(Move m) const;
|
bool move_is_passed_pawn_push(Move m) const;
|
||||||
bool move_attacks_square(Move m, Square s) const;
|
bool move_attacks_square(Move m, Square s) const;
|
||||||
|
|
||||||
// Piece captured with previous moves
|
|
||||||
PieceType captured_piece() const;
|
|
||||||
|
|
||||||
// Information about pawns
|
// Information about pawns
|
||||||
bool pawn_is_passed(Color c, Square s) const;
|
bool pawn_is_passed(Color c, Square s) const;
|
||||||
static bool pawn_is_passed(Bitboard theirPawns, Color c, Square s);
|
static bool pawn_is_passed(Bitboard theirPawns, Color c, Square s);
|
||||||
@@ -236,7 +234,7 @@ public:
|
|||||||
bool square_is_weak(Square s, Color c) const;
|
bool square_is_weak(Square s, Color c) const;
|
||||||
|
|
||||||
// Doing and undoing moves
|
// Doing and undoing moves
|
||||||
void detach();
|
void saveState();
|
||||||
void do_move(Move m, StateInfo& st);
|
void do_move(Move m, StateInfo& st);
|
||||||
void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck);
|
void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck);
|
||||||
void undo_move(Move m);
|
void undo_move(Move m);
|
||||||
@@ -328,12 +326,12 @@ private:
|
|||||||
Color sideToMove;
|
Color sideToMove;
|
||||||
int gamePly;
|
int gamePly;
|
||||||
Key history[MaxGameLength];
|
Key history[MaxGameLength];
|
||||||
int castleRightsMask[64];
|
|
||||||
File initialKFile, initialKRFile, initialQRFile;
|
File initialKFile, initialKRFile, initialQRFile;
|
||||||
StateInfo startState;
|
StateInfo startState;
|
||||||
StateInfo* st;
|
StateInfo* st;
|
||||||
|
|
||||||
// Static variables
|
// Static variables
|
||||||
|
static int castleRightsMask[64];
|
||||||
static Key zobrist[2][8][64];
|
static Key zobrist[2][8][64];
|
||||||
static Key zobEp[64];
|
static Key zobEp[64];
|
||||||
static Key zobCastle[16];
|
static Key zobCastle[16];
|
||||||
@@ -569,8 +567,4 @@ inline bool Position::move_is_capture_or_promotion(Move m) const {
|
|||||||
return (m & (0x1F << 12)) ? !move_is_castle(m) : !square_is_empty(move_to(m));
|
return (m & (0x1F << 12)) ? !move_is_castle(m) : !square_is_empty(move_to(m));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline PieceType Position::captured_piece() const {
|
|
||||||
return st->capture;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // !defined(POSITION_H_INCLUDED)
|
#endif // !defined(POSITION_H_INCLUDED)
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+6
-6
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -63,7 +63,7 @@ namespace {
|
|||||||
/// that the move is a legal move from the position. The return value is
|
/// that the move is a legal move from the position. The return value is
|
||||||
/// a string containing the move in short algebraic notation.
|
/// a string containing the move in short algebraic notation.
|
||||||
|
|
||||||
const string move_to_san(Position& pos, Move m) {
|
const string move_to_san(const Position& pos, Move m) {
|
||||||
|
|
||||||
assert(pos.is_ok());
|
assert(pos.is_ok());
|
||||||
assert(move_is_ok(m));
|
assert(move_is_ok(m));
|
||||||
@@ -123,10 +123,10 @@ const string move_to_san(Position& pos, Move m) {
|
|||||||
// Position::move_is_check doesn't detect all checks (not castling moves,
|
// Position::move_is_check doesn't detect all checks (not castling moves,
|
||||||
// promotions and en passant captures).
|
// promotions and en passant captures).
|
||||||
StateInfo st;
|
StateInfo st;
|
||||||
pos.do_move(m, st);
|
Position p(pos);
|
||||||
if (pos.is_check())
|
p.do_move(m, st);
|
||||||
san += pos.is_mate() ? "#" : "+";
|
if (p.is_check())
|
||||||
pos.undo_move(m);
|
san += p.is_mate()? "#" : "+";
|
||||||
|
|
||||||
return san;
|
return san;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
//// Prototypes
|
//// Prototypes
|
||||||
////
|
////
|
||||||
|
|
||||||
extern const std::string move_to_san(Position& pos, Move m);
|
extern const std::string move_to_san(const Position& pos, Move m);
|
||||||
extern Move move_from_san(const Position& pos, const std::string& str);
|
extern Move move_from_san(const Position& pos, const std::string& str);
|
||||||
extern const std::string line_to_san(const Position& pos, Move line[], int startColumn, bool breakLines);
|
extern const std::string line_to_san(const Position& pos, Move line[], int startColumn, bool breakLines);
|
||||||
extern const std::string pretty_pv(const Position& pos, int time, int depth, uint64_t nodes, Value score, ValueType type, Move pv[]);
|
extern const std::string pretty_pv(const Position& pos, int time, int depth, uint64_t nodes, Value score, ValueType type, Move pv[]);
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1435
-1472
File diff suppressed because it is too large
Load Diff
+2
-6
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#include "depth.h"
|
#include "depth.h"
|
||||||
#include "move.h"
|
#include "move.h"
|
||||||
#include "value.h"
|
|
||||||
|
|
||||||
|
|
||||||
////
|
////
|
||||||
@@ -47,7 +46,6 @@ const int KILLER_MAX = 2;
|
|||||||
/// from nodes shallower and deeper in the tree during the search. Each
|
/// from nodes shallower and deeper in the tree during the search. Each
|
||||||
/// search thread has its own array of SearchStack objects, indexed by the
|
/// search thread has its own array of SearchStack objects, indexed by the
|
||||||
/// current ply.
|
/// current ply.
|
||||||
struct EvalInfo;
|
|
||||||
|
|
||||||
struct SearchStack {
|
struct SearchStack {
|
||||||
Move pv[PLY_MAX_PLUS_2];
|
Move pv[PLY_MAX_PLUS_2];
|
||||||
@@ -56,7 +54,6 @@ struct SearchStack {
|
|||||||
Move threatMove;
|
Move threatMove;
|
||||||
Move killers[KILLER_MAX];
|
Move killers[KILLER_MAX];
|
||||||
Depth reduction;
|
Depth reduction;
|
||||||
Value eval;
|
|
||||||
|
|
||||||
void init(int ply);
|
void init(int ply);
|
||||||
void initKillers();
|
void initKillers();
|
||||||
@@ -67,9 +64,8 @@ struct SearchStack {
|
|||||||
//// Prototypes
|
//// Prototypes
|
||||||
////
|
////
|
||||||
|
|
||||||
extern void init_search();
|
|
||||||
extern void init_threads();
|
extern void init_threads();
|
||||||
extern void exit_threads();
|
extern void stop_threads();
|
||||||
extern bool think(const Position &pos, bool infinite, bool ponder, int side_to_move,
|
extern bool think(const Position &pos, bool infinite, bool ponder, int side_to_move,
|
||||||
int time[], int increment[], int movesToGo, int maxDepth,
|
int time[], int increment[], int movesToGo, int maxDepth,
|
||||||
int maxNodes, int maxTime, Move searchMoves[]);
|
int maxNodes, int maxTime, Move searchMoves[]);
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+20
-36
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -26,8 +26,6 @@
|
|||||||
//// Includes
|
//// Includes
|
||||||
////
|
////
|
||||||
|
|
||||||
#include <cstring>
|
|
||||||
|
|
||||||
#include "lock.h"
|
#include "lock.h"
|
||||||
#include "movepick.h"
|
#include "movepick.h"
|
||||||
#include "position.h"
|
#include "position.h"
|
||||||
@@ -38,8 +36,7 @@
|
|||||||
//// Constants and variables
|
//// Constants and variables
|
||||||
////
|
////
|
||||||
|
|
||||||
const int MAX_THREADS = 8;
|
const int THREAD_MAX = 8;
|
||||||
const int ACTIVE_SPLIT_POINTS_MAX = 8;
|
|
||||||
|
|
||||||
|
|
||||||
////
|
////
|
||||||
@@ -47,48 +44,35 @@ const int ACTIVE_SPLIT_POINTS_MAX = 8;
|
|||||||
////
|
////
|
||||||
|
|
||||||
struct SplitPoint {
|
struct SplitPoint {
|
||||||
|
SplitPoint *parent;
|
||||||
// Const data after splitPoint has been setup
|
Position pos;
|
||||||
SplitPoint* parent;
|
SearchStack sstack[THREAD_MAX][PLY_MAX_PLUS_2];
|
||||||
const Position* pos;
|
SearchStack *parentSstack;
|
||||||
bool pvNode;
|
int ply;
|
||||||
Depth depth;
|
Depth depth;
|
||||||
bool mateThreat;
|
volatile Value alpha, beta, bestValue, futilityValue;
|
||||||
Value beta;
|
Value approximateEval;
|
||||||
int ply, master, slaves[MAX_THREADS];
|
bool pvNode;
|
||||||
SearchStack sstack[MAX_THREADS][PLY_MAX_PLUS_2];
|
int master, slaves[THREAD_MAX];
|
||||||
|
|
||||||
// Const pointers to shared data
|
|
||||||
MovePicker* mp;
|
|
||||||
SearchStack* parentSstack;
|
|
||||||
|
|
||||||
// Shared data
|
|
||||||
Lock lock;
|
Lock lock;
|
||||||
volatile Value alpha;
|
MovePicker *mp;
|
||||||
volatile Value bestValue;
|
|
||||||
volatile int moves;
|
volatile int moves;
|
||||||
volatile int cpus;
|
volatile int cpus;
|
||||||
volatile bool stopRequest;
|
bool finished;
|
||||||
};
|
};
|
||||||
|
|
||||||
// ThreadState type is used to represent thread's current state
|
|
||||||
|
|
||||||
enum ThreadState
|
|
||||||
{
|
|
||||||
THREAD_SEARCHING, // thread is performing work
|
|
||||||
THREAD_AVAILABLE, // thread is polling for work
|
|
||||||
THREAD_SLEEPING, // we are not thinking, so thread is sleeping
|
|
||||||
THREAD_BOOKED, // other thread (master) has booked us as a slave
|
|
||||||
THREAD_WORKISWAITING, // master has ordered us to start
|
|
||||||
THREAD_TERMINATED // we are quitting and thread is terminated
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Thread {
|
struct Thread {
|
||||||
SplitPoint* splitPoint;
|
SplitPoint *splitPoint;
|
||||||
volatile int activeSplitPoints;
|
volatile int activeSplitPoints;
|
||||||
uint64_t nodes;
|
uint64_t nodes;
|
||||||
uint64_t betaCutOffs[2];
|
uint64_t betaCutOffs[2];
|
||||||
volatile ThreadState state;
|
bool failHighPly1;
|
||||||
|
volatile bool stop;
|
||||||
|
volatile bool running;
|
||||||
|
volatile bool idle;
|
||||||
|
volatile bool workIsWaiting;
|
||||||
|
volatile bool printCurrentLine;
|
||||||
unsigned char pad[64]; // set some distance among local data for each thread
|
unsigned char pad[64]; // set some distance among local data for each thread
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+5
-10
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -25,9 +25,7 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#if !(defined(__hpux) || defined(__ppc__) || defined(__ppc64__) || defined(__arm__))
|
#include <xmmintrin.h>
|
||||||
# include <xmmintrin.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "movegen.h"
|
#include "movegen.h"
|
||||||
#include "tt.h"
|
#include "tt.h"
|
||||||
@@ -57,6 +55,8 @@ TranspositionTable::~TranspositionTable() {
|
|||||||
|
|
||||||
void TranspositionTable::set_size(size_t mbSize) {
|
void TranspositionTable::set_size(size_t mbSize) {
|
||||||
|
|
||||||
|
assert(mbSize >= 4 && mbSize <= 8192);
|
||||||
|
|
||||||
size_t newSize = 1024;
|
size_t newSize = 1024;
|
||||||
|
|
||||||
// We store a cluster of ClusterSize number of TTEntry for each position
|
// We store a cluster of ClusterSize number of TTEntry for each position
|
||||||
@@ -125,7 +125,6 @@ void TranspositionTable::store(const Key posKey, Value v, ValueType t, Depth d,
|
|||||||
if (tte->key() && t == VALUE_TYPE_EV_LO)
|
if (tte->key() && t == VALUE_TYPE_EV_LO)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Preserve any exsisting ttMove
|
|
||||||
if (m == MOVE_NONE)
|
if (m == MOVE_NONE)
|
||||||
m = tte->move();
|
m = tte->move();
|
||||||
|
|
||||||
@@ -170,14 +169,11 @@ TTEntry* TranspositionTable::retrieve(const Key posKey) const {
|
|||||||
/// to be loaded from RAM, that can be very slow. When we will
|
/// to be loaded from RAM, that can be very slow. When we will
|
||||||
/// subsequently call retrieve() the TT data will be already
|
/// subsequently call retrieve() the TT data will be already
|
||||||
/// quickly accessible in L1/L2 CPU cache.
|
/// quickly accessible in L1/L2 CPU cache.
|
||||||
#if defined(__hpux) || defined(__ppc__) || defined(__ppc64__) || defined(__arm__)
|
|
||||||
void TranspositionTable::prefetch(const Key) const {} // Not supported on HP UX
|
|
||||||
#else
|
|
||||||
|
|
||||||
void TranspositionTable::prefetch(const Key posKey) const {
|
void TranspositionTable::prefetch(const Key posKey) const {
|
||||||
|
|
||||||
#if defined(__INTEL_COMPILER) || defined(__ICL)
|
#if defined(__INTEL_COMPILER) || defined(__ICL)
|
||||||
// This hack prevents prefetches to be optimized away by
|
// This hack prevents prefetches to be optimized away by the
|
||||||
// Intel compiler. Both MSVC and gcc seems not affected.
|
// Intel compiler. Both MSVC and gcc seems not affected.
|
||||||
__asm__ ("");
|
__asm__ ("");
|
||||||
#endif
|
#endif
|
||||||
@@ -187,7 +183,6 @@ void TranspositionTable::prefetch(const Key posKey) const {
|
|||||||
_mm_prefetch(addr+64, _MM_HINT_T2); // 64 bytes ahead
|
_mm_prefetch(addr+64, _MM_HINT_T2); // 64 bytes ahead
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/// TranspositionTable::new_search() is called at the beginning of every new
|
/// TranspositionTable::new_search() is called at the beginning of every new
|
||||||
/// search. It increments the "generation" variable, which is used to
|
/// search. It increments the "generation" variable, which is used to
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-25
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -73,28 +73,4 @@ typedef uint64_t Bitboard;
|
|||||||
#define CACHE_LINE_ALIGNMENT __attribute__ ((aligned(64)))
|
#define CACHE_LINE_ALIGNMENT __attribute__ ((aligned(64)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Define a __cpuid() function for gcc compilers, for Intel and MSVC
|
|
||||||
// is already available as an intrinsic.
|
|
||||||
#if defined(_MSC_VER)
|
|
||||||
#include <intrin.h>
|
|
||||||
#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
|
|
||||||
inline void __cpuid(int CPUInfo[4], int InfoType)
|
|
||||||
{
|
|
||||||
int* eax = CPUInfo + 0;
|
|
||||||
int* ebx = CPUInfo + 1;
|
|
||||||
int* ecx = CPUInfo + 2;
|
|
||||||
int* edx = CPUInfo + 3;
|
|
||||||
|
|
||||||
*eax = InfoType;
|
|
||||||
*ecx = 0;
|
|
||||||
__asm__("cpuid" : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
|
|
||||||
: "0" (*eax), "2" (*ecx));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
inline void __cpuid(int CPUInfo[4], int)
|
|
||||||
{
|
|
||||||
CPUInfo[0] = CPUInfo[1] = CPUInfo[2] = CPUInfo[3] = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // !defined(TYPES_H_INCLUDED)
|
#endif // !defined(TYPES_H_INCLUDED)
|
||||||
|
|||||||
+3
-3
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -210,7 +210,7 @@ namespace {
|
|||||||
}
|
}
|
||||||
// Our StateInfo st is about going out of scope so copy
|
// Our StateInfo st is about going out of scope so copy
|
||||||
// its content inside RootPosition before they disappear.
|
// its content inside RootPosition before they disappear.
|
||||||
RootPosition.detach();
|
RootPosition.saveState();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -308,7 +308,7 @@ namespace {
|
|||||||
|
|
||||||
string token;
|
string token;
|
||||||
int depth, tm, n;
|
int depth, tm, n;
|
||||||
Position pos(RootPosition);
|
Position pos = RootPosition;
|
||||||
|
|
||||||
if (!(uip >> depth))
|
if (!(uip >> depth))
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+25
-5
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -88,10 +88,26 @@ namespace {
|
|||||||
o["Space"] = Option(100, 0, 200);
|
o["Space"] = Option(100, 0, 200);
|
||||||
o["Aggressiveness"] = Option(100, 0, 200);
|
o["Aggressiveness"] = Option(100, 0, 200);
|
||||||
o["Cowardice"] = Option(100, 0, 200);
|
o["Cowardice"] = Option(100, 0, 200);
|
||||||
|
o["King Safety Curve"] = Option("Quadratic", COMBO);
|
||||||
|
|
||||||
|
o["King Safety Curve"].comboValues.push_back("Quadratic");
|
||||||
|
o["King Safety Curve"].comboValues.push_back("Linear"); /*, "From File"*/
|
||||||
|
|
||||||
|
o["King Safety Coefficient"] = Option(40, 1, 100);
|
||||||
|
o["King Safety X Intercept"] = Option(0, 0, 20);
|
||||||
|
o["King Safety Max Slope"] = Option(30, 10, 100);
|
||||||
|
o["King Safety Max Value"] = Option(500, 100, 1000);
|
||||||
|
o["Queen Contact Check Bonus"] = Option(3, 0, 8);
|
||||||
|
o["Queen Check Bonus"] = Option(2, 0, 4);
|
||||||
|
o["Rook Check Bonus"] = Option(1, 0, 4);
|
||||||
|
o["Bishop Check Bonus"] = Option(1, 0, 4);
|
||||||
|
o["Knight Check Bonus"] = Option(1, 0, 4);
|
||||||
|
o["Discovered Check Bonus"] = Option(3, 0, 8);
|
||||||
|
o["Mate Threat Bonus"] = Option(3, 0, 8);
|
||||||
o["Check Extension (PV nodes)"] = Option(2, 0, 2);
|
o["Check Extension (PV nodes)"] = Option(2, 0, 2);
|
||||||
o["Check Extension (non-PV nodes)"] = Option(1, 0, 2);
|
o["Check Extension (non-PV nodes)"] = Option(1, 0, 2);
|
||||||
o["Single Evasion Extension (PV nodes)"] = Option(2, 0, 2);
|
o["Single Reply Extension (PV nodes)"] = Option(2, 0, 2);
|
||||||
o["Single Evasion Extension (non-PV nodes)"] = Option(2, 0, 2);
|
o["Single Reply Extension (non-PV nodes)"] = Option(2, 0, 2);
|
||||||
o["Mate Threat Extension (PV nodes)"] = Option(0, 0, 2);
|
o["Mate Threat Extension (PV nodes)"] = Option(0, 0, 2);
|
||||||
o["Mate Threat Extension (non-PV nodes)"] = Option(0, 0, 2);
|
o["Mate Threat Extension (non-PV nodes)"] = Option(0, 0, 2);
|
||||||
o["Pawn Push to 7th Extension (PV nodes)"] = Option(1, 0, 2);
|
o["Pawn Push to 7th Extension (PV nodes)"] = Option(1, 0, 2);
|
||||||
@@ -100,16 +116,20 @@ namespace {
|
|||||||
o["Passed Pawn Extension (non-PV nodes)"] = Option(0, 0, 2);
|
o["Passed Pawn Extension (non-PV nodes)"] = Option(0, 0, 2);
|
||||||
o["Pawn Endgame Extension (PV nodes)"] = Option(2, 0, 2);
|
o["Pawn Endgame Extension (PV nodes)"] = Option(2, 0, 2);
|
||||||
o["Pawn Endgame Extension (non-PV nodes)"] = Option(2, 0, 2);
|
o["Pawn Endgame Extension (non-PV nodes)"] = Option(2, 0, 2);
|
||||||
|
o["Full Depth Moves (PV nodes)"] = Option(10, 1, 100);
|
||||||
|
o["Full Depth Moves (non-PV nodes)"] = Option(3, 1, 100);
|
||||||
|
o["Threat Depth"] = Option(5, 0, 100);
|
||||||
o["Randomness"] = Option(0, 0, 10);
|
o["Randomness"] = Option(0, 0, 10);
|
||||||
o["Minimum Split Depth"] = Option(4, 4, 7);
|
o["Minimum Split Depth"] = Option(4, 4, 7);
|
||||||
o["Maximum Number of Threads per Split Point"] = Option(5, 4, 8);
|
o["Maximum Number of Threads per Split Point"] = Option(5, 4, 8);
|
||||||
o["Threads"] = Option(1, 1, MAX_THREADS);
|
o["Threads"] = Option(1, 1, THREAD_MAX);
|
||||||
o["Hash"] = Option(32, 4, 8192);
|
o["Hash"] = Option(32, 4, 8192);
|
||||||
o["Clear Hash"] = Option(false, BUTTON);
|
o["Clear Hash"] = Option(false, BUTTON);
|
||||||
o["New Game"] = Option(false, BUTTON);
|
o["New Game"] = Option(false, BUTTON);
|
||||||
o["Ponder"] = Option(true);
|
o["Ponder"] = Option(true);
|
||||||
o["OwnBook"] = Option(true);
|
o["OwnBook"] = Option(true);
|
||||||
o["MultiPV"] = Option(1, 1, 500);
|
o["MultiPV"] = Option(1, 1, 500);
|
||||||
|
o["UCI_ShowCurrLine"] = Option(false);
|
||||||
o["UCI_Chess960"] = Option(false);
|
o["UCI_Chess960"] = Option(false);
|
||||||
o["UCI_AnalyseMode"] = Option(false);
|
o["UCI_AnalyseMode"] = Option(false);
|
||||||
|
|
||||||
@@ -316,7 +336,7 @@ void push_button(const string& buttonName) {
|
|||||||
bool button_was_pressed(const string& buttonName) {
|
bool button_was_pressed(const string& buttonName) {
|
||||||
|
|
||||||
if (!get_option_value<bool>(buttonName))
|
if (!get_option_value<bool>(buttonName))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
set_option_value(buttonName, "false");
|
set_option_value(buttonName, "false");
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
Stockfish, a UCI chess playing engine derived from Glaurung 2.1
|
||||||
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
|
||||||
Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
|
Copyright (C) 2008-2009 Marco Costalba
|
||||||
|
|
||||||
Stockfish is free software: you can redistribute it and/or modify
|
Stockfish is free software: you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|||||||
Reference in New Issue
Block a user