/// <summary> /// Constructor from a set of EncodedPositionBoards. /// </summary> /// <param name="boardHistory"></param> /// <param name="miscInfo"></param> private EncodedPositionWithHistory(EncodedPositionBoards boardHistory, EncodedTrainingPositionMiscInfo miscInfo) { BoardsHistory = boardHistory; MiscInfo = miscInfo; // if (Marshal.SizeOf<LZBoard>() != LZBoardSizeInBytes) throw new Exception("Internal error, incorrect board size"); }
/// <summary> /// Returns the FEN string correpsonding to the position at specified history board. /// </summary> /// <param name="historyIndex"></param> /// <returns></returns> public string FENForHistoryBoard(int historyIndex) { EncodedPositionBoard planes = GetPlanesForHistoryBoard(historyIndex); // KQkq - 0 1 bool weAreWhite = MiscInfo.InfoPosition.SideToMove == 0; string fen = MiscInfo.InfoPosition.SideToMove == 0 ? planes.GetFEN(weAreWhite) : planes.Reversed.GetFEN(weAreWhite); if (historyIndex != 0) { return(fen); } fen = fen + (weAreWhite ? " w" : " b"); fen = fen + " "; string castling = ""; if ((weAreWhite ? MiscInfo.InfoPosition.Castling_US_OO : MiscInfo.InfoPosition.Castling_Them_OO) > 0) { castling += "K"; } if ((weAreWhite ? MiscInfo.InfoPosition.Castling_US_OOO : MiscInfo.InfoPosition.Castling_Them_OOO) > 0) { castling += "Q"; } if ((weAreWhite ? MiscInfo.InfoPosition.Castling_Them_OO : MiscInfo.InfoPosition.Castling_US_OO) > 0) { castling += "k"; } if ((weAreWhite ? MiscInfo.InfoPosition.Castling_Them_OOO : MiscInfo.InfoPosition.Castling_US_OOO) > 0) { castling += "q"; } if (castling == "") { castling = "-"; } PositionMiscInfo.EnPassantFileIndexEnum enPassant = PositionMiscInfo.EnPassantFileIndexEnum.FileNone; if (historyIndex < 7) { EncodedPositionBoard planesPriorBoard = GetPlanesForHistoryBoard(historyIndex + 1); enPassant = EncodedPositionBoards.EnPassantOpportunityBetweenBoards(planes, planesPriorBoard); } string epTarget = "-"; if (enPassant != PositionMiscInfo.EnPassantFileIndexEnum.FileNone) { epTarget = PositionMiscInfo.EPFileChars[(int)enPassant] + (weAreWhite ? "6" : "3"); } fen = fen + castling + " " + epTarget + " " + MiscInfo.InfoPosition.Rule50Count + " " + (1 + MiscInfo.InfoPosition.MoveCount); // Sometimes 2 dashes? return(fen); }