Skip to content

Commit b1dfc40

Browse files
committed
factored out evalinfo.attacks
1 parent f92c195 commit b1dfc40

File tree

12 files changed

+162
-335
lines changed

12 files changed

+162
-335
lines changed

NoraGrace/NoraGrace.Engine.Tests/EvalMaterialTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public int BasicScore
2323
{
2424
get
2525
{
26-
return (p * 100) + (n * 300) + (b * 300) + (r * 500) + (q * 900) + (b > 1 ? 50 : 0);
26+
return (p * 100) + (n * 330) + (b * 330) + (r * 500) + (q * 1000) + (b > 1 ? 50 : 0);
2727
}
2828
}
2929
}
@@ -111,7 +111,7 @@ public void Within150OfBasic()
111111
foreach (var s in Samples())
112112
{
113113
var r = eval.EvalMaterial(0, s.white.p, s.white.n, s.white.b, s.white.r, s.white.q, s.black.p, s.black.n, s.black.b, s.black.r, s.black.q);
114-
Assert.IsTrue(Math.Abs(r.Score - s.BasicScore) < 150);
114+
Assert.IsTrue(Math.Abs(r.Score - s.BasicScore) < 160);
115115
}
116116
//var r = evalBasic.EvalMaterial(0, ss.white.p, ss.white.n, ss.white.b, ss.white.r, ss.white.q, ss.black.p, ss.black.n, ss.black.b, ss.black.r, ss.black.q);
117117
}

NoraGrace/NoraGrace.Engine/AttackInfo.cs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace NoraGrace.Engine
1010

1111
public class AttackInfo
1212
{
13-
public const int MAX_ATTACK_COUNT = 3;
13+
public const int MAX_ATTACK_COUNT = 4;
1414
public const int MAX_PIECE_COUNT = 8;
1515

1616
private long _zobrist;
@@ -45,11 +45,18 @@ public void Initialize(Board board)
4545
Bitboard count1 = Bitboard.Empty;
4646
Bitboard count2 = Bitboard.Empty;
4747
Bitboard count3 = Bitboard.Empty;
48+
Bitboard count4 = Bitboard.Empty;
49+
4850
Bitboard bbPieceAttacks;
4951

5052
_zobrist = board.ZobristBoard;
5153

54+
55+
Bitboard allPieces = board.PieceLocationsAll;
5256
Bitboard myPieces = board[_player];
57+
Bitboard myBishopSliders = myPieces & board.BishopSliders;
58+
Bitboard myRookSliders = myPieces & board.RookSliders;
59+
5360
Bitboard bbPiece;
5461
Bitboard pattacks;
5562
Position pos;
@@ -63,21 +70,25 @@ public void Initialize(Board board)
6370
pos = BitboardUtil.PopFirst(ref bbPiece);
6471
pattacks = Attacks.KnightAttacks(pos);
6572
bbPieceAttacks |= pattacks;
73+
count4 |= count3 & pattacks;
6674
count3 |= count2 & pattacks;
6775
count2 |= count1 & pattacks;
6876
count1 |= pattacks;
6977
}
7078
_byPieceType[(int)PieceType.Knight] = bbPieceAttacks;
7179

80+
7281

