package org.societies.context.user.refinement.impl.bayesianLibrary.bayesianLearner.impl;
import java.io.Serializable;
import java.util.Enumeration;
import java.util.Set;
import java.util.Vector;
import org.societies.context.user.refinement.impl.bayesianLibrary.bayesianLearner.interfaces.RandomVariable;
/**
* This class extends AbstractRVwithParents and represents a RV with parents
* with the purpose of being able to pass connectivity messages to its parents
* to see if there are cycles in a BayesianNetworkCandidate that holds many
* BNSegments.
*
* @author robert_p
*
*/
public class BNSegment extends AbstractRVwithParents implements Serializable {
private static final long serialVersionUID = -7441406598682949389L;
private Vector<Message>inbox;
private Vector<Message>outbox;
private boolean foundArc;
public BNSegment(RandomVariable targetRV,
Set<RandomVariable>parents_of_targetRV) {
super(targetRV, parents_of_targetRV);
this.inbox = new Vector<Message>();
this.outbox = new Vector<Message>();
}
public String toString() {
return this.getTargetRV().getName() + "<=Parents: "
+ this.getOrderedParents();
}
/**
*
*/
public void prepareInitialMessages() {
this.inbox.clear();
this.outbox.clear();
this.inbox.add(new Message(this.getTargetRV(), null, 0));
this.foundArc = false;
}
public void moveFromInBoxToOutbox() {
this.outbox.clear();
this.outbox.addAll(this.inbox);
this.inbox.clear();
}
/**
* @return true if messages were sent
*/
public boolean propagateAllMessages(int maxhops,
BayesianNetworkCandidate bnc) {
Enumeration<Message> enumeration = this.outbox.elements();
boolean sentMessages = false;
// System.out.println("propagating messages from " + this);
while (enumeration.hasMoreElements()) {
Message message = (Message) enumeration.nextElement();
if (message.getHopCounter() < maxhops) {
for (int i = 0; i < this.parentArray.length; i++) {
if (message.getSender().equals(this.parentArray[i])) {
this.foundArc = true;
// System.out.println("Found Arc to " + parents[i]);
break;
}
bnc.getBNSegment(this.parentArray[i]).inbox.add(message
.computeMessageTo(this.parentArray[i]));
// System.out.println("Adding message: " + message + " to "
// + parents[i]);
sentMessages = true;
}
}
}
return sentMessages;
}
/**
* @return
*/
public boolean hasFoundArc() {
return this.foundArc;
}
private class Message {
/**
* @param sender
* @param destination
* @param hopCounter
*/
public Message(RandomVariable sender, RandomVariable destination,
int hopCounter) {
super();
this.sender = sender;
this.destination = destination;
this.hopCounter = hopCounter;
}
/**
* @return
*/
public RandomVariable getSender() {
return this.sender;
}
public String toString() {
return " From: " + this.sender + " to: " + this.destination
+ " hops: " + this.hopCounter;
}
RandomVariable sender;
RandomVariable destination;
int hopCounter;
private Message computeMessageTo(RandomVariable newDestination) {
return new Message(this.sender, newDestination, this.hopCounter + 1);
}
private int getHopCounter() {
return this.hopCounter;
}
}
}