package com.rahul.bbgen; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.ObjectOutputStream; import java.util.ArrayList; import com.rahul.stockfish.Stockfish; public class Generator { private BitBoard WRooks; private BitBoard WBishops; private BitBoard WPawns; private BitBoard WKnights; private BitBoard WKing; private BitBoard WQueen; private BitBoard BRooks; private BitBoard BBishops; private BitBoard BPawns; private BitBoard BKnights; private BitBoard BKing; private BitBoard BQueen; private Stockfish stockfish; private double evalScore; private ArrayList<RowData> data; private ObjectOutputStream oos; private int turnChecker; // Left out purposefully // private double turn; public Generator() { stockfish = new Stockfish(); turnChecker = -1; data = new ArrayList<RowData>(); } private void initBoards() { WRooks = new BitBoard(); WBishops = new BitBoard(); WPawns = new BitBoard(); WKnights = new BitBoard(); WKing = new BitBoard(); WQueen = new BitBoard(); BRooks = new BitBoard(); BBishops = new BitBoard(); BPawns = new BitBoard(); BKnights = new BitBoard(); BKing = new BitBoard(); BQueen = new BitBoard(); } public void createBoards(String fen, boolean scorePresent) { initBoards(); int bitIndex = 0; char[] fenChars = fen.toCharArray(); for (int i = 0; i < fenChars.length && bitIndex < BitBoard.BOARD_LENGTH; i++) { switch (fenChars[i]) { case 'R': WRooks.flipBit(bitIndex++); break; case 'N': WKnights.flipBit(bitIndex++); break; case 'B': WBishops.flipBit(bitIndex++); break; case 'P': WPawns.flipBit(bitIndex++); break; case 'K': WKing.flipBit(bitIndex++); break; case 'Q': WQueen.flipBit(bitIndex++); break; case 'r': BRooks.flipBit(bitIndex++); break; case 'n': BKnights.flipBit(bitIndex++); break; case 'b': BBishops.flipBit(bitIndex++); break; case 'p': BPawns.flipBit(bitIndex++); break; case 'k': BKing.flipBit(bitIndex++); break; case 'q': BQueen.flipBit(bitIndex++); break; case '/': break; default: bitIndex += (int) fenChars[i] - 48; } } if (scorePresent) { evalScore = Integer.parseInt(fen.split("\\[")[1].split("]")[0]) / 100.0f; } else { evalScore = turnChecker * stockfish.getEvalScore(fen, 2000); } } public String prettyPrintBoards() { StringBuilder builder = new StringBuilder(); builder.append("White Rooks : "); builder.append(WRooks.getPrettyBitBoard() + "\n"); builder.append("White Knights : "); builder.append(WKnights.getPrettyBitBoard() + "\n"); builder.append("White Bishops : "); builder.append(WBishops.getPrettyBitBoard() + "\n"); builder.append("White Pawns : "); builder.append(WPawns.getPrettyBitBoard() + "\n"); builder.append("White King : "); builder.append(WKing.getPrettyBitBoard() + "\n"); builder.append("White Queen : "); builder.append(WQueen.getPrettyBitBoard() + "\n"); builder.append("Black Rooks : "); builder.append(BRooks.getPrettyBitBoard() + "\n"); builder.append("Black Knights : "); builder.append(BKnights.getPrettyBitBoard() + "\n"); builder.append("Black Bishops : "); builder.append(BBishops.getPrettyBitBoard() + "\n"); builder.append("Black Pawns : "); builder.append(BPawns.getPrettyBitBoard() + "\n"); builder.append("Black King : "); builder.append(BKing.getPrettyBitBoard() + "\n"); builder.append("Black Queen : "); builder.append(BQueen.getPrettyBitBoard() + "\n"); builder.append("Evaluation score : "); builder.append(evalScore + "\n"); return builder.toString(); } /** * scorePresent : Pass true if evaluation scores are present in the input * file. False otherwise. * linesToRead : Number of lines to read or -1 for * reading the whole file */ public void buildBoards(boolean scorePresent, int linesToRead) { try { BufferedReader br = new BufferedReader(new FileReader(new File( "./data/thinking.log"))); String fen; int linesRead = 0; if (linesRead == -1) linesToRead = Integer.MAX_VALUE; if (!scorePresent) stockfish.startEngine(); while ((fen = br.readLine()) != null && linesRead++ < linesToRead) { createBoards(fen, scorePresent); turnChecker *= -1; createRow(); } if (!scorePresent) stockfish.stopEngine(); br.close(); storeData(); } catch (Exception e) { e.printStackTrace(); } } private void storeData() { try { oos = new ObjectOutputStream(new FileOutputStream(new File( "./data/bitboards.bb"))); oos.writeObject(data); } catch (Exception e) { e.printStackTrace(); } } public void createRow() { StringBuilder builder = new StringBuilder(); builder.append(WRooks.getPrettyBitBoard()); builder.append(WKnights.getPrettyBitBoard()); builder.append(WBishops.getPrettyBitBoard()); builder.append(WPawns.getPrettyBitBoard()); builder.append(WKing.getPrettyBitBoard()); builder.append(WQueen.getPrettyBitBoard()); builder.append(BRooks.getPrettyBitBoard()); builder.append(BKnights.getPrettyBitBoard()); builder.append(BBishops.getPrettyBitBoard()); builder.append(BPawns.getPrettyBitBoard()); builder.append(BKing.getPrettyBitBoard()); builder.append(BQueen.getPrettyBitBoard()); data.add(new RowData(builder.toString(), evalScore)); } public static void main(String[] args) { Generator generator = new Generator(); generator.buildBoards(true, 10000); } }