#include <algorithm>
#include <cassert>
+#include <cstring> // For std::memset
#include <iomanip>
#include <sstream>
#include "evaluate.h"
#include "material.h"
#include "pawns.h"
-#include "thread.h"
namespace {
// KingDanger[attackUnits] contains the actual king danger weighted
// scores, indexed by a calculated integer number.
- Score KingDanger[128];
+ Score KingDanger[512];
// apply_weight() weighs score 's' by weight 'w' trying to prevent overflow
Score apply_weight(Score s, const Weight& w) {
// Finally, extract the king danger score from the KingDanger[]
// array and subtract the score from evaluation.
- score -= KingDanger[std::max(std::min(attackUnits / 4, 99), 0)];
+ score -= KingDanger[std::max(std::min(attackUnits, 399), 0)];
}
if (Trace)
EvalInfo ei;
Score score, mobility[2] = { SCORE_ZERO, SCORE_ZERO };
- Thread* thisThread = pos.this_thread();
// Initialize score by reading the incrementally updated scores included
// in the position object (material + piece square tables).
score = pos.psq_score();
// Probe the material hash table
- ei.mi = Material::probe(pos, thisThread->materialTable, thisThread->endgames);
+ ei.mi = Material::probe(pos);
score += ei.mi->imbalance();
// If we have a specialized evaluation function for the current material
return ei.mi->evaluate(pos);
// Probe the pawn hash table
- ei.pi = Pawns::probe(pos, thisThread->pawnsTable);
+ ei.pi = Pawns::probe(pos);
score += apply_weight(ei.pi->pawns_score(), Weights[PawnStructure]);
// Initialize attack and king safety bitboards
void init() {
- const double MaxSlope = 30;
+ const double MaxSlope = 7.5;
const double Peak = 1280;
+ double t = 0.0;
- for (int t = 0, i = 1; i < 100; ++i)
+ for (int i = 1; i < 400; ++i)
{
- t = int(std::min(Peak, std::min(0.4 * i * i, t + MaxSlope)));
- KingDanger[i] = apply_weight(make_score(t, 0), Weights[KingSafety]);
+ t = std::min(Peak, std::min(0.025 * i * i, t + MaxSlope));
+ KingDanger[i] = apply_weight(make_score(int(t), 0), Weights[KingSafety]);
}
}