Skip to content
This repository was archived by the owner on Aug 2, 2019. It is now read-only.

Commit 7fea632

Browse files
committed
Merge pull request #1 from nescitus/master
direction (vector) loops in eval_piece()
2 parents b1c3651 + 1af4623 commit 7fea632

File tree

1 file changed

+59
-291
lines changed

1 file changed

+59
-291
lines changed

src/eval.cpp

Lines changed: 59 additions & 291 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,12 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
882882
int king;
883883
int delta;
884884
int att;
885+
int vector; // for mobility loops
886+
887+
static const int knight_vector[8] = {-33, -31, -18, -14, 33, 31, 18, 14};
888+
static const int bishop_vector[4] = {-17, -15, 15, 17};
889+
static const int rook_vector[4] = { -1, -16, 16, 1};
890+
static const int queen_vector[8] = {-17, -15, 15, 17, -1, -16, 16, 1};
885891

886892
ASSERT(board!=NULL);
887893
ASSERT(mat_info!=NULL);
@@ -921,69 +927,15 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
921927

922928
// mobility
923929

924-
to = from - 33;
925-
if ((capture = unit[board->square[to]]) > MobDefense) {
926-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
927-
if (UseMobAttack && capture > MobAttack) {
928-
if (NO_DEFENDER(to,pawn_safe)) att += capture;
929-
}
930-
}
931-
932-
to = from - 31;
933-
if ((capture = unit[board->square[to]]) > MobDefense) {
934-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
935-
if (UseMobAttack && capture > MobAttack) {
936-
if (NO_DEFENDER(to,pawn_safe)) att += capture;
937-
}
938-
}
939-
940-
to = from - 18;
941-
if ((capture = unit[board->square[to]]) > MobDefense) {
942-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
943-
if (UseMobAttack && capture > MobAttack) {
944-
if (NO_DEFENDER(to,pawn_safe)) att += capture;
945-
}
946-
}
947-
948-
to = from - 14;
949-
if ((capture = unit[board->square[to]]) > MobDefense) {
950-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
951-
if (UseMobAttack && capture > MobAttack) {
952-
if (NO_DEFENDER(to,pawn_safe)) att += capture;
953-
}
954-
}
955-
956-
to = from + 14;
957-
if ((capture = unit[board->square[to]]) > MobDefense) {
958-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
959-
if (UseMobAttack && capture > MobAttack) {
960-
if (NO_DEFENDER(to,pawn_safe)) att += capture;
961-
}
962-
}
963-
964-
to = from + 18;
965-
if ((capture = unit[board->square[to]]) > MobDefense) {
966-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
967-
if (UseMobAttack && capture > MobAttack) {
968-
if (NO_DEFENDER(to,pawn_safe)) att += capture;
969-
}
970-
}
971-
972-
to = from + 31;
973-
if ((capture = unit[board->square[to]]) > MobDefense) {
974-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
975-
if (UseMobAttack && capture > MobAttack) {
976-
if (NO_DEFENDER(to,pawn_safe)) att += capture;
977-
}
978-
}
979-
980-
to = from + 33;
981-
if ((capture = unit[board->square[to]]) > MobDefense) {
982-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
983-
if (UseMobAttack && capture > MobAttack) {
984-
if (NO_DEFENDER(to,pawn_safe)) att += capture;
985-
}
986-
}
930+
for (int i = 0; i < 8; i++) {
931+
to = from + knight_vector[i];
932+
if ((capture = unit[board->square[to]]) > MobDefense) {
933+
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob++;
934+
if (UseMobAttack && capture > MobAttack) {
935+
if (NO_DEFENDER(to,pawn_safe)) att += capture;
936+
}
937+
}
938+
}
987939

988940
if (UseMobLinear) {
989941
op[me] += (mob - KnightUnit) * KnightMobOpening;
@@ -1004,81 +956,26 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
1004956

1005957
// mobility
1006958

1007-
// direction -17
1008-
1009-
for (to = from-17; capture=board->square[to], THROUGH(capture); to -= 17) {
1010-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1011-
}
1012-
1013-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1014-
mob += MobAttack;
1015-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
959+
for (int i = 0; i < 4; i++) {
960+
vector = bishop_vector[i];
1016961

1017-
} else if (UseMobXRay && (capture & BishopFlag) != 0) { // MobXRay
1018-
do {
1019-
ASSERT(COLOUR_IS(capture,me));
1020-
for (to -= 17; capture=board->square[to], THROUGH(capture); to -= 17) {
1021-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1022-
}
1023-
} while ((capture & BishopFlag) != 0 && PIECE_COLOUR(capture) == me);
1024-
}
1025-
1026-
// direction -15
1027-
1028-
for (to = from-15; capture=board->square[to], THROUGH(capture); to -= 15) {
1029-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1030-
}
1031-
1032-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1033-
mob += MobAttack;
1034-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1035-
1036-
} else if (UseMobXRay && (capture & BishopFlag) != 0) { // MobXRay
1037-
do {
1038-
ASSERT(COLOUR_IS(capture,me));
1039-
for (to -= 15; capture=board->square[to], THROUGH(capture); to -= 15) {
1040-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1041-
}
1042-
} while ((capture & BishopFlag) != 0 && PIECE_COLOUR(capture) == me);
1043-
}
962+
for (to = from+vector; capture=board->square[to], THROUGH(capture); to += vector) {
963+
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
964+
}
1044965

