// Path: src/main/java/com/asher_stern/crf/utilities/CrfException.java
// public class CrfException extends RuntimeException
// {
// 	private static final long serialVersionUID = 5414394233000815286L;
// 
// 	public CrfException()
// 	{
// 		super();
// 	}
// 
// 	public CrfException(String message, Throwable cause,
// 			boolean enableSuppression, boolean writableStackTrace)
// 	{
// 		super(message, cause, enableSuppression, writableStackTrace);
// 	}
// 
// 	public CrfException(String message, Throwable cause)
// 	{
// 		super(message, cause);
// 	}
// 
// 	public CrfException(String message)
// 	{
// 		super(message);
// 	}
// 
// 	public CrfException(Throwable cause)
// 	{
// 		super(cause);
// 	}
// 	
// 
// }
// 
// Path: src/main/java/com/asher_stern/crf/utilities/FileUtilities.java
// public class FileUtilities
// {
// 	/**
// 	 * Returns an array of File, sorted by their name (alphabetically).
// 	 * @param files
// 	 * @return
// 	 */
// 	public static File[] getSortedByName(File[] files)
// 	{
// 		ArrayList<File> list = new ArrayList<File>(files.length);
// 		for (File file : files) {list.add(file);}
// 		Collections.sort(list,new FilenameComparator());
// 		
// 		File[] ret = new File[list.size()];
// 		int index=0;
// 		for (File file : list)
// 		{
// 			ret[index] = file;
// 			++index;
// 		}
// 		return ret;
// 	}
// 	
// 	/**
// 	 * Reads all the contents of the given text file into a string, and returns that string.
// 	 * @param file
// 	 * @return
// 	 */
// 	public static String readTextFile(File file)
// 	{
// 		StringBuilder sb = new StringBuilder();
// 		try(BufferedReader reader = new BufferedReader(new FileReader(file)))
// 		{
// 			String line = reader.readLine();
// 			while (line != null)
// 			{
// 				sb.append(line).append("\n");
// 				line = reader.readLine();
// 			}
// 		}
// 		catch (IOException e)
// 		{
// 			throw new CrfException("IO problem.",e);
// 		}
// 		
// 		return sb.toString();
// 	}
// 
// 	/**
// 	 * A comparator of two files, where the comparison is by the lexicographic ordering of their names.
// 	 *
// 	 */
// 	private static class FilenameComparator implements Comparator<File>
// 	{
// 		@Override
// 		public int compare(File o1, File o2)
// 		{
// 			return o1.getName().compareTo(o2.getName());
// 		}
// 	}
// 	
// 	
// 	
// }
// 
// Path: src/main/java/com/asher_stern/crf/utilities/TaggedToken.java
// public class TaggedToken<K,G>
// {
// 	public TaggedToken(K token, G tag)
// 	{
// 		super();
// 		this.token = token;
// 		this.tag = tag;
// 	}
// 	
// 	
// 	
// 	public K getToken()
// 	{
// 		return token;
// 	}
// 	public G getTag()
// 	{
// 		return tag;
// 	}
// 
// 	
// 
// 
// 	@Override
// 	public String toString()
// 	{
// 		return "CrfTaggedToken [getToken()=" + getToken() + ", getTag()="
// 				+ getTag() + "]";
// 	}
// 	
// 	
// 
// 
// 
// 
// 	@Override
// 	public int hashCode()
// 	{
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((tag == null) ? 0 : tag.hashCode());
// 		result = prime * result + ((token == null) ? 0 : token.hashCode());
// 		return result;
// 	}
// 
// 
// 
// 	@Override
// 	public boolean equals(Object obj)
// 	{
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		TaggedToken<?,?> other = (TaggedToken<?,?>) obj;
// 		if (tag == null)
// 		{
// 			if (other.tag != null)
// 				return false;
// 		} else if (!tag.equals(other.tag))
// 			return false;
// 		if (token == null)
// 		{
// 			if (other.token != null)
// 				return false;
// 		} else if (!token.equals(other.token))
// 			return false;
// 		return true;
// 	}
// 
// 
// 
// 
// 
// 
// 	private final K token;
// 	private final G tag;
// }


import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import com.asher_stern.crf.utilities.CrfException;
import com.asher_stern.crf.utilities.FileUtilities;
import com.asher_stern.crf.utilities.TaggedToken;
package com.asher_stern.crf.postagging.data.penn;





/**
 * Iterator for the Penn Tree-Bank. See {@link PennCorpus}.
 * 
 * @author Asher Stern
 * Date: Nov 16, 2014
 *
 */
public class PennCorpusReader implements Iterator<List<TaggedToken<String, String>>>
{
	public static final String PENN_FILE_SUFFIX = ".mrg";

	public PennCorpusReader(File directory)
	{
		super();
		this.directory = directory;
		initialize();
	}

	@Override
	public boolean hasNext()
	{
		return (fileIterator.hasNext() || treeIterator.hasNext());
	}

