/// <inheritdoc/> public int Write(ObservationWriter writer) { m_Board.CheckBoardSizes(m_MaxBoardSize); var currentBoardSize = m_Board.GetCurrentBoardSize(); int offset = 0; var isVisual = m_ObservationType != Match3ObservationType.Vector; // This is equivalent to // for (var r = 0; r < m_MaxBoardSize.Rows; r++) // for (var c = 0; c < m_MaxBoardSize.Columns; c++) // if (r < currentBoardSize.Rows && c < currentBoardSize.Columns) // WriteOneHot // else // WriteZero // but rearranged to avoid the branching. for (var r = 0; r < currentBoardSize.Rows; r++) { for (var c = 0; c < currentBoardSize.Columns; c++) { var val = m_GridValues(r, c); writer.WriteOneHot(offset, r, c, val, m_OneHotSize, isVisual); offset += m_OneHotSize; } for (var c = currentBoardSize.Columns; c < m_MaxBoardSize.Columns; c++) { writer.WriteZero(offset, r, c, m_OneHotSize, isVisual); offset += m_OneHotSize; } } for (var r = currentBoardSize.Rows; r < m_MaxBoardSize.Columns; r++) { for (var c = 0; c < m_MaxBoardSize.Columns; c++) { writer.WriteZero(offset, r, c, m_OneHotSize, isVisual); offset += m_OneHotSize; } } return(offset); }