//// Functions
////
-/// PawnInfoTable c'tor and d'tor instantiated one each thread
-
-PawnInfoTable::PawnInfoTable() {
-
- entries = new PawnInfo[PawnTableSize];
-
- if (!entries)
- {
- std::cerr << "Failed to allocate " << (PawnTableSize * sizeof(PawnInfo))
- << " bytes for pawn hash table." << std::endl;
- Application::exit_with_failure();
- }
- memset(entries, 0, PawnTableSize * sizeof(PawnInfo));
-}
-
-
-PawnInfoTable::~PawnInfoTable() {
-
- delete [] entries;
-}
-
/// PawnInfoTable::get_pawn_info() takes a position object as input, computes
/// a PawnInfo object, and returns a pointer to it. The result is also stored
assert(pos.is_ok());
Key key = pos.get_pawn_key();
- unsigned index = unsigned(key & (PawnTableSize - 1));
- PawnInfo* pi = entries + index;
+ PawnInfo* pi = find(key);
// If pi->key matches the position's pawn hash key, it means that we
// have analysed this pawn structure before, and we can simply return
// Passed, isolated, doubled or member of a pawn
// chain (but not the backward one) ?
passed = !(theirPawns & passed_pawn_mask(Us, s));
- doubled = ourPawns & squares_behind(Us, s);
+ doubled = ourPawns & squares_in_front_of(Us, s);
opposed = theirPawns & squares_in_front_of(Us, s);
isolated = !(ourPawns & neighboring_files_bb(f));
chain = ourPawns & neighboring_files_bb(f) & b;
&& (b = attack_span_mask(opposite_color(Us), s + pawn_push(Us)) & ourPawns) != EmptyBoardBB
&& count_1s<Max15>(b) >= count_1s<Max15>(attack_span_mask(Us, s) & theirPawns);
- // In order to prevent doubled passed pawns from receiving a too big
- // bonus, only the frontmost passed pawn on each file is considered as
- // a true passed pawn.
- if (passed && (ourPawns & squares_in_front_of(Us, s)))
- passed = false;
-
// Mark the pawn as passed. Pawn will be properly scored in evaluation
- // because we need full attack info to evaluate passed pawns.
- if (passed)
+ // because we need full attack info to evaluate passed pawns. Only the
+ // frontmost passed pawn on each file is considered a true passed pawn.
+ if (passed && !doubled)
set_bit(&(pi->passedPawns[Us]), s);
// Score this pawn
if (candidate)
value += CandidateBonus[relative_rank(Us, s)];
}
-
return value;
}