import java.util.Iterator; import java.util.Vector; public class TreeDepthAgentCycle extends TreeDepthAgentDefault { static final boolean m_bDebug = false; public ITreeDepAlg makeCopy() { return new TreeDepthAgentCycle(); } public boolean isViableTarget(TreeConstraintState currState, TreeConstraintState stateTarget) { Integer nObjStateSig = currState.getIntVar(0); Integer nObjTargSig = stateTarget.getIntVar(0); if(nObjStateSig != null && nObjTargSig != null) { if(nObjStateSig.compareTo(nObjTargSig) == 0) { return false; } } return true; } /** * This we do need to over-ride */ public StateBundle updateState(ILogicVarBundle statePrev, double[] arrLfStateCont, double lfCurrTime, int idxStateOffset, IEnvironment env, Iterator channelsRecieveFrom) { TreeConstraintState treeState = (TreeConstraintState)statePrev; TreeConstraintState treeStateNext = new TreeConstraintState(treeState); Vector msgBag = new Vector(); AgentMsgHelpers.accumMsgs(channelsRecieveFrom, msgBag); Iterator iterMsg = msgBag.iterator(); TreeConstraintState stateParent = null; TreeConstraintState stateTarget = null; Integer nObjDepTarg = treeStateNext.getDepTarg(); while(iterMsg.hasNext()) { TreeConstraintState treeMsgCurr = iterMsg.next(); if(nObjDepTarg != null && treeMsgCurr.getId() == nObjDepTarg.intValue()) { stateTarget = treeMsgCurr; } if(treeMsgCurr.getId() == treeStateNext.getParentId() && treeMsgCurr.getId() != treeStateNext.getId()) { stateParent = treeMsgCurr; } } Integer nObjId = new Integer(treeStateNext.getId()); Integer nObjSgnl = treeStateNext.getIntVar(0); if(nObjDepTarg == null) { nObjSgnl = null; if(m_bDebug) { System.out.println("Killing signal for agent " + nObjId.toString()); } } else if(nObjSgnl == null) { if(m_bDebug) { System.out.println("Signal originates...");} nObjSgnl = new Integer(treeStateNext.getId()); } Integer nObjSgnlRcvdTarget = null; if(stateTarget != null) { if(m_bDebug) {System.out.println("Detected target for "+nObjId.toString()); } nObjSgnlRcvdTarget = stateTarget.getIntVar(0); } else if(m_bDebug && nObjDepTarg != null) { System.out.println("Should have detected target : failed "+ nObjId.toString()); } if(nObjSgnlRcvdTarget != null) { if(nObjSgnl == null || nObjSgnlRcvdTarget.compareTo(nObjSgnl) < 0) { nObjSgnl = nObjSgnlRcvdTarget; } } Integer nObjSgnlRcvdParent = null; if(stateParent != null) { nObjSgnlRcvdParent = stateParent.getIntVar(0); if(nObjSgnlRcvdParent != null) { if(m_bDebug) { System.out.println("Signal from parent, agent "+ nObjId.toString()); } nObjSgnl = nObjSgnlRcvdParent; } } boolean bCycDetect = false; if(nObjSgnlRcvdParent != null && nObjSgnlRcvdTarget != null) { if(nObjSgnlRcvdParent.compareTo(nObjSgnlRcvdTarget) == 0) { bCycDetect = true; } } if(nObjSgnl != null) { if(treeStateNext.getId() == nObjSgnl.intValue() ) { bCycDetect = true; } treeStateNext.insertIntVar(new Integer(0), nObjSgnl.intValue()); } else { treeStateNext.removeVar(new Integer(0)); } if(nObjDepTarg != null) { treeStateNext.setIncreaseDepth(!bCycDetect); if(m_bDebug) { System.out.println("Trying to increase depth, cycle is " + (new Boolean(bCycDetect)).toString()); } } else { treeStateNext.setIncreaseDepth(false); } return new StateBundle(treeStateNext, new ControlFuncDoNothing(2)); } }