Skip to content

Commit 96cc27c

Browse files
committed
added numboards(obsolete)
1 parent eeeba7b commit 96cc27c

File tree

10 files changed

+818
-61
lines changed

10 files changed

+818
-61
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.rahul.bitboard;
2+
3+
import java.util.BitSet;
4+
5+
/**
6+
* This class takes in FEN strings which start from H1 and end at A8
7+
*
8+
* @author rahul
9+
*/
10+
public class BitBoard {
11+
12+
private BitSet bitBoard;
13+
public static final int BOARD_LENGTH = 64;
14+
15+
public BitBoard() {
16+
bitBoard = new BitSet(BOARD_LENGTH);
17+
}
18+
19+
public void flipBit(int index) {
20+
if (index >= 0 && index < BOARD_LENGTH)
21+
bitBoard.flip(index);
22+
}
23+
24+
public String getPrettyBitBoard() {
25+
StringBuilder builder = new StringBuilder();
26+
for (int i = 0; i < BOARD_LENGTH; i++) {
27+
builder.append(bitBoard.get(i) ? 1 : 0);
28+
}
29+
30+
return builder.toString();
31+
}
32+
33+
/**
34+
* This method returns an array of doubles which can be fed directly into a
35+
* neural network
36+
*
37+
* @return array of doubles
38+
* @author rahul
39+
*/
40+
public double[] getBitBoard() {
41+
double[] array = new double[BOARD_LENGTH];
42+
for (int i = 0; i < BOARD_LENGTH; i++) {
43+
if (bitBoard.get(i))
44+
array[i] = 1.0;
45+
else
46+
array[i] = 0.0;
47+
}
48+
return array;
49+
}
50+
51+
public static void main(String[] args) {
52+
BitBoard bb = new BitBoard();
53+
System.out.println(bb.getBitBoard());
54+
}
55+
}
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
package com.rahul.bitboard;
2+
3+
import java.io.BufferedReader;
4+
import java.io.File;
5+
import java.io.FileOutputStream;
6+
import java.io.FileReader;
7+
import java.io.ObjectOutputStream;
8+
import java.util.ArrayList;
9+
10+
import com.rahul.stockfish.Stockfish;
11+
12+
public class Generator {
13+
14+
private BitBoard WRooks;
15+
private BitBoard WBishops;
16+
private BitBoard WPawns;
17+
private BitBoard WKnights;
18+
private BitBoard WKing;
19+
private BitBoard WQueen;
20+
21+
private BitBoard BRooks;
22+
private BitBoard BBishops;
23+
private BitBoard BPawns;
24+
private BitBoard BKnights;
25+
private BitBoard BKing;
26+
private BitBoard BQueen;
27+
28+
private Stockfish stockfish;
29+
private double evalScore;
30+
31+
private ArrayList<RowData> data;
32+
33+
private ObjectOutputStream oos;
34+
private int turnChecker;
35+
36+
// Left out purposefully
37+
// private double turn;
38+
39+
public Generator() {
40+
stockfish = new Stockfish();
41+
turnChecker = -1;
42+
43+
data = new ArrayList<RowData>();
44+
}
45+
46+
private void initBoards() {
47+
WRooks = new BitBoard();
48+
WBishops = new BitBoard();
49+
WPawns = new BitBoard();
50+
WKnights = new BitBoard();
51+
WKing = new BitBoard();
52+
WQueen = new BitBoard();
53+
54+
BRooks = new BitBoard();
55+
BBishops = new BitBoard();
56+
BPawns = new BitBoard();
57+
BKnights = new BitBoard();
58+
BKing = new BitBoard();
59+
BQueen = new BitBoard();
60+
}
61+
62+
public void createBoards(String fen, boolean scorePresent) {
63+
initBoards();
64+
65+
int bitIndex = 0;
66+
char[] fenChars = fen.toCharArray();
67+
68+
for (int i = 0; i < fenChars.length && bitIndex < BitBoard.BOARD_LENGTH; i++) {
69+
switch (fenChars[i]) {
70+
case 'R':
71+
WRooks.flipBit(bitIndex++);
72+
break;
73+
case 'N':
74+
WKnights.flipBit(bitIndex++);
75+
break;
76+
case 'B':
77+
WBishops.flipBit(bitIndex++);
78+
break;
79+
case 'P':
80+
WPawns.flipBit(bitIndex++);
81+
break;
82+
case 'K':
83+
WKing.flipBit(bitIndex++);
84+
break;
85+
case 'Q':
86+
WQueen.flipBit(bitIndex++);
87+
break;
88+
89+
case 'r':
90+
BRooks.flipBit(bitIndex++);
91+
break;
92+
case 'n':
93+
BKnights.flipBit(bitIndex++);
94+
break;
95+
case 'b':
96+
BBishops.flipBit(bitIndex++);
97+
break;
98+
case 'p':
99+
BPawns.flipBit(bitIndex++);
100+
break;
101+
case 'k':
102+
BKing.flipBit(bitIndex++);
103+
break;
104+
case 'q':
105+
BQueen.flipBit(bitIndex++);
106+
break;
107+
case '/':
108+
break;
109+
default:
110+
bitIndex += (int) fenChars[i] - 48;
111+
}
112+
}
113+
try {
114+
if (scorePresent) {
115+
evalScore = Integer.parseInt(fen.split("\\[")[1].split("]")[0]) / 100.0f;
116+
} else {
117+
evalScore = turnChecker * stockfish.getEvalScore(fen, 2000);
118+
}
119+
} catch (Exception e) {
120+
evalScore = 0;
121+
return;
122+
}
123+
}
124+
125+
public String prettyPrintBoards() {
126+
StringBuilder builder = new StringBuilder();
127+
128+
builder.append("White Rooks : ");
129+
builder.append(WRooks.getPrettyBitBoard() + "\n");
130+
builder.append("White Knights : ");
131+
builder.append(WKnights.getPrettyBitBoard() + "\n");
132+
builder.append("White Bishops : ");
133+
builder.append(WBishops.getPrettyBitBoard() + "\n");
134+
builder.append("White Pawns : ");
135+
builder.append(WPawns.getPrettyBitBoard() + "\n");
136+
builder.append("White King : ");
137+
builder.append(WKing.getPrettyBitBoard() + "\n");
138+
builder.append("White Queen : ");
139+
builder.append(WQueen.getPrettyBitBoard() + "\n");
140+
141+
builder.append("Black Rooks : ");
142+
builder.append(BRooks.getPrettyBitBoard() + "\n");
143+
builder.append("Black Knights : ");
144+
builder.append(BKnights.getPrettyBitBoard() + "\n");
145+
builder.append("Black Bishops : ");
146+
builder.append(BBishops.getPrettyBitBoard() + "\n");
147+
builder.append("Black Pawns : ");
148+
builder.append(BPawns.getPrettyBitBoard() + "\n");
149+
builder.append("Black King : ");
150+
builder.append(BKing.getPrettyBitBoard() + "\n");
151+
builder.append("Black Queen : ");
152+
builder.append(BQueen.getPrettyBitBoard() + "\n");
153+
builder.append("Evaluation score : ");
154+
builder.append(evalScore + "\n");
155+
156+
return builder.toString();
157+
}
158+
159+
/**
160+
* scorePresent : Pass true if evaluation scores are present in the input
161+
* file. False otherwise. linesToRead : Number of lines to read or -1 for
162+
* reading the whole file
163+
*/
164+
public void buildBoards(boolean scorePresent, int linesToRead) {
165+
try {
166+
BufferedReader br = new BufferedReader(new FileReader(new File(
167+
"./data/thinking.log")));
168+
String fen;
169+
int linesRead = 0;
170+
171+
if (linesToRead == -1)
172+
linesToRead = Integer.MAX_VALUE;
173+
174+
if (!scorePresent)
175+
stockfish.startEngine();
176+
while ((fen = br.readLine()) != null && linesRead++ < linesToRead) {
177+
createBoards(fen, scorePresent);
178+
turnChecker *= -1;
179+
createRow();
180+
}
181+
if (!scorePresent)
182+
stockfish.stopEngine();
183+
br.close();
184+
185+
storeData();
186+
} catch (Exception e) {
187+
e.printStackTrace();
188+
}
189+
}
190+
191+
private void storeData() {
192+
try {
193+
oos = new ObjectOutputStream(new FileOutputStream(new File(
194+
"./data/bitboards_thinking_1000.bb")));
195+
oos.writeObject(data);
196+
} catch (Exception e) {
197+
e.printStackTrace();
198+
}
199+
}
200+
201+
public void createRow() {
202+
StringBuilder builder = new StringBuilder();
203+
204+
builder.append(WRooks.getPrettyBitBoard());
205+
builder.append(WKnights.getPrettyBitBoard());
206+
builder.append(WBishops.getPrettyBitBoard());
207+
builder.append(WPawns.getPrettyBitBoard());
208+
builder.append(WKing.getPrettyBitBoard());
209+
builder.append(WQueen.getPrettyBitBoard());
210+
211+
builder.append(BRooks.getPrettyBitBoard());
212+
builder.append(BKnights.getPrettyBitBoard());
213+
builder.append(BBishops.getPrettyBitBoard());
214+
builder.append(BPawns.getPrettyBitBoard());
215+
builder.append(BKing.getPrettyBitBoard());
216+
builder.append(BQueen.getPrettyBitBoard());
217+
218+
data.add(new RowData(builder.toString(), evalScore));
219+
}
220+
221+
public static void main(String[] args) {
222+
Generator generator = new Generator();
223+
generator.buildBoards(true, 1000);
224+
}
225+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.rahul.bitboard;
2+
3+
import java.io.Serializable;
4+
5+
6+
public class RowData implements Serializable {
7+
8+
private static final long serialVersionUID = 1L;
9+
private String input;
10+
private double expectedOutput;
11+
12+
public RowData(String input, double expectedOutput) {
13+
this.setInput(input);
14+
this.setExpectedOutput(expectedOutput);
15+
}
16+
17+
public String getInput() {
18+
return input;
19+
}
20+
21+
public void setInput(String input) {
22+
this.input = input;
23+
}
24+
25+
public double getExpectedOutput() {
26+
return expectedOutput;
27+
}
28+
29+
public void setExpectedOutput(double expectedOutput) {
30+
this.expectedOutput = expectedOutput;
31+
}
32+
33+
}

0 commit comments

Comments
 (0)