VALUE_TYPE_UPPER = 1, // Upper bound
VALUE_TYPE_LOWER = 2, // Lower bound
VALUE_TYPE_EXACT = 3, // Exact score
- VALUE_TYPE_EVAL = 4 // Evaluation cache
+ VALUE_TYPE_EVAL = 4, // Evaluation cache
+ VALUE_TYPE_EV_UP = 5, // Evaluation cache for upper bound
+ VALUE_TYPE_EV_LO = 6 // Evaluation cache for lower bound
};
};
+/// Score struct keeps a midgame and an endgame value in a single
+/// ScoreValue 64 bit union.
+
+enum Score {};
+
+inline Value eg_value(Score s) { return Value(int16_t(s & 0xffff)); }
+inline Value mg_value(Score s) { return Value((int(s) + 32768) >> 16); }
+
+inline Score make_score(int mg, int eg) { return Score((mg << 16) + eg); }
+
+inline Score operator-(Score s) { return Score(-int(s)); }
+inline Score operator+(Score s1, Score s2) { return Score(int(s1) + int(s2)); }
+inline Score operator-(Score s1, Score s2) { return Score(int(s1) - int(s2)); }
+inline void operator+=(Score& s1, Score s2) { s1 = Score(int(s1) + int(s2)); }
+inline void operator-=(Score& s1, Score s2) { s1 = Score(int(s1) - int(s2)); }
+inline Score operator*(int i, Score s) { return Score(i * int(s)); }
+
+// Division must be handled separately for each term
+inline Score operator/(Score s, int i) { return make_score(mg_value(s) / i, eg_value(s) / i); }
+
+// Only declared but not defined. We don't want to multiply two scores due to
+// a very high risk of overflow. So user should explicitly convert to integer.
+inline Score operator*(Score s1, Score s2);
+
+
////
//// Constants and variables
////
///
/// Values modified by Joona Kiiski
-const Value PawnValueMidgame = Value(0x0CC);
-const Value PawnValueEndgame = Value(0x101);
-const Value KnightValueMidgame = Value(0x332);
+const Value PawnValueMidgame = Value(0x0C6);
+const Value PawnValueEndgame = Value(0x102);
+const Value KnightValueMidgame = Value(0x331);
const Value KnightValueEndgame = Value(0x34E);
-const Value BishopValueMidgame = Value(0x345);
-const Value BishopValueEndgame = Value(0x356);
-const Value RookValueMidgame = Value(0x4F8);
-const Value RookValueEndgame = Value(0x500);
-const Value QueenValueMidgame = Value(0x9D5);
-const Value QueenValueEndgame = Value(0x9FB);
+const Value BishopValueMidgame = Value(0x344);
+const Value BishopValueEndgame = Value(0x359);
+const Value RookValueMidgame = Value(0x4F6);
+const Value RookValueEndgame = Value(0x4FE);
+const Value QueenValueMidgame = Value(0x9D9);
+const Value QueenValueEndgame = Value(0x9FE);
const Value PieceValueMidgame[17] = {
Value(0),
Value(0), Value(0), Value(0)
};
-/// Bonus for having the side to move
+/// Bonus for having the side to move (modified by Joona Kiiski)
-const Value TempoValueMidgame = Value(48);
-const Value TempoValueEndgame = Value(21);
+const Score TempoValue = make_score(48, 22);
////