// Path: src/main/java/com/asher_stern/crf/crf/filters/CrfFilteredFeature.java
// public class CrfFilteredFeature<K, G> implements Serializable
// {
// 	private static final long serialVersionUID = -5835863638916635217L;
// 	
// 	public CrfFilteredFeature(CrfFeature<K, G> feature, Filter<K, G> filter, boolean whenNotFilteredIsAlwaysOne)
// 	{
// 		super();
// 		this.feature = feature;
// 		this.filter = filter;
// 		this.whenNotFilteredIsAlwaysOne = whenNotFilteredIsAlwaysOne;
// 	}
// 	
// 	public CrfFeature<K, G> getFeature()
// 	{
// 		return feature;
// 	}
// 
// 	public Filter<K, G> getFilter()
// 	{
// 		return filter;
// 	}
// 
// 	/**
// 	 * Returns true if it is <B>guaranteed</B> that the feature returns 1.0 for any input for which its filter
// 	 * is equal to the filter returned by {@link #getFilter()}.
// 	 * @return
// 	 */
// 	public boolean isWhenNotFilteredIsAlwaysOne()
// 	{
// 		return whenNotFilteredIsAlwaysOne;
// 	}
// 
// 
// 
// 
// 
// 	@Override
// 	public int hashCode()
// 	{
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((feature == null) ? 0 : feature.hashCode());
// 		result = prime * result + ((filter == null) ? 0 : filter.hashCode());
// 		result = prime * result + (whenNotFilteredIsAlwaysOne ? 1231 : 1237);
// 		return result;
// 	}
// 	
// 	@Override
// 	public boolean equals(Object obj)
// 	{
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		CrfFilteredFeature<?,?> other = (CrfFilteredFeature<?,?>) obj;
// 		if (feature == null)
// 		{
// 			if (other.feature != null)
// 				return false;
// 		} else if (!feature.equals(other.feature))
// 			return false;
// 		if (filter == null)
// 		{
// 			if (other.filter != null)
// 				return false;
// 		} else if (!filter.equals(other.filter))
// 			return false;
// 		if (whenNotFilteredIsAlwaysOne != other.whenNotFilteredIsAlwaysOne)
// 			return false;
// 		return true;
// 	}
// 
// 
// 
// 	protected final CrfFeature<K, G> feature;
// 	protected final Filter<K, G> filter;
// 	protected final boolean whenNotFilteredIsAlwaysOne;
// }
// 
// Path: src/main/java/com/asher_stern/crf/postagging/postaggers/crf/CrfPosTagger.java
// public class CrfPosTagger implements PosTagger
// {
// 	public CrfPosTagger(CrfInferencePerformer<String, String> inferencePerformer)
// 	{
// 		this.inferencePerformer = inferencePerformer;
// 	}
// 
// 	@Override
// 	public List<TaggedToken<String,String>> tagSentence(List<String> sentence)
// 	{
// 		return inferencePerformer.tagSequence(sentence);
// 	}
// 	
// 	
// 	private final CrfInferencePerformer<String, String> inferencePerformer;
// 
// }
// 
// 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 java.util.Set;
import com.asher_stern.crf.crf.filters.CrfFilteredFeature;
import com.asher_stern.crf.postagging.postaggers.crf.CrfPosTagger;
import com.asher_stern.crf.utilities.TaggedToken;
package com.asher_stern.crf.crf.run;




/**
 * Generates set of features to be used by the CRF algorithm for training and inference of {@link CrfPosTagger}.
 * 
 * @author Asher Stern
 * Date: Nov 10, 2014
 *
 */
public abstract class CrfFeatureGenerator<K,G>
{
// Path: src/main/java/com/asher_stern/crf/crf/filters/CrfFilteredFeature.java
// public class CrfFilteredFeature<K, G> implements Serializable
// {
// 	private static final long serialVersionUID = -5835863638916635217L;
// 	
// 	public CrfFilteredFeature(CrfFeature<K, G> feature, Filter<K, G> filter, boolean whenNotFilteredIsAlwaysOne)
// 	{
// 		super();
// 		this.feature = feature;
// 		this.filter = filter;
// 		this.whenNotFilteredIsAlwaysOne = whenNotFilteredIsAlwaysOne;
// 	}
// 	
// 	public CrfFeature<K, G> getFeature()
// 	{
// 		return feature;
// 	}
// 
// 	public Filter<K, G> getFilter()
// 	{
// 		return filter;
// 	}
// 
// 	/**
// 	 * Returns true if it is <B>guaranteed</B> that the feature returns 1.0 for any input for which its filter
// 	 * is equal to the filter returned by {@link #getFilter()}.
// 	 * @return
// 	 */
// 	public boolean isWhenNotFilteredIsAlwaysOne()
// 	{
// 		return whenNotFilteredIsAlwaysOne;
// 	}
// 
// 
// 
// 
// 
// 	@Override
// 	public int hashCode()
// 	{
// 		final int prime = 31;
// 		int result = 1;
// 		result = prime * result + ((feature == null) ? 0 : feature.hashCode());
// 		result = prime * result + ((filter == null) ? 0 : filter.hashCode());
// 		result = prime * result + (whenNotFilteredIsAlwaysOne ? 1231 : 1237);
// 		return result;
// 	}
// 	
// 	@Override
// 	public boolean equals(Object obj)
// 	{
// 		if (this == obj)
// 			return true;
// 		if (obj == null)
// 			return false;
// 		if (getClass() != obj.getClass())
// 			return false;
// 		CrfFilteredFeature<?,?> other = (CrfFilteredFeature<?,?>) obj;
// 		if (feature == null)
// 		{
// 			if (other.feature != null)
// 				return false;
// 		} else if (!feature.equals(other.feature))
// 			return false;
// 		if (filter == null)
// 		{
// 			if (other.filter != null)
// 				return false;
// 		} else if (!filter.equals(other.filter))
// 			return false;
// 		if (whenNotFilteredIsAlwaysOne != other.whenNotFilteredIsAlwaysOne)
// 			return false;
// 		return true;
// 	}
// 
// 
// 
// 	protected final CrfFeature<K, G> feature;
// 	protected final Filter<K, G> filter;
// 	protected final boolean whenNotFilteredIsAlwaysOne;
// }
// 
// Path: src/main/java/com/asher_stern/crf/postagging/postaggers/crf/CrfPosTagger.java
// public class CrfPosTagger implements PosTagger
// {
// 	public CrfPosTagger(CrfInferencePerformer<String, String> inferencePerformer)
// 	{
// 		this.inferencePerformer = inferencePerformer;
// 	}
// 
// 	@Override
// 	public List<TaggedToken<String,String>> tagSentence(List<String> sentence)
// 	{
// 		return inferencePerformer.tagSequence(sentence);
// 	}
// 	
// 	
// 	private final CrfInferencePerformer<String, String> inferencePerformer;
// 
// }
// 
// 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/crf/run/CrfFeatureGenerator.java
import java.util.List;
import java.util.Set;
import com.asher_stern.crf.crf.filters.CrfFilteredFeature;
import com.asher_stern.crf.postagging.postaggers.crf.CrfPosTagger;
import com.asher_stern.crf.utilities.TaggedToken;

package com.asher_stern.crf.crf.run;




/**
 * Generates set of features to be used by the CRF algorithm for training and inference of {@link CrfPosTagger}.
 * 
 * @author Asher Stern
 * Date: Nov 10, 2014
 *
 */
public abstract class CrfFeatureGenerator<K,G>
{
	public CrfFeatureGenerator(Iterable<? extends List<? extends TaggedToken<K, G> >> corpus, Set<G> tags)