001 package calhoun.analysis.crf;
002
003 import java.util.List;
004
005 import org.apache.commons.lang.StringUtils;
006
007 import calhoun.util.Assert;
008
009 /** a feature manager that combines it's composite feature types together into a single feature. */
010 public class ConstrainedFeatureManager extends CompositeFeatureManager {
011 private static final long serialVersionUID = 5061912595256694050L;
012
013 /** Composite feature managers only return 1 feature. */
014 @Override
015 public int getNumFeatures() {
016 return 1;
017 }
018
019 /** Return a concatenated name */
020 @Override
021 public String getFeatureName(int featureIndex) {
022 String[] names = new String[allFeatureTypes.size()];
023 for(int i=0; i<names.length; ++i) {
024 names[i] = allFeatureTypes.get(i).getFeatureName(featureIndex);
025 }
026 return "Composite: "+StringUtils.join(names, ",");
027 }
028
029 @Override
030 public void train(int startingIndex, ModelManager modelInfo, List data) {
031 Assert.a(allFeatureTypes.size() > 0, "No features types have been assigned.");
032 Assert.a(startIndexes == null, "FeatureManager has already been trained.");
033 startIx = startingIndex;
034
035 // Train each of the individual FeatureManagers and calculate offsets
036 for(int i = 0; i<allFeatureTypes.size(); ++i) {
037 FeatureManager fm = allFeatureTypes.get(i);
038 List compData = fm.getInputComponent() == null ? data : new ComponentList(data, fm.getInputComponent());
039 fm.train(startIx, modelInfo, compData);
040 Assert.a(fm.getNumFeatures()==1, "Constrained FeatureManagers must all have 1 feature. ",fm, " had ", fm.getNumFeatures());
041 }
042 }
043 }