Skip to content

Commit

Permalink
Re-implement double pawn penalty without iterating
Browse files Browse the repository at this point in the history
  • Loading branch information
eduherminio committed May 17, 2024
1 parent 19b2ee9 commit 43641aa
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 38 deletions.
4 changes: 4 additions & 0 deletions src/Lynx.Cli/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,10 @@
"MG": -21,
"EG": -17
},
"DoubledPawnPenalty": {
"MG": -5,
"EG": -5
},
"OpenFileRookBonus": {
"MG": 46,
"EG": 9
Expand Down
2 changes: 2 additions & 0 deletions src/Lynx/Configuration.cs
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,8 @@ public sealed class EngineSettings

public TaperedEvaluationTerm IsolatedPawnPenalty { get; set; } = new(-21, -17);

public TaperedEvaluationTerm DoubledPawnPenalty { get; set; } = new(-5, -5);

public TaperedEvaluationTerm OpenFileRookBonus { get; set; } = new(46, 9);

public TaperedEvaluationTerm SemiOpenFileRookBonus { get; set; } = new(15, 15);
Expand Down
22 changes: 22 additions & 0 deletions src/Lynx/Model/Position.cs
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,9 @@ public bool WasProduceByAValidMove()
}
}

// Doubled pawns penalty
packedScore += DoublePawnPenalty();

// Bishop pair bonus
if (PieceBitBoards[(int)Piece.B].CountBits() >= 2)
{
Expand Down Expand Up @@ -808,6 +811,15 @@ public bool WasProduceByAValidMove()
return (sideEval, gamePhase);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
private int DoublePawnsPenalty()
{
return ((PieceBitBoards[(int)Piece.P] & PieceBitBoards[(int)Piece.P].ShiftUp()).CountBits()
* Configuration.EngineSettings.DoubledPawnPenalty.PackedEvaluation)
- ((PieceBitBoards[(int)Piece.p] & PieceBitBoards[(int)Piece.p].ShiftUp()).CountBits()
* Configuration.EngineSettings.DoubledPawnPenalty.PackedEvaluation);
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static int TaperedEvaluation(TaperedEvaluationTerm taperedEvaluationTerm, int phase)
{
Expand Down Expand Up @@ -968,6 +980,16 @@ internal int KingAdditionalEvaluation(int squareIndex, Side kingSide)
return packedBonus + (ownPiecesAroundCount * Configuration.EngineSettings.KingShieldBonus.PackedEvaluation);
}

internal int DoublePawnPenalty()
{
var whitePawns = PieceBitBoards[(int)Piece.P];
var blackPawns = PieceBitBoards[(int)Piece.p];

return Configuration.EngineSettings.DoubledPawnPenalty.PackedEvaluation * (
(whitePawns & whitePawns.ShiftUp()).CountBits()
- (blackPawns & blackPawns.ShiftUp()).CountBits());
}

#endregion

#region Attacks
Expand Down
75 changes: 37 additions & 38 deletions tests/Lynx.Test/Model/PositionTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,25 +230,24 @@ public void StaticEvaluation_IsolatedPawnPenalty(string fen)
/// a b c d e f g h
/// </summary>
/// <param name="fen"></param>
//[TestCase("4k3/ppp5/8/8/8/P7/PP6/4K3 w - - 0 1")]
///// <summary>
///// Previous one mirrored
///// </summary>
///// <param name="fen"></param>
//[TestCase("3k4/6pp/7p/8/8/8/5PPP/3K4 b - - 0 1")]
//public void StaticEvaluation_DoublePawnPenalty(string fen)
//{
// Position position = new Position(fen);
// int evaluation = AdditionalPieceEvaluation(position, Piece.P)
// - AdditionalPieceEvaluation(position, Piece.p);

// if (position.Side == Side.Black)
// {
// evaluation = -evaluation;
// }

// Assert.AreEqual(4 * Configuration.EngineSettings.DoubledPawnPenalty.MG, evaluation);
//}
[TestCase("4k3/ppp5/8/8/8/P7/PP6/4K3 w - - 0 1")]
/// <summary>
/// Previous one mirrored
/// </summary>
/// <param name="fen"></param>
[TestCase("3k4/6pp/7p/8/8/8/5PPP/3K4 b - - 0 1")]
public void StaticEvaluation_DoublePawnPenalty(string fen)
{
Position position = new Position(fen);
int evaluation = position.DoublePawnPenalty();

if (position.Side == Side.Black)
{
evaluation = -evaluation;
}

Assert.AreEqual(1 * Configuration.EngineSettings.DoubledPawnPenalty.PackedEvaluation, evaluation);
}

/// <summary>
/// Illegal position, but avoids any positional bonuses
Expand All @@ -263,25 +262,25 @@ public void StaticEvaluation_IsolatedPawnPenalty(string fen)
/// a b c d e f g h
/// </summary>
/// <param name="fen"></param>
//[TestCase("7k/ppp2ppp/8/8/8/P7/PP4PP/P6K w - - 0 1")]
///// <summary>
///// Previous one mirrored
///// </summary>
///// <param name="fen"></param>
//[TestCase("k6p/pp4pp/7p/8/8/8/PPP2PPP/K7 b - - 0 1")]
//public void StaticEvaluation_TriplePawnPenalty(string fen)
//{
// Position position = new Position(fen);
// int evaluation = AdditionalPieceEvaluation(position, Piece.P)
// - AdditionalPieceEvaluation(position, Piece.p);

// if (position.Side == Side.Black)
// {
// evaluation = -evaluation;
// }

// Assert.AreEqual(9 * Configuration.EngineSettings.DoubledPawnPenalty.MG, evaluation);
//}
[TestCase("7k/ppp2ppp/8/8/8/P7/PP4PP/P6K w - - 0 1")]
/// <summary>
/// Previous one mirrored
/// </summary>
/// <param name="fen"></param>
[TestCase("k6p/pp4pp/7p/8/8/8/PPP2PPP/K7 b - - 0 1")]
public void StaticEvaluation_TriplePawnPenalty(string fen)
{
Position position = new Position(fen);
int evaluation = position.DoublePawnPenalty();


if (position.Side == Side.Black)
{
evaluation = -evaluation;
}

Assert.AreEqual(2 * Configuration.EngineSettings.DoubledPawnPenalty.PackedEvaluation, evaluation);
}

/// <summary>
/// 8 . . . . . . k .
Expand Down

0 comments on commit 43641aa

Please sign in to comment.