1045-
// direction +15
1046-
1047-
for (to = from+15; capture=board->square[to], THROUGH(capture); to += 15) {
1048-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1049-
}
966+
if ((piece = unit[capture]) > MobDefense) { // MobAttack
967+
mob += MobAttack;
968+
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1050969

1051-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1052-
mob += MobAttack;
1053-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1054-
1055-
} else if (UseMobXRay && (capture & BishopFlag) != 0) { // MobXRay
1056-
do {
1057-
ASSERT(COLOUR_IS(capture,me));
1058-
for (to += 15; capture=board->square[to], THROUGH(capture); to += 15) {
1059-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1060-
}
1061-
} while ((capture & BishopFlag) != 0 && PIECE_COLOUR(capture) == me);
1062-
}
1063-
1064-
// direction +17
1065-
1066-
for (to = from+17; capture=board->square[to], THROUGH(capture); to += 17) {
1067-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1068-
}
1069-
1070-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1071-
mob += MobAttack;
1072-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1073-
1074-
} else if (UseMobXRay && (capture & BishopFlag) != 0) { // MobXRay
1075-
do {
1076-
ASSERT(COLOUR_IS(capture,me));
1077-
for (to += 17; capture=board->square[to], THROUGH(capture); to += 17) {
1078-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1079-
}
1080-
} while ((capture & BishopFlag) != 0 && PIECE_COLOUR(capture) == me);
1081-
}
970+
} else if (UseMobXRay && (capture & BishopFlag) != 0) { // MobXRay
971+
do {
972+
ASSERT(COLOUR_IS(capture,me));
973+
for (to += vector; capture=board->square[to], THROUGH(capture); to += vector) {
974+
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
975+
}
976+
} while ((capture & BishopFlag) != 0 && PIECE_COLOUR(capture) == me);
977+
}
978+
}
1082979

1083980
if (UseMobLinear) {
1084981
op[me] += (mob - BishopUnit) * BishopMobOpening;
@@ -1099,81 +996,26 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
1099996

1100997
// mobility
1101998

1102-
// direction -16
1103-
1104-
for (to = from-16; capture=board->square[to], THROUGH(capture); to -= 16) {
1105-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1106-
}
1107-
1108-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1109-
mob += MobAttack;
1110-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1111-
1112-
} else if (UseMobXRay && (capture & RookFlag) != 0) { // MobXRay
1113-
do {
1114-
ASSERT(COLOUR_IS(capture,me));
1115-
for (to -= 16; capture=board->square[to], THROUGH(capture); to -= 16) {
1116-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1117-
}
1118-
} while ((capture & RookFlag) != 0 && PIECE_COLOUR(capture) == me);
1119-
}
1120-
1121-
// direction -1
1122-
1123-
for (to = from- 1; capture=board->square[to], THROUGH(capture); to -= 1) {
1124-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1125-
}
1126-
1127-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1128-
mob += MobAttack;
1129-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1130-
1131-
} else if (UseMobXRay && (capture & RookFlag) != 0) { // MobXRay
1132-
do {
1133-
ASSERT(COLOUR_IS(capture,me));
1134-
for (to -= 1; capture=board->square[to], THROUGH(capture); to -= 1) {
1135-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1136-
}
1137-
} while ((capture & RookFlag) != 0 && PIECE_COLOUR(capture) == me);
1138-
}
1139-
1140-
// direction +1
999+
for (int i = 0; i < 4; i++) {
1000+
vector = rook_vector[i];
11411001

1142-
for (to = from+ 1; capture=board->square[to], THROUGH(capture); to += 1) {
1143-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1144-
}
1002+
for (to = from+vector; capture=board->square[to], THROUGH(capture); to += vector) {
1003+
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1004+
}
11451005

1146-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1147-
mob += MobAttack;
1148-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1006+
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1007+
mob += MobAttack;
1008+
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
11491009

1150-
} else if (UseMobXRay && (capture & RookFlag) != 0) { // MobXRay
1151-
do {
1152-
ASSERT(COLOUR_IS(capture,me));
1153-
for (to += 1; capture=board->square[to], THROUGH(capture); to += 1) {
1154-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1155-
}
1156-
} while ((capture & RookFlag) != 0 && PIECE_COLOUR(capture) == me);
1157-
}
1158-
1159-
// direction +16
1160-
1161-
for (to = from+16; capture=board->square[to], THROUGH(capture); to += 16) {
1162-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1163-
}
1164-
1165-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1166-
mob += MobAttack;
1167-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1168-
1169-
} else if (UseMobXRay && (capture & RookFlag) != 0) { // MobXRay
1170-
do {
1171-
ASSERT(COLOUR_IS(capture,me));
1172-
for (to += 16; capture=board->square[to], THROUGH(capture); to += 16) {
1173-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1174-
}
1175-
} while ((capture & RookFlag) != 0 && PIECE_COLOUR(capture) == me);
1176-
}
1010+
} else if (UseMobXRay && (capture & RookFlag) != 0) { // MobXRay
1011+
do {
1012+
ASSERT(COLOUR_IS(capture,me));
1013+
for (to += vector; capture=board->square[to], THROUGH(capture); to += vector) {
1014+
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1015+
}
1016+
} while ((capture & RookFlag) != 0 && PIECE_COLOUR(capture) == me);
1017+
}
1018+
}
11771019