7382
//bishops
7483
bbPieceAttacks = Bitboard.Empty;
7584
bbPiece = myPieces & board[PieceType.Bishop];
7685
while (bbPiece != Bitboard.Empty)
7786
{
7887
pos = BitboardUtil.PopFirst(ref bbPiece);
79-
pattacks = Attacks.BishopAttacks(pos, board.PieceLocationsAll);
88+
pattacks = Attacks.BishopAttacks(pos, allPieces);
8089
bbPieceAttacks |= pattacks;
90+
pattacks = Attacks.BishopAttacks(pos, allPieces ^ myBishopSliders);
91+
count4 |= count3 & pattacks;
8192
count3 |= count2 & pattacks;
8293
count2 |= count1 & pattacks;
8394
count1 |= pattacks;
@@ -90,8 +101,10 @@ public void Initialize(Board board)
90101
while (bbPiece != Bitboard.Empty)
91102
{
92103
pos = BitboardUtil.PopFirst(ref bbPiece);
93-
pattacks = Attacks.RookAttacks(pos, board.PieceLocationsAll);
104+
pattacks = Attacks.RookAttacks(pos, allPieces);
94105
bbPieceAttacks |= pattacks;
106+
pattacks = Attacks.RookAttacks(pos, allPieces ^ myRookSliders);
107+
count4 |= count3 & pattacks;
95108
count3 |= count2 & pattacks;
96109
count2 |= count1 & pattacks;
97110
count1 |= pattacks;
@@ -104,8 +117,11 @@ public void Initialize(Board board)
104117
while (bbPiece != Bitboard.Empty)
105118
{
106119
pos = BitboardUtil.PopFirst(ref bbPiece);
107-
pattacks = Attacks.QueenAttacks(pos, board.PieceLocationsAll);
120+
pattacks = Attacks.QueenAttacks(pos, allPieces);
108121
bbPieceAttacks |= pattacks;
122+
pattacks = Attacks.BishopAttacks(pos, allPieces ^ myBishopSliders);
123+
pattacks |= Attacks.RookAttacks(pos, allPieces ^ myRookSliders);
124+
count4 |= count3 & pattacks;
109125
count3 |= count2 & pattacks;
110126
count2 |= count1 & pattacks;
111127
count1 |= pattacks;
@@ -116,6 +132,7 @@ public void Initialize(Board board)
116132
//add king attacks
117133
pattacks = Attacks.KingAttacks(board.KingPosition(_player));
118134
_byPieceType[(int)PieceType.King] = pattacks;
135+
count4 |= count3 & pattacks;
119136
count3 |= count2 & pattacks;
120137
count2 |= count1 & pattacks;
121138
count1 |= pattacks;
@@ -128,13 +145,15 @@ public void Initialize(Board board)
128145
//pawn attacks west;
129146
pattacks = bbPiece.ShiftDirW();
130147
bbPieceAttacks |= pattacks;
148+
count4 |= count3 & pattacks;
131149
count3 |= count2 & pattacks;
132150
count2 |= count1 & pattacks;
133151
count1 |= pattacks;
134152

135153
//pawn attacks east;
136154
pattacks = bbPiece.ShiftDirE();
137155
bbPieceAttacks |= pattacks;
156+
count4 |= count3 & pattacks;
138157
count3 |= count2 & pattacks;
139158
count2 |= count1 & pattacks;
140159
count1 |= pattacks;
@@ -146,6 +165,7 @@ public void Initialize(Board board)
146165
_counts[1] = count1;
147166
_counts[2] = count2;
148167
_counts[3] = count3;
168+
_counts[4] = count4;
149169

150170
//setup less than attack arrays
151171
_lessThan[(int)PieceType.Pawn] = Bitboard.Empty;
@@ -173,6 +193,7 @@ public int AttackCountTo(Position pos)
173193
retval += (int)((ulong)(_counts[1] & bb) >> (int)pos);
174194
retval += (int)((ulong)(_counts[2] & bb) >> (int)pos);
175195
retval += (int)((ulong)(_counts[3] & bb) >> (int)pos);
196+
retval += (int)((ulong)(_counts[4] & bb) >> (int)pos);
176197
return retval;
177198
}
178199

NoraGrace/NoraGrace.Engine/Evaluation/EvalResults.cs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class EvalResults
1818
public int Material { get; private set; }
1919
public PhasedScore PcSq { get; set; }
2020
public PhasedScore Pawns { get; private set; }
21+
public PhasedScore Mobility { get; set; }
22+
public int KingAttack { get; set; }
2123
public ScaleFactor StageStartWeight { get; private set; }
2224
public ScaleFactor ScaleWhite { get; private set; }
2325
public ScaleFactor ScaleBlack { get; private set; }
@@ -26,18 +28,18 @@ public class EvalResults
2628

2729
//advanced eval terms.
2830
public int LazyAge { get; set; }
29-
public ChessEvalAttackInfo[] Attacks = new ChessEvalAttackInfo[] { new ChessEvalAttackInfo(), new ChessEvalAttackInfo() };
31+
3032
public PhasedScore PawnsPassed = 0;
3133
public PhasedScore ShelterStorm = 0;
3234

3335
public void Reset()
3436
{
35-
Attacks[0].Reset();
36-
Attacks[1].Reset();
3737
Material = 0;
3838
PcSq = 0;
3939
Pawns = 0;
4040
PawnsPassed = 0;
41+
Mobility = 0;
42+
KingAttack = 0;
4143
ShelterStorm = 0;
4244
StageStartWeight = ScaleFactor.FULL;
4345
ScaleWhite = ScaleFactor.FULL;
@@ -70,10 +72,12 @@ public void ApplyPreviousEval(Board board, EvalResults prev)
7072
this.LazyAge = prev.LazyAge + 1;
7173

7274
//copy advanced evaluation items.
73-
this.Attacks[0].KingAttackerScore = prev.Attacks[0].KingAttackerScore;
74-
this.Attacks[1].KingAttackerScore = prev.Attacks[1].KingAttackerScore;
75-
this.Attacks[0].Mobility = prev.Attacks[0].Mobility;
76-
this.Attacks[1].Mobility = prev.Attacks[1].Mobility;
75+
//this.Attacks[0].KingAttackerScore = prev.Attacks[0].KingAttackerScore;
76+
//this.Attacks[1].KingAttackerScore = prev.Attacks[1].KingAttackerScore;
77+
this.Mobility = prev.Mobility;
78+
this.KingAttack = prev.KingAttack;
79+
//this.Attacks[0].Mobility = prev.Attacks[0].Mobility;
80+
//this.Attacks[1].Mobility = prev.Attacks[1].Mobility;
7781
this.PawnsPassed = prev.PawnsPassed;
7882
this.ShelterStorm = prev.ShelterStorm;
7983

@@ -104,10 +108,10 @@ public int Score
104108
.Add(Pawns)
105109
.Add(PawnsPassed)
106110
.Add(ShelterStorm)
107-
.Add(this.Attacks[0].Mobility.Subtract(this.Attacks[1].Mobility)).ApplyScaleFactor(StageStartWeight) + Material;
108-
109-
nonScaled += this.Attacks[0].KingAttackerScore;
110-
nonScaled -= this.Attacks[1].KingAttackerScore;
111+
.Add(Mobility)
112+
.ApplyScaleFactor(StageStartWeight)
113+
+ Material
114+
+ KingAttack;
111115

112116
if (nonScaled > DrawScore && ScaleWhite < ScaleFactor.FULL)
113117
{
@@ -141,7 +145,7 @@ public int MobilityPhased
141145
{
142146
get
143147
{
144-
return Attacks[0].Mobility.Subtract(Attacks[1].Mobility).ApplyScaleFactor(StageStartWeight);
148+
return Mobility.ApplyScaleFactor(StageStartWeight);
145149
}
146150
}
147151
public int PawnsPhased
@@ -164,7 +168,7 @@ public int KingSafetyPhased
164168
{
165169
get
166170
{
167-
return Attacks[0].KingAttackerScore - Attacks[1].KingAttackerScore;
171+
return KingAttack;
168172
}
169173
}
170174

NoraGrace/NoraGrace.Engine/Evaluation/Evaluator.cs

Lines changed: 18 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ public virtual int Eval(Board board, PlyData plyData = null)
9292
var pawns = _evalPawns.PawnEval(board);
9393
if (plyData == null) { plyData = _plyData; }
9494

95+
plyData.EvalResults.MaterialPawnsApply(board, material, pawns, DrawScore);
9596
EvalAdvanced(board, plyData, material, pawns);
9697
return plyData.EvalResults.Score;
9798
}
@@ -107,36 +108,31 @@ public void EvalAdvanced(Board board, PlyData plyData, MaterialResults material,
107108
//mark that advanced eval terms are from this ply
108109
evalInfo.LazyAge = 0;
109110

110-
//set up
111-
var attacksWhite = evalInfo.Attacks[(int)Player.White];
112-
var attacksBlack = evalInfo.Attacks[(int)Player.Black];
111+
plyData.AttacksWhite.Initialize(board);
112+
plyData.AttacksBlack.Initialize(board);
113+
var whiteAttackInfo = plyData.AttacksWhite;
114+
var blackAttackInfo = plyData.AttacksBlack;
113115

114-
attacksWhite.PawnEast = board[Player.White, PieceType.Pawn].ShiftDirNE();
115-
attacksWhite.PawnWest = board[Player.White, PieceType.Pawn].ShiftDirNW();
116-
attacksBlack.PawnEast = board[Player.Black, PieceType.Pawn].ShiftDirSE();
117-
attacksBlack.PawnWest = board[Player.Black, PieceType.Pawn].ShiftDirSW();
118-
119-
attacksWhite.King = Attacks.KingAttacks(board.KingPosition(Player.White));
120-
attacksBlack.King = Attacks.KingAttacks(board.KingPosition(Player.Black));
116+
121117

122-
_evalMobility.EvaluateMyPieces(board, Player.White, evalInfo);
123-
_evalMobility.EvaluateMyPieces(board, Player.Black, evalInfo);
118+
Bitboard whiteAttackers;
119+
Bitboard blackAttackers;
124120

125-
_evalKing.EvaluateMyKingAttack(board, Player.White, evalInfo);
126-
_evalKing.EvaluateMyKingAttack(board, Player.Black, evalInfo);
121+
var whiteMobility = _evalMobility.EvaluateMyPieces(board, Player.White, evalInfo, plyData, out whiteAttackers);
122+
var blackMobility = _evalMobility.EvaluateMyPieces(board, Player.Black, evalInfo, plyData, out blackAttackers);
123+
evalInfo.Mobility = whiteMobility.Subtract(blackMobility);
127124

125+
var whiteKingAttack = _evalKing.EvaluateMyKingAttack(board, Player.White, evalInfo, plyData, whiteAttackers);
126+
var blackKingAttack = _evalKing.EvaluateMyKingAttack(board, Player.Black, evalInfo, plyData, blackAttackers);
127+
evalInfo.KingAttack = whiteKingAttack - blackKingAttack;
128128

129129
//first check for unstoppable pawns, if none, then eval normal passed pawns.
130130
evalInfo.PawnsPassed = PawnEvaluator.EvalUnstoppablePawns(board, pawns.PassedPawns, pawns.Candidates);
131131
if (evalInfo.PawnsPassed == 0)
132132
{
133-
evalInfo.PawnsPassed = this._evalPawns.EvalPassedPawns(board, evalInfo.Attacks, pawns.PassedPawns, pawns.Candidates, evalInfo.Workspace); ;
133+
evalInfo.PawnsPassed = this._evalPawns.EvalPassedPawns(board, plyData, pawns.PassedPawns, pawns.Candidates, evalInfo.Workspace); ;
134134
}
135135

136-
//evalInfo.PawnsPassed = this._evalPawns.EvalPassedPawns(board, evalInfo.Attacks, pawns.PassedPawns, pawns.Candidates, evalInfo.Workspace); ;
137-
138-
139-
140136
//shelter storm;
141137
if (material.DoShelter)
142138
{
@@ -155,14 +151,12 @@ public void EvalAdvanced(Board board, PlyData plyData, MaterialResults material,
155151
if (PcSqEvaluator.UseEndGamePcSq(board, Player.White, out endGamePcSq))
156152
{
157153
evalInfo.PcSq = endGamePcSq;
158-
evalInfo.Attacks[0].Mobility = 0;
159-
evalInfo.Attacks[1].Mobility = 0;
154+
evalInfo.Mobility = 0;
160155
}
161156
else if (PcSqEvaluator.UseEndGamePcSq(board, Player.Black, out endGamePcSq))
162157
{
163158
evalInfo.PcSq = endGamePcSq.Negate();
164-
evalInfo.Attacks[0].Mobility = 0;
165-
evalInfo.Attacks[1].Mobility = 0;
159+
evalInfo.Mobility = 0;
166160
}
167161

168162

@@ -220,81 +214,6 @@ protected virtual float CalcStartWeight(int basicMaterialCount)
220214

221215
}
222216

223-
224-
public class ChessEvalAttackInfo
225-
{
226-
public Bitboard PawnEast;
227-
public Bitboard PawnWest;
228-
229-
public Bitboard Knight;
230-
public Bitboard Knight2;
231-
public Bitboard Bishop;
232-
233-
public Bitboard Rook;
234-
public Bitboard Rook2;
235-
public Bitboard Queen;
236-
public Bitboard King;
237-
238-
public PhasedScore Mobility;
239-
240-
public int KingQueenTropism;
241-
public int KingAttackerWeight;
242-
public int KingAttackerCount;
243-
public int KingAttackerScore;
244-
245-
public void Reset()
246-
{
247-
PawnEast = Bitboard.Empty;
248-
PawnWest = Bitboard.Empty;
249-
Knight = Bitboard.Empty;
250-
Knight2 = Bitboard.Empty;
251-
Bishop = Bitboard.Empty;
252-
Rook = Bitboard.Empty;
253-
Rook2 = Bitboard.Empty;
254-
Queen = Bitboard.Empty;
255-
King = Bitboard.Empty;
256-
Mobility = 0;
257-
KingQueenTropism = 24; //init to far away.
258-
KingAttackerWeight = 0;
259-
KingAttackerCount = 0;
260-
KingAttackerScore = 0;
261-
}
262-
263-
public Bitboard All()
264-
{
265-
return PawnEast | PawnWest | Knight | Knight2 | Bishop | Rook | Rook2 | Queen | King;
266-
}
267-
268-
public int AttackCountTo(Position pos)
269-
{
270-
return 0
271-
+ (int)(((ulong)PawnEast >> (int)pos) & 1)
272-
+ (int)(((ulong)PawnWest >> (int)pos) & 1)
273-
+ (int)(((ulong)Knight >> (int)pos) & 1)
274-
+ (int)(((ulong)Knight2 >> (int)pos) & 1)
275-
+ (int)(((ulong)Bishop >> (int)pos) & 1)
276-
+ (int)(((ulong)Rook >> (int)pos) & 1)
277-
+ (int)(((ulong)Rook2 >> (int)pos) & 1)
278-
+ (int)(((ulong)Queen >> (int)pos) & 1)
279-
+ (int)(((ulong)King >> (int)pos) & 1);
280-
}
281-
282-
public ChessEvalAttackInfo Reverse()
283-
{
284-
return new ChessEvalAttackInfo()
285-
{
286-
PawnEast = PawnEast.Reverse(),
287-
PawnWest = PawnWest.Reverse(),
288-
Knight = Knight.Reverse(),
289-
Knight2 = Knight2.Reverse(),
290-
Bishop = Bishop.Reverse(),
291-
Rook = Rook.Reverse(),
292-
Rook2 = Rook2.Reverse(),
293-
Queen = Queen.Reverse(),
294-
King = King.Reverse()
295-
};
296-
}
297-
}
298-
217+
299218

300219
}

0 commit comments

Comments
 (0)