package ecologylab.bigsemantics.model.text; import java.util.Hashtable; import java.util.Observable; import java.util.Observer; import ecologylab.collections.WeightingStrategy; public class TermVectorWeightStrategy<E extends TermVectorFeature> extends WeightingStrategy<E> implements Observer { private Hashtable<ITermVector, Double> cachedWeights = new Hashtable<ITermVector, Double>(); private ITermVector referenceVector; public TermVectorWeightStrategy ( ITermVector v ) { referenceVector = v; v.addObserver(this); } public double getWeight ( ITermVector termVector ) { double weight = -1; if (termVector != null) { Hashtable<ITermVector, Double> cachedWeights = this.cachedWeights; synchronized (cachedWeights) { if (cachedWeights.containsKey(termVector)) weight = cachedWeights.get(termVector).floatValue(); else { weight = termVector.idfDot(referenceVector); cachedWeights.put(termVector, weight); } } } return weight; } public double getWeight ( E e ) { return getWeight(e.termVector()); } public void insert ( E e ) { if (e != null) { ITermVector termVector = e.termVector(); if (termVector != null) termVector.addObserver(this); } super.insert(e); } public void remove ( E e ) { if (e.termVector() != null) e.termVector().deleteObserver(this); super.remove(e); } public void update ( Observable o, Object arg ) { Hashtable<ITermVector, Double> cachedWeights = this.cachedWeights; synchronized (cachedWeights) { if (o == referenceVector) cachedWeights.clear(); else cachedWeights.remove(o); } setChanged(); } public ITermVector referenceVector() { return referenceVector; } }