package experimental.ising;
import java.util.ArrayList;
import java.util.List;
public class Variable {
private int i;
private String tagName;
//
private Belief belief;
private int size;
// neighbors
private ArrayList<Factor> neighbors;
private ArrayList<Integer> messageIds;
//messages
private ArrayList<Message> messages;
public Variable(int size, int i, String tagName) {
this.setSize(size);
this.setBelief(new Belief(size));
this.setI(i);
this.setTagName(tagName);
this.setNeighbors(new ArrayList<Factor>());
this.setMessageIds(new ArrayList<Integer>());
this.setMessages(new ArrayList<Message>());
}
public void computeBelief() {
this.belief.toOnes();
for (int neighborId = 0; neighborId < this.neighbors.size(); ++neighborId) {
Factor f = this.neighbors.get(neighborId);
int messageId = this.messageIds.get(neighborId);
Message m = f.getMessages().get(messageId);
for (int n = 0; n < this.size; ++n) {
this.belief.measure[n] *= m.measure[n];
}
}
this.belief.renormalize();
//System.exit(0);
}
/**
* Efficiently compute all message in O(n) rather than O(n^2) (naive)
* Algorithm:
* 1) Compute belief
* 2) Divide out message for each message
*/
public void passMessage() {
this.computeBelief();
int neighborId = 0;
for (Message m1 : this.messages) {
Factor f = this.neighbors.get(neighborId);
int messageId = this.messageIds.get(neighborId);
Message m2 = f.messages.get(messageId);
for (int n = 0; n < this.size; ++n) {
m1.measure[n] = this.belief.measure[n] / m2.measure[n];
}
// renormalize (optional)
m1.renormalize();
++neighborId;
}
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
public List<Integer> getMessageIds() {
return messageIds;
}
public void setMessageIds(ArrayList<Integer> messageIds) {
this.messageIds = messageIds;
}
public List<Message> getMessages() {
return messages;
}
public void setMessages(ArrayList<Message> messages) {
this.messages = messages;
}
public List<Factor> getNeighbors() {
return neighbors;
}
public void setNeighbors(ArrayList<Factor> neighbors) {
this.neighbors = neighbors;
}
public Belief getBelief() {
return belief;
}
public void setBelief(Belief belief) {
this.belief = belief;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
}