]> git.sesse.net Git - stockfish/blobdiff - src/evaluate.cpp
Convert apply_weight() to handle Score
[stockfish] / src / evaluate.cpp
index 0b4ffd5d327d80bd7af7cca3beaf7a74d4f39e91..ac7dd149d8e124d99055713048d377fd2f884e6a 100644 (file)
@@ -319,7 +319,7 @@ namespace {
   void evaluate_passed_pawns(const Position& pos, EvalInfo& ei);
   void evaluate_trapped_bishop_a7h7(const Position& pos, Square s, Color us, EvalInfo& ei);
   void evaluate_trapped_bishop_a1h1(const Position& pos, Square s, Color us, EvalInfo& ei);
-  inline Value apply_weight(Value v, int w);
+  inline Score apply_weight(Score v, int wmg, int weg);
   Value scale_by_game_phase(const Score& v, Phase ph, const ScaleFactor sf[]);
   int weight_option(const std::string& opt, int weight);
   void init_safety();
@@ -356,7 +356,7 @@ Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) {
 
   // Probe the material hash table
   ei.mi = MaterialTable[threadID]->get_material_info(pos);
-  ei.value += Score(ei.mi->material_value(), ei.mi->material_value());
+  ei.value += ei.mi->material_value();
 
   // If we have a specialized evaluation function for the current material
   // configuration, call it and return
@@ -370,8 +370,7 @@ Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) {
 
   // Probe the pawn hash table
   ei.pi = PawnTable[threadID]->get_pawn_info(pos);
-  ei.value += Score(apply_weight(ei.pi->mg_value(), WeightPawnStructureMidgame),
-                    apply_weight(ei.pi->eg_value(), WeightPawnStructureEndgame));
+  ei.value += apply_weight(ei.pi->value(), WeightPawnStructureMidgame, WeightPawnStructureEndgame);
 
   // Initialize king attack bitboards and king attack zones for both sides
   ei.attackedBy[WHITE][KING] = pos.attacks_from<KING>(pos.king_square(WHITE));
@@ -436,8 +435,7 @@ Value do_evaluate(const Position& pos, EvalInfo& ei, int threadID) {
   }
 
   // Mobility
-  ei.value += Score(apply_weight(ei.mgMobility, WeightMobilityMidgame),
-                    apply_weight(ei.egMobility, WeightMobilityEndgame));
+  ei.value += apply_weight(Score(ei.mgMobility, ei.egMobility), WeightMobilityMidgame, WeightMobilityEndgame);
 
   // If we don't already have an unusual scale factor, check for opposite
   // colored bishop endgames, and use a lower scale for those
@@ -789,7 +787,7 @@ namespace {
     if (relative_rank(Us, s) <= RANK_4)
     {
         shelter = ei.pi->get_king_shelter(pos, Us, s);
-        ei.value += Score(Sign[Us] * Value(shelter), 0);
+        ei.value += Sign[Us] * Score(shelter, 0);
     }
 
     // King safety. This is quite complicated, and is almost certainly far
@@ -936,12 +934,12 @@ namespace {
       // that the king safety scores can sometimes be very big, and that
       // capturing a single attacking piece can therefore result in a score
       // change far bigger than the value of the captured piece.
-      Value v = apply_weight(SafetyTable[attackUnits], WeightKingSafety[Us]);
+      Score v = apply_weight(Score(SafetyTable[attackUnits], 0), WeightKingSafety[Us], 0);
 
-      ei.value -= Score(Sign[Us] * v, 0);
+      ei.value -= Sign[Us] * v;
 
       if (Us == pos.side_to_move())
-          ei.futilityMargin += v;
+          ei.futilityMargin += v.mg();
     }
   }
 
@@ -1069,8 +1067,7 @@ namespace {
         }
 
         // Add the scores for this pawn to the middle game and endgame eval.
-        ei.value += Score(apply_weight(Sign[Us] * mbonus, WeightPassedPawnsMidgame),
-                          apply_weight(Sign[Us] * ebonus, WeightPassedPawnsEndgame));
+        ei.value += Sign[Us] * apply_weight(Score(mbonus, ebonus), WeightPassedPawnsMidgame, WeightPassedPawnsEndgame);
 
     } // while
   }
@@ -1230,14 +1227,14 @@ namespace {
     int space =  count_1s_max_15<HasPopCnt>(safeSquares)
                + count_1s_max_15<HasPopCnt>(behindFriendlyPawns & safeSquares);
 
-    ei.value += Sign[Us] * Score(apply_weight(Value(space * ei.mi->space_weight()), WeightSpace), 0);
+    ei.value += Sign[Us] * apply_weight(Score(space * ei.mi->space_weight(), 0), WeightSpace, 0);
   }
 
 
   // apply_weight() applies an evaluation weight to a value
 
-  inline Value apply_weight(Value v, int w) {
-    return (v*w) / 0x100;
+  inline Score apply_weight(Score v, int wmg, int weg) {
+      return Score(v.mg() * wmg, v.eg() * weg) / 0x100;
   }