public override string ToString()
            {
                if ( image == null )
                {
                    return UNINITIALIZED;
                }
                StringWriter sw = new StringWriter();
                TabularOutput t = new TabularOutput( sw );
                t.flushEvery( Int32.MaxValue );
                t.addColumn( "#" );
                t.addColumn( "image" ).alignLeft();
                t.addColumn( "type" );
                t.addColumn( "tf" );
                t.addColumn( "tfByDocument" ).alignLeft();
                t.addColumn( "fieldIndices" );

                if ( stemIndex != null )
                {
                    t.addColumn( "stemIndex" );
                    t.addColumn( "=>stem" ).alignLeft();
                }

                for ( int i = 0; i < image.Length; i++, t.nextRow() )
                {
                    t.rowData(
                        i,
                        image[i] == null ? "<null>" : new String( image[i] ),
                        type[i],
                        tf[i],
                        SparseArray.sparseToString( tfByDocument[i] ) );

                    t.rowData( Arrays.toString( toFieldIndexes( fieldIndices[i] ) ).replace( " ", "" ) );

                    if ( stemIndex != null )
                    {
                        t.rowData( stemIndex[i] );
                        t.rowData( new String( allStems.image[stemIndex[i]] ) );
                    }
                }

                t.flush();
                sw.Write( "\n" );
                return sw.ToString();
            }
            public override string ToString()
            {
                if ( wordIndices == null )
                {
                    return UNINITIALIZED;
                }

                StringWriter sw = new StringWriter();
                TabularOutput t = new TabularOutput( sw );
                t.flushEvery( Int32.MaxValue );
                t.addColumn( "#" );
                t.addColumn( "wordIndices" );
                t.addColumn( "=>words" ).alignLeft();
                t.addColumn( "tf" );
                t.addColumn( "tfByDocument" ).alignLeft();

                for ( int i = 0; i < wordIndices.Length; i++, t.nextRow() )
                {
                    t.rowData(
                        i,
                        Arrays.toString( wordIndices[i] ).replace( " ", "" ),
                        getPhrase( i ),
                        tf[i],
                        SparseArray.sparseToString( tfByDocument[i] ) );
                }

                t.flush();
                sw.Write( "\n" );
                return sw.ToString();
            }
            public override string ToString()
            {
                if ( image == null )
                {
                    return UNINITIALIZED;
                }
                StringWriter sw = new StringWriter();
                TabularOutput t = new TabularOutput( sw );
                t.flushEvery( Int32.MaxValue );
                t.addColumn( "#" );
                t.addColumn( "token" ).alignLeft();
                t.addColumn( "type" );
                t.addColumn( "fieldIndex" );
                t.addColumn( "=>field" ).alignLeft();
                t.addColumn( "docIdx" );
                t.addColumn( "wordIdx" );
                t.addColumn( "=>word" ).alignLeft();
                for ( int i = 0; i < image.Length; i++, t.nextRow() )
                {
                    t.rowData(
                        i,
                        image[i] == null ? "<null>" : new String( image[i] ),
                        type[i],
                        fieldIndex[i],
                        fieldIndex[i] >= 0 ? allFields.name[fieldIndex[i]] : null,
                        documentIndex[i],
                        wordIndex[i],
                        wordIndex[i] >= 0 ? new String( allWords.image[wordIndex[i]] ) : null );
                }
                if ( suffixOrder != null )
                {
                    t = new TabularOutput( sw );
                    t.addColumn( "#" );
                    t.addColumn( "sa" );
                    t.addColumn( "lcp" );
                    t.addColumn( "=>words" ).alignLeft();

                    sw.Write( "\n" );
                    StringBuilder suffixImage = new StringBuilder();
                    for ( int i = 0; i < suffixOrder.Length; i++, t.nextRow() )
                    {
                        t.rowData(
                            i,
                            suffixOrder[i],
                            lcp[i] );

                        int windowLength = 5;
                        for ( int j = suffixOrder[i], max = Math.Min( suffixOrder[i] + windowLength, wordIndex.Length ); j < max; )
                        {
                            suffixImage.Append(
                                wordIndex[j] >= 0 ? new String( allWords.image[wordIndex[j]] ) : "|" ).Append( " " );
                            if ( ++j == max && j != wordIndex.Length )
                                suffixImage.Append( " [...]" );
                        }
                        t.rowData( suffixImage.ToString() );
                        suffixImage.Clear();
                    }
                    sw.Write( "\n" );
                }

                t.flush();
                sw.Write( "\n" );
                return sw.ToString();
            }
            public override string ToString()
            {
                if ( featureIndex == null )
                    return UNINITIALIZED;

                StringWriter sw = new StringWriter();
                TabularOutput t = new TabularOutput( sw );
                t.flushEvery( Int32.MaxValue );
                t.addColumn( "#" );
                t.addColumn( "featureIdx" );
                t.addColumn( "=>feature" ).alignLeft();
                t.addColumn( "documentIdx" ).alignLeft();

                for ( int i = 0; i < featureIndex.Length; i++, t.nextRow() )
                {
                    t.rowData(
                        i,
                        featureIndex[i],
                        getLabel( i ),
                        documentIndices != null ? documentIndices[i].toString().replace( " ", "" ) : "" );
                }

                t.flush();
                sw.Write( "\n" );
                return t.toString();
            }