package edu.berkeley.nlp.classify;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
//import com.sun.javadoc.SerialFieldTag;
import edu.berkeley.nlp.util.Counter;
public class FeatureManager implements Serializable {
/**
*
*/
private static final long serialVersionUID = 42;
private transient Map<Feature, Feature> featureInterner = new HashMap<Feature, Feature>();
private transient List<Feature> featureList = new ArrayList<Feature>();
private boolean locked = false;
public void lock() {
this.locked = true;
}
public Feature getFeatrue(String pred, String val) {
return getFeature(pred+"="+val);
}
public void addFeature(String pred, String val) {
assert !locked;
addFeature(String.format("%s=%s",pred, val));
}
public void addFeature(String val) {
assert !locked;
getFeature(val);
}
public Feature getFeature(int index) {
return featureList.get(index);
}
public Feature getFeature(String val) {
Feature feat = new Feature(val, -1);
Feature canonicalFeat = featureInterner.get(feat);
if (canonicalFeat == null) {
assert !locked : "Can't find feature " + val + " in locked FeatureManager";
feat = new Feature(feat.toString(), featureInterner.size());
featureInterner.put(feat, feat);
featureList.add(feat);
canonicalFeat = feat;
}
return canonicalFeat;
}
public int getNumFeatures() {
return featureInterner.size();
}
public boolean hasFeature(String val) {
Feature feat = new Feature(val, -1);
return featureInterner.containsKey(feat);
}
public boolean isLocked() {
return locked;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(featureList.size());
for (Feature feat: featureList) {
out.writeObject(feat.toString());
}
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException
{
in.defaultReadObject();
featureList = new ArrayList<Feature>();
featureInterner = new HashMap<Feature, Feature>();
boolean oldLocked = this.locked;
this.locked = false;
int numFeats = (Integer) in.readObject();
for (int i=0; i < numFeats; ++i) {
String f = (String) in.readObject();
addFeature(f);
}
this.locked = oldLocked;
}
}