1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-12 12:09:14 +00:00

TranspositionTable: add first_entry() helper

An inline function to retrieve the first TT entry
given a position.

Plus usual whitespace noise.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2008-09-06 12:30:07 +02:00
parent 61f41a057d
commit c2c0ba875f
4 changed files with 46 additions and 42 deletions

View file

@ -6,12 +6,12 @@
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
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Glaurung is distributed in the hope that it will be useful, Glaurung is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -52,12 +52,12 @@ long dbg_cnt0 = 0;
long dbg_cnt1 = 0; long dbg_cnt1 = 0;
//// ////
//// Functions //// Functions
//// ////
void dbg_print_hit_rate() { void dbg_print_hit_rate() {
std::cout << "Total " << dbg_cnt0 << " Hit " << dbg_cnt1 std::cout << "Total " << dbg_cnt0 << " Hit " << dbg_cnt1
<< " hit rate (%) " << (dbg_cnt1*100)/(dbg_cnt0 ? dbg_cnt0 : 1) << " hit rate (%) " << (dbg_cnt1*100)/(dbg_cnt0 ? dbg_cnt0 : 1)
<< std::endl; << std::endl;
@ -76,15 +76,15 @@ const std::string engine_name() {
const char *dateString = __DATE__; const char *dateString = __DATE__;
std::stringstream s; std::stringstream s;
int month = 0, day = 0; int month = 0, day = 0;
for(int i = 0; i < 12; i++) for(int i = 0; i < 12; i++)
if(strncmp(dateString, monthNames[i], 3) == 0) if(strncmp(dateString, monthNames[i], 3) == 0)
month = i + 1; month = i + 1;
day = atoi(dateString+4); day = atoi(dateString+4);
s << "Glaurung " << (dateString+9) << std::setfill('0') << std::setw(2) s << "Glaurung " << (dateString+9) << std::setfill('0') << std::setw(2)
<< month << std::setfill('0') << std::setw(2) << day; << month << std::setfill('0') << std::setw(2) << day;
return s.str(); return s.str();
} }
else else
@ -98,7 +98,7 @@ const std::string engine_name() {
int get_system_time() { int get_system_time() {
struct timeval t; struct timeval t;
gettimeofday(&t, NULL); gettimeofday(&t, NULL);
return t.tv_sec*1000 + t.tv_usec/1000; return t.tv_sec*1000 + t.tv_usec/1000;
} }
@ -136,14 +136,14 @@ int Bioskey()
{ {
fd_set readfds; fd_set readfds;
struct timeval timeout; struct timeval timeout;
FD_ZERO(&readfds); FD_ZERO(&readfds);
FD_SET(fileno(stdin), &readfds); FD_SET(fileno(stdin), &readfds);
/* Set to timeout immediately */ /* Set to timeout immediately */
timeout.tv_sec = 0; timeout.tv_sec = 0;
timeout.tv_usec = 0; timeout.tv_usec = 0;
select(16, &readfds, 0, 0, &timeout); select(16, &readfds, 0, 0, &timeout);
return (FD_ISSET(fileno(stdin), &readfds)); return (FD_ISSET(fileno(stdin), &readfds));
} }

View file

@ -6,12 +6,12 @@
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
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Glaurung is distributed in the hope that it will be useful, Glaurung is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */

View file

@ -6,12 +6,12 @@
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
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Glaurung is distributed in the hope that it will be useful, Glaurung is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -105,7 +105,7 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d,
Move m, ValueType type) { Move m, ValueType type) {
TTEntry *tte, *replace; TTEntry *tte, *replace;
tte = replace = entries + int(pos.get_key() & (size - 1)) * 4; tte = replace = first_entry(pos);
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
if (!(tte+i)->key()) // still empty if (!(tte+i)->key()) // still empty
@ -118,12 +118,12 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d,
{ {
if (m == MOVE_NONE) if (m == MOVE_NONE)
m = (tte+i)->move(); m = (tte+i)->move();
*(tte+i) = TTEntry(pos.get_key(), v, type, d, m, generation); *(tte+i) = TTEntry(pos.get_key(), v, type, d, m, generation);
return; return;
} }
if ( i == 0 // already is (replace == tte+i), common case if ( i == 0 // already is (replace == tte+i), common case
|| replace->generation() < (tte+i)->generation()) || replace->generation() < (tte+i)->generation())
continue; continue;
if ( replace->generation() > (tte+i)->generation() if ( replace->generation() > (tte+i)->generation()
@ -143,28 +143,33 @@ void TranspositionTable::store(const Position &pos, Value v, Depth d,
bool TranspositionTable::retrieve(const Position &pos, Value *value, bool TranspositionTable::retrieve(const Position &pos, Value *value,
Depth *d, Move *move, Depth *d, Move *move,
ValueType *type) const { ValueType *type) const {
TTEntry *tte; TTEntry *tte = first_entry(pos);
bool found = false;
tte = entries + int(pos.get_key() & (size - 1)) * 4; for (int i = 0; i < 4; i++)
for (int i = 0; i < 4 && !found ; i++) {
if ((tte+i)->key() == pos.get_key()) tte += i;
if (tte->key() == pos.get_key())
{ {
tte = tte + i; *value = tte->value();
found = true; *type = tte->type();
*d = tte->depth();
*move = tte->move();
return true;
} }
if (!found) {
*move = MOVE_NONE;
return false;
} }
*value = tte->value(); *move = MOVE_NONE;
*type = tte->type(); return false;
*d = tte->depth();
*move = tte->move();
return true;
} }
/// TranspositionTable::first_entry returns a pointer to the first
/// entry of a cluster given a position.
inline TTEntry* TranspositionTable::first_entry(const Position &pos) const {
return entries + (int(pos.get_key() & (size - 1)) << 2);
}
/// 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
/// distinguish transposition table entries from previous searches from /// distinguish transposition table entries from previous searches from
@ -177,7 +182,7 @@ void TranspositionTable::new_search() {
} }
/// TranspositionTable::insert_pv() is called at the end of a search /// TranspositionTable::insert_pv() is called at the end of a search
/// iteration, and inserts the PV back into the PV. This makes sure the /// iteration, and inserts the PV back into the PV. This makes sure the
/// old PV moves are searched first, even if the old TT entries have been /// old PV moves are searched first, even if the old TT entries have been
/// overwritten. /// overwritten.
@ -212,12 +217,9 @@ TTEntry::TTEntry() {
} }
TTEntry::TTEntry(Key k, Value v, ValueType t, Depth d, Move m, TTEntry::TTEntry(Key k, Value v, ValueType t, Depth d, Move m,
int generation) { int generation) :
key_ = k; key_ (k), data((m & 0x7FFFF) | (t << 20) | (generation << 23)),
data = (m & 0x7FFFF) | (t << 20) | (generation << 23); value_(v), depth_(int16_t(d)) {}
value_ = v;
depth_ = int16_t(d);
}
/// Functions for extracting data from TTEntry objects. /// Functions for extracting data from TTEntry objects.

View file

@ -6,12 +6,12 @@
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
the Free Software Foundation, either version 3 of the License, or the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. (at your option) any later version.
Glaurung is distributed in the hope that it will be useful, Glaurung is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
@ -47,7 +47,7 @@ public:
ValueType type() const; ValueType type() const;
int generation() const; int generation() const;
private: private:
Key key_; Key key_;
uint32_t data; uint32_t data;
int16_t value_; int16_t value_;
@ -74,6 +74,8 @@ public:
int full(); int full();
private: private:
TTEntry* first_entry(const Position &pos) const;
unsigned size; unsigned size;
int writes; int writes;
TTEntry* entries; TTEntry* entries;