11781020
if (UseMobLinear) {
11791021
op[me] += (mob - RookUnit) * RookMobOpening;
@@ -1238,93 +1080,19 @@ static void eval_piece(const board_t * board, const material_info_t * mat_info,
12381080

12391081
// mobility
12401082

1241-
// direction -17
1242-
1243-
for (to = from-17; capture=board->square[to], THROUGH(capture); to -= 17) {
1244-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1245-
}
1246-
1247-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1248-
mob += MobAttack;
1249-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1250-
}
1251-
1252-
// direction -16
1253-
1254-
for (to = from-16; capture=board->square[to], THROUGH(capture); to -= 16) {
1255-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1256-
}
1257-
1258-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1259-
mob += MobAttack;
1260-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1261-
}
1262-
1263-
// direction -15
1264-
1265-
for (to = from-15; capture=board->square[to], THROUGH(capture); to -= 15) {
1266-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1267-
}
1268-
1269-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1270-
mob += MobAttack;
1271-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1272-
}
1273-
1274-
// direction -1
1275-
1276-
for (to = from- 1; capture=board->square[to], THROUGH(capture); to -= 1) {
1277-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1278-
}
1279-
1280-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1281-
mob += MobAttack;
1282-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1283-
}
1284-
1285-
// direction +1
1083+
for (int i = 0; i < 8; i++) {
1084+
vector = queen_vector[i];
12861085

1287-
for (to = from+ 1; capture=board->square[to], THROUGH(capture); to += 1) {
1288-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1289-
}
1290-
1291-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1292-
mob += MobAttack;
1293-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1294-
}
1086+
for (to = from+vector; capture=board->square[to], THROUGH(capture); to += vector) {
1087+
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1088+
}
12951089

1296-
// direction +15
1090+
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1091+
mob += MobAttack;
1092+
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1093+
}
1094+
}
12971095

1298-
for (to = from+15; capture=board->square[to], THROUGH(capture); to += 15) {
1299-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1300-
}
1301-
1302-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1303-
mob += MobAttack;
1304-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1305-
}
1306-
1307-
// direction +16
1308-
1309-
for (to = from+16; capture=board->square[to], THROUGH(capture); to += 16) {
1310-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1311-
}
1312-
1313-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1314-
mob += MobAttack;
1315-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1316-
}
1317-
1318-
// direction +17
1319-
1320-
for (to = from+17; capture=board->square[to], THROUGH(capture); to += 17) {
1321-
if (!UseMobPawnSafe || NO_ATTACKER(to,pawn_safe)) mob += MobMove;
1322-
}
1323-
1324-
if ((piece = unit[capture]) > MobDefense) { // MobAttack
1325-
mob += MobAttack;
1326-
if (UseMobAttack && NO_DEFENDER(to,pawn_safe)) att += piece;
1327-
}
13281096

13291097
if (UseMobLinear) {
13301098
op[me] += (mob - QueenUnit) * QueenMobOpening;

0 commit comments

Comments
 (0)