Sorry for my very late reply. I've recently found this topic.
I have some questions:
- In following code (current StockFish snapshot in Github), please notice code in 
bold format.
Code: Select all
namespace {
  //...
  // Polynomial material balance parameters
  const Value RedundantQueenPenalty = Value(320);
  const Value RedundantRookPenalty  = Value(554);
  
  const int LinearCoefficients[6] = { 1617, -162, -1172, -190, 105, 26 };
Code: Select all
/*
  const int QuadraticCoefficientsSameColor[][8] = {
  { 7, 7, 7, 7, 7, 7 }, { 39, 2, 7, 7, 7, 7 }, { 35, 271, -4, 7, 7, 7 },
  { 7, 25, 4, 7, 7, 7 }, { -27, -2, 46, 100, 56, 7 }, { 58, 29, 83, 148, -3, -25 } };
  const int QuadraticCoefficientsOppositeColor[][8] = {
  { 41, 41, 41, 41, 41, 41 }, { 37, 41, 41, 41, 41, 41 }, { 10, 62, 41, 41, 41, 41 },
  { 57, 64, 39, 41, 41, 41 }, { 50, 40, 23, -22, 41, 41 }, { 106, 101, 3, 151, 171, 41 } };
*/
  // Re-formatted:
  const int QuadraticCoefficientsSameColor[][8] = {
      {   7,   7,  7,   7,  7, 7 },
      {  39,   2,  7,   7,  7, 7 },
      {  35, 271, -4,   7,  7, 7 },
      {   7,  25,  4,   7,  7, 7 },
      { -27,  -2, 46, 100, 56, 7 },
      {  58,  29, 83, 148, -3, -25 } };
  const int QuadraticCoefficientsOppositeColor[][8] = {
      { 41,  41, 41,  41,  41, 41 },
      { 37,  41, 41,  41,  41, 41 },
      { 10,  62, 41,  41,  41, 41 },
      { 57,  64, 39,  41,  41, 41 },
      { 50,  40, 23, -22,  41, 41 },
      { 106, 101, 3, 151, 171, 41 } };
Please notice:
  
const int QuadraticCoefficientsSameColor[][8] = {
      {   
7,   7,  7,   7,  7, 7 },
      {  
39,   2,  7,   7,  7, 7 },
      {  
35, 271, -4,   7,  7, 7 },
      {   
7,  25,  4,   7,  7, 7 },
      { 
-27,  -2, 46, 100, 56, 7 },
      {  
58,  29, 83, 148, -3, -25 } };
  
const int QuadraticCoefficientsOppositeColor[][8] = {
      { 
41,  41, 41,  41,  41, 41 },
      { 
37,  41, 41,  41,  41, 41 },
      { 
10,  62, 41,  41,  41, 41 },
      { 
57,  64, 39,  41,  41, 41 },
      { 
50,  40, 23, -22,  41, 41 },
      { 
106, 101, 3, 151, 171, 41 } };
Code: Select all
template<Color Us>
int MaterialTable::imbalance(const int pieceCount[][8]) {
  //...
  // Redundancy of major pieces, formula based on Kaufman's paper
  // "The Evaluation of Material Imbalances in Chess"
  if (pieceCount[Us][ROOK] > 0)
      value -=  RedundantRookPenalty * (pieceCount[Us][ROOK] - 1)
              + RedundantQueenPenalty * pieceCount[Us][QUEEN];
  // Second-degree polynomial material imbalance by Tord Romstad
  for (pt1 = NO_PIECE_TYPE; [b]pt1 <= QUEEN[/b]; pt1++)
  {
      pc = pieceCount[Us][pt1];
      if (!pc)
          continue;
      v = LinearCoefficients[pt1];
      for (pt2 = NO_PIECE_TYPE; pt2 <= pt1; pt2++)
          v +=  QuadraticCoefficientsSameColor[pt1][pt2] * pieceCount[Us][pt2]
              + QuadraticCoefficientsOppositeColor[pt1][pt2] * pieceCount[Them][pt2];
      value += pc * v;
  }
Please notice:
for (pt2 = NO_PIECE_TYPE; 
pt2 <= pt1; pt2++)
Questions:
1. What is the meaning of RedundantQueenPenalty, RedundantRookPenalty and why they are used in following code?
Code: Select all
  if (pieceCount[Us][ROOK] > 0)
      value -=  RedundantRookPenalty * (pieceCount[Us][ROOK] - 1)
              + RedundantQueenPenalty * pieceCount[Us][QUEEN];
2. What is the meaning of LinearCoefficients values?
Code: Select all
  const int LinearCoefficients[6] = { 1617, -162, -1172, -190, 105, 26 };
3. Why do you use 
for (pt2 = NO_PIECE_TYPE; pt2 <= pt1; pt2++) ? I think it should be 
for (pt2 = NO_PIECE_TYPE; pt2 <= QUEEN; pt2++). Because if you keep the current code, program will scan thought the arrays 
QuadraticCoefficientsXXX as I mentioned in 
blue bold format. Numbers of loop iterations will be (
1+2+3+4+5+6)=21 instead of 6x6=36. And 
red-italic values of 
QuadraticCoefficientsXXX arrays will not be calculated.
4. Why do you calculate
v +=  QuadraticCoefficientsSameColor[pt1][pt2] * pieceCount[
Us][pt2] + QuadraticCoefficientsOppositeColor[pt1][pt2] * pieceCount[
Them][pt2]; ?
Why not calculate
v +=  QuadraticCoefficientsSameColor[pt1][pt2] * pieceCount[
Us][pt2] + QuadraticCoefficientsOppositeColor[pt1][pt2] * pieceCount[
Us][pt2]; ?
Because the meaning of array name I understand here is 
Opposite color but not 
Opponent color.
Thanks & regards,