+ // scale_by_game_phase() interpolates between a middle game and an endgame
+ // score, based on game phase. It also scales the return value by a
+ // ScaleFactor array.
+
+ Value scale_by_game_phase(Value mv, Value ev, Phase ph, const ScaleFactor sf[]) {
+
+ assert(mv > -VALUE_INFINITE && mv < VALUE_INFINITE);
+ assert(ev > -VALUE_INFINITE && ev < VALUE_INFINITE);
+ assert(ph >= PHASE_ENDGAME && ph <= PHASE_MIDGAME);
+
+ ev = apply_scale_factor(ev, sf[(ev > Value(0) ? WHITE : BLACK)]);
+
+ Value result = Value(int((mv * ph + ev * (128 - ph)) / 128));
+ return Value(int(result) & ~(GrainSize - 1));
+ }
+
+