package experimental.ising; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import org.javatuples.Pair; public class UnaryFactor extends Factor { // variable id private int i; private int size; protected double[] potential; protected double[] factorBelief; private UnaryFeatureExtractor ufe; private List<Integer> featuresPositive; private List<Integer> featuresNegative; private String word; private String tag; public UnaryFactor(String word, String tag, int size, int i, UnaryFeatureExtractor ufe) { this.word = word; this.tag = tag; this.setSize(size); this.setPotential(new double[this.size]); this.setFeaturesPositive(new LinkedList<Integer>()); this.setFeaturesNegative(new LinkedList<Integer>()); for (int n = 0; n < this.size; ++n) { this.potential[n] = 1.0; } this.setI(i); this.setNeighbors(new ArrayList<Variable>()); this.setMessageIds(new ArrayList<Integer>()); this.setMessages(new ArrayList<Message>()); this.ufe = ufe; Pair<List<Integer>, List<Integer>> p = this.ufe.getFeatures(i, word); this.featuresPositive = p.getValue0(); this.featuresNegative = p.getValue1(); } @Override public void computeFactorBelief() { } @Override public void passMessage() { for (int i = 0; i < this.size; ++i) { this.messages.get(0).measure[i] = this.potential[i]; } // renormalize (optional) this.messages.get(0).renormalize(); //System.out.println(Arrays.toString(this.messages.get(0).measure)); } public void updatePotential(double[] parameters) { this.potential[0] = 0.0; for (Integer feat : this.featuresNegative) { this.potential[0] += parameters[feat]; } this.potential[1] = 0.0; for (Integer feat : this.featuresPositive) { this.potential[1] += parameters[feat]; } this.potential[0] = Math.exp(this.potential[0]); this.potential[1] = Math.exp(this.potential[1]); } @Override public void renormalize() { double Z = 0.0; for (int i = 0; i < this.size; ++i) { Z += this.potential[i]; } for (int i = 0; i < this.size; ++i) { this.potential[i] /= Z; } } public int getI() { return i; } public void setI(int i) { this.i = i; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public double[] getPotential() { return potential; } public void setPotential(double[] potential) { this.potential = potential; } public void setPotential(int n, double value) { this.potential[n] = value; } public List<Integer> getFeaturesNegative() { return featuresNegative; } public void setFeaturesNegative(List<Integer> featuresNegative) { this.featuresNegative = featuresNegative; } public List<Integer> getFeaturesPositive() { return featuresPositive; } public void setFeaturesPositive(List<Integer> featuresPositive) { this.featuresPositive = featuresPositive; } public String getTag() { return this.tag; } }