/// <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);
        }