public String toString() {
    StringBuffer	result;
    int			i;
    int			n;
    boolean		found;
    
    result = new StringBuffer();
    
    // title
    result.append(this.getClass().getName().replaceAll(".*\\.", "") + "\n");
    result.append(this.getClass().getName().replaceAll(".*\\.", "").replaceAll(".", "=") + "\n");
    
    // model
    if (m_ActualClusterer != null) {
      // output clusterer
      result.append(m_ActualClusterer + "\n");
      
      // clusters to classes
      result.append("Clusters to classes mapping:\n");
      for (i = 0; i < m_ClustersToClasses.length - 1; i++) {
	result.append("  " + (i+1) + ". Cluster: ");
	if (m_ClustersToClasses[i] < 0)
	  result.append("no class");
	else
	  result.append(
	      m_OriginalHeader.classAttribute().value((int) m_ClustersToClasses[i])
	      + " (" + ((int) m_ClustersToClasses[i] + 1) + ")");
	result.append("\n");
      }
      result.append("\n");
      
      // classes to clusters
      result.append("Classes to clusters mapping:\n");
      for (i = 0; i < m_OriginalHeader.numClasses(); i++) {
	result.append(
	    "  " + (i+1) + ". Class (" 
	    + m_OriginalHeader.classAttribute().value(i) + "): ");
	
	found = false;
	for (n = 0; n < m_ClustersToClasses.length - 1; n++) {
	  if (((int) m_ClustersToClasses[n]) == i) {
	    found = true;
	    result.append((n+1) + ". Cluster");
	    break;
	  }
	}
	
	if (!found)
	  result.append("no cluster");

	result.append("\n");
      }
      
      result.append("\n");
    }
    else {
      result.append("no model built yet\n");
    }
    
    return result.toString();
  }