package edu.berkeley.nlp.classify;
import edu.berkeley.nlp.util.Counter;
import edu.berkeley.nlp.util.Indexer;
/**
* When you have features that are annotated with labels, use this as a feature manager.
* @author aria42
*
*/
public class LabelFeatureWeightsManager<L> {
private FeatureManager featManager;
private Indexer<L> labels;
public LabelFeatureWeightsManager(FeatureManager featManager, Indexer<L> labels) {
this.featManager = featManager;
this.labels = labels;
if (!featManager.isLocked()) {
throw new IllegalArgumentException("Feature manager must be locked");
}
}
public int getFeatureLabelWeightIndex(int featureIndex, int labelIndex) {
assert labelIndex < labels.size() && labelIndex >= 0;
assert featureIndex < featManager.getNumFeatures() && featureIndex >= 0;
return featureIndex + featManager.getNumFeatures() * labelIndex;
}
public int getWeightIndex(Feature feat, L label) {
return getFeatureLabelWeightIndex(feat.getIndex(),labels.indexOf(label));
}
public int getWeightIndex(String feat, L label) {
int featIndex = featManager.getFeature(feat).getIndex();
int labelIndex = labels.indexOf(label);
return getFeatureLabelWeightIndex(featIndex, labelIndex);
}
public int getNumWeights() {
return featManager.getNumFeatures() * labels.size();
}
public Feature getBaseFeature(int weightIndex) {
return featManager.getFeature(weightIndex % featManager.getNumFeatures());
}
public L getLabel(int weightIndex) {
return labels.getObject(weightIndex / featManager.getNumFeatures());
}
public Counter<String> getWeightsCounter(double[] weights) {
Counter<String> counts = new Counter<String>();
for (L label: labels) {
for (int i=0; i < featManager.getNumFeatures(); ++i) {
Feature feat = featManager.getFeature(i);
int index = getWeightIndex(feat, label);
String labelFeat = String.format("%s && %s",label,feat);
counts.setCount(labelFeat, weights[index]);
}
}
return counts;
}
}