// Path: src/main/java/com/asher_stern/crf/crf/run/CrfInferencePerformer.java
// public class CrfInferencePerformer<K, G>
// {
// 	public CrfInferencePerformer(CrfModel<K, G> model)
// 	{
// 		super();
// 		this.model = model;
// 	}
// 
// 	/**
// 	 * Finds the most likely sequence of tags for the given sequence of tokens
// 	 * @param sequence A sequence of tokens
// 	 * @return A list in which each element is a {@link TaggedToken}, which encapsulates a token and its tag.
// 	 */
// 	public List<TaggedToken<K,G>> tagSequence(List<K> sequence)
// 	{
// 		if (null==sequence) {return null;}
// 		if (sequence.size()==0) {return Collections.<TaggedToken<K,G>>emptyList();}
// 		
// 		@SuppressWarnings("unchecked")
// 		K[] sentenceAsArray = sequence.toArray( (K[]) Array.newInstance(sequence.get(0).getClass(), sequence.size()) );
// 		CrfInferenceViterbi<K, G> crfInference = new CrfInferenceViterbi<K, G>(model, sentenceAsArray);
// 		G[] bestTags = crfInference.inferBestTagSequence();
// 
// 		if (sentenceAsArray.length!=bestTags.length) {throw new CrfException("Inference failed. Array of tags differs in length from array of tokens.");}
// 		
// 		List<TaggedToken<K,G>> ret = new ArrayList<TaggedToken<K,G>>();
// 		for (int index=0;index<sentenceAsArray.length;++index)
// 		{
// 			ret.add(new TaggedToken<K,G>(sentenceAsArray[index], bestTags[index]));
// 		}
// 		return ret;
// 
// 	}
// 
// 	private final CrfModel<K, G> model;
// }
// 
// Path: src/main/java/com/asher_stern/crf/postagging/postaggers/PosTagger.java
// public interface PosTagger
// {
// 	/**
// 	 * Assigns tags for each token in the given sentence.
// 	 * @param sentence An input sentence, given as a list of tokens.
// 	 * @return The tagged sentence.
// 	 */
// 	public List<TaggedToken<String,String>> tagSentence(List<String> sentence);
// }
// 
// 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.util.List;
import com.asher_stern.crf.crf.run.CrfInferencePerformer;
import com.asher_stern.crf.postagging.postaggers.PosTagger;
import com.asher_stern.crf.utilities.TaggedToken;
package com.asher_stern.crf.postagging.postaggers.crf;



/**
 * A part-of-speech tagger which assigns the tags using CRF inference. CRF is an acronym of Conditional Random Fields.
 * 
 * @author Asher Stern
 * Date: Nov 10, 2014
 *
 */
public class CrfPosTagger implements PosTagger
{
	public CrfPosTagger(CrfInferencePerformer<String, String> inferencePerformer)
	{
		this.inferencePerformer = inferencePerformer;
	}

	@Override
// Path: src/main/java/com/asher_stern/crf/crf/run/CrfInferencePerformer.java
// public class CrfInferencePerformer<K, G>
// {
// 	public CrfInferencePerformer(CrfModel<K, G> model)
// 	{
// 		super();
// 		this.model = model;
// 	}
// 
// 	/**
// 	 * Finds the most likely sequence of tags for the given sequence of tokens
// 	 * @param sequence A sequence of tokens
// 	 * @return A list in which each element is a {@link TaggedToken}, which encapsulates a token and its tag.
// 	 */
// 	public List<TaggedToken<K,G>> tagSequence(List<K> sequence)
// 	{
// 		if (null==sequence) {return null;}
// 		if (sequence.size()==0) {return Collections.<TaggedToken<K,G>>emptyList();}
// 		
// 		@SuppressWarnings("unchecked")
// 		K[] sentenceAsArray = sequence.toArray( (K[]) Array.newInstance(sequence.get(0).getClass(), sequence.size()) );
// 		CrfInferenceViterbi<K, G> crfInference = new CrfInferenceViterbi<K, G>(model, sentenceAsArray);
// 		G[] bestTags = crfInference.inferBestTagSequence();
// 
// 		if (sentenceAsArray.length!=bestTags.length) {throw new CrfException("Inference failed. Array of tags differs in length from array of tokens.");}
// 		
// 		List<TaggedToken<K,G>> ret = new ArrayList<TaggedToken<K,G>>();
// 		for (int index=0;index<sentenceAsArray.length;++index)
// 		{
// 			ret.add(new TaggedToken<K,G>(sentenceAsArray[index], bestTags[index]));
// 		}
// 		return ret;
// 
// 	}
// 
// 	private final CrfModel<K, G> model;
// }
// 
// Path: src/main/java/com/asher_stern/crf/postagging/postaggers/PosTagger.java
// public interface PosTagger
// {
// 	/**
// 	 * Assigns tags for each token in the given sentence.
// 	 * @param sentence An input sentence, given as a list of tokens.
// 	 * @return The tagged sentence.
// 	 */
// 	public List<TaggedToken<String,String>> tagSentence(List<String> sentence);
// }
// 
// 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/postaggers/crf/CrfPosTagger.java
import java.util.List;
import com.asher_stern.crf.crf.run.CrfInferencePerformer;
import com.asher_stern.crf.postagging.postaggers.PosTagger;
import com.asher_stern.crf.utilities.TaggedToken;

package com.asher_stern.crf.postagging.postaggers.crf;



/**
 * A part-of-speech tagger which assigns the tags using CRF inference. CRF is an acronym of Conditional Random Fields.
 * 
 * @author Asher Stern
 * Date: Nov 10, 2014
 *
 */
public class CrfPosTagger implements PosTagger
{
	public CrfPosTagger(CrfInferencePerformer<String, String> inferencePerformer)
	{
		this.inferencePerformer = inferencePerformer;
	}

	@Override
	public List<TaggedToken<String,String>> tagSentence(List<String> sentence)