	@Override
	public List<TaggedToken<String, String>> next()
	{
		while ((null==treeIterator) || (!treeIterator.hasNext()))
		{
			File file = fileIterator.next(); // might throw NoSuchElementException.
// Path: src/main/java/com/asher_stern/crf/utilities/CrfException.java
// public class CrfException extends RuntimeException
// {
// 	private static final long serialVersionUID = 5414394233000815286L;
// 
// 	public CrfException()
// 	{
// 		super();
// 	}
// 
// 	public CrfException(String message, Throwable cause,
// 			boolean enableSuppression, boolean writableStackTrace)
// 	{
// 		super(message, cause, enableSuppression, writableStackTrace);
// 	}
// 
// 	public CrfException(String message, Throwable cause)
// 	{
// 		super(message, cause);
// 	}
// 
// 	public CrfException(String message)
// 	{
// 		super(message);
// 	}
// 
// 	public CrfException(Throwable cause)
// 	{
// 		super(cause);
// 	}
// 	
// 
// }
// 
// Path: src/main/java/com/asher_stern/crf/utilities/FileUtilities.java
// public class FileUtilities
// {
// 	/**
// 	 * Returns an array of File, sorted by their name (alphabetically).
// 	 * @param files
// 	 * @return
// 	 */
// 	public static File[] getSortedByName(File[] files)
// 	{
// 		ArrayList<File> list = new ArrayList<File>(files.length);
// 		for (File file : files) {list.add(file);}
// 		Collections.sort(list,new FilenameComparator());
// 		
// 		File[] ret = new File[list.size()];
// 		int index=0;
// 		for (File file : list)
// 		{
// 			ret[index] = file;
// 			++index;
// 		}
// 		return ret;
// 	}
// 	
// 	/**
// 	 * Reads all the contents of the given text file into a string, and returns that string.
// 	 * @param file
// 	 * @return
// 	 */
// 	public static String readTextFile(File file)
// 	{
// 		StringBuilder sb = new StringBuilder();
// 		try(BufferedReader reader = new BufferedReader(new FileReader(file)))
// 		{
// 			String line = reader.readLine();
// 			while (line != null)
// 			{
// 				sb.append(line).append("\n");
// 				line = reader.readLine();
// 			}
// 		}
// 		catch (IOException e)
// 		{
// 			throw new CrfException("IO problem.",e);
// 		}
// 		
// 		return sb.toString();
// 	}
// 
// 	/**
// 	 * A comparator of two files, where the comparison is by the lexicographic ordering of their names.
// 	 *
// 	 */
// 	private static class FilenameComparator implements Comparator<File>
// 	{
// 		@Override
// 		public int compare(File o1, File o2)
// 		{
// 			return o1.getName().compareTo(o2.getName());
// 		}
// 	}
// 	
// 	
// 	
// }
// 
// Path: src/main/java/com/asher_stern/crf/utilities/TaggedToken.java
// public class TaggedToken<K,G>
// {
// 	public TaggedToken(K token, G tag)
// 	{
// 		super();
// 		this.token = token;
// 		this.tag = tag;
// 	}
// 	
// 	
// 	
// 	public K getToken()
// 	{
// 		return token;
// 	}
// 	public G getTag()
// 	{
// 		return tag;
// 	}
// 
// 	
// 
// 
// 	@Override
// 	public String toString()
// 	{
// 		return "CrfTaggedToken [getToken()=" + getToken() + ", getTag()="
// 				+ getTag() + "]";
// 	}
// 	
// 	
// 
// 
// 
// 
// 	@Override
// 	public int hashCode()
// 	{
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((tag == null) ? 0 : tag.hashCode());
// 		result = prime * result + ((token == null) ? 0 : token.hashCode());
// 		return result;
// 	}
// 
// 
// 
// 	@Override
// 	public boolean equals(Object obj)
// 	{
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		TaggedToken<?,?> other = (TaggedToken<?,?>) obj;
// 		if (tag == null)
// 		{
// 			if (other.tag != null)
// 				return false;
// 		} else if (!tag.equals(other.tag))
// 			return false;
// 		if (token == null)
// 		{
// 			if (other.token != null)
// 				return false;
// 		} else if (!token.equals(other.token))
// 			return false;
// 		return true;
// 	}
// 
// 
// 
// 
// 
// 
// 	private final K token;
// 	private final G tag;
// }


// Path: src/main/java/com/asher_stern/crf/postagging/data/penn/PennCorpusReader.java
import java.io.File;
import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import com.asher_stern.crf.utilities.CrfException;
import com.asher_stern.crf.utilities.FileUtilities;
import com.asher_stern.crf.utilities.TaggedToken;

package com.asher_stern.crf.postagging.data.penn;





/**
 * Iterator for the Penn Tree-Bank. See {@link PennCorpus}.
 * 
 * @author Asher Stern
 * Date: Nov 16, 2014
 *
 */
public class PennCorpusReader implements Iterator<List<TaggedToken<String, String>>>
{
	public static final String PENN_FILE_SUFFIX = ".mrg";

	public PennCorpusReader(File directory)
	{
		super();
		this.directory = directory;
		initialize();
	}

	@Override
	public boolean hasNext()
	{
		return (fileIterator.hasNext() || treeIterator.hasNext());
	}

	@Override
	public List<TaggedToken<String, String>> next()
	{
		while ((null==treeIterator) || (!treeIterator.hasNext()))
		{
			File file = fileIterator.next(); // might throw NoSuchElementException.
			String fileContents = FileUtilities.readTextFile(file);