Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 package dfengine;
00025
00026 import java.util.*;
00027
00028 import utils.*;
00029
00030
00031 public class DEGraph extends DoubleLinkedDAG {
00032
00033 ArrayList rootNodes = new ArrayList();
00034
00035 TreeSet unexpandedAlphaNodes = new TreeSet();
00036
00037
00038 protected String PRINT_OFFSET = " ";
00039
00040
00041 public Object clone() {
00042 throw new UnsupportedOperationException("class DEGraph does not support clone()");
00043 }
00044
00045 public String toStringShort() {
00046
00047 StringBuffer result = new StringBuffer();
00048
00049 Iterator itRootNodes = rootNodes.iterator();
00050 while (itRootNodes.hasNext()) {
00051 DENode rootNode = (DENode)itRootNodes.next();
00052 System.out.println("DEGraph.toStringShort(): root node: " + rootNode.toStringShort()
00053 + "; num children: " + rootNode.getChildren().size());
00054 printSubgraph(result, rootNode, 0);
00055 }
00056
00057 return result.toString();
00058 }
00059
00060
00061 protected void printSubgraph(StringBuffer buf, DENode n, int depth) {
00062
00063 for (int i = 0; i < depth; ++i) {
00064 buf.append(PRINT_OFFSET);
00065 }
00066
00067 buf.append(n.toStringShort());
00068 buf.append('\n');
00069
00070 Iterator itChildren = n.getChildrenIterator();
00071 while (itChildren.hasNext()) {
00072 DENode child = (DENode)itChildren.next();
00073 printSubgraph(buf, child, depth + 1);
00074 }
00075 }
00076
00077 public void addRootNode(DENode newRootNode) {
00078
00079 assert(invariant());
00080
00081 addNode(newRootNode);
00082 rootNodes.add(newRootNode);
00083
00084 assert(invariant());
00085 }
00086
00087 public void addChildNode(DENode n, DENode child) {
00088 assert(invariant());
00089 assert((n.getID() >= 0) && hasNode(n.getID()));
00090
00091 addNode(child);
00092 addEdge(n, child);
00093
00094 assert(invariant());
00095 }
00096
00097 public TreeSet getUnexpandedAlphaNodes() {
00098 return unexpandedAlphaNodes;
00099 }
00100
00101
00102
00103
00104
00105
00106
00107 public DENode alreadyExists(ModeAssignment ma, DENode exclRootNode) {
00108
00109 Iterator itRootNodes = rootNodes.iterator();
00110 while (itRootNodes.hasNext()) {
00111 DENode rootN = (DENode)itRootNodes.next();
00112 if (rootN != exclRootNode) {
00113 SearchMAVisitor visitor = new SearchMAVisitor(ma);
00114 visitChildrenPreOrder(rootN, visitor, true);
00115
00116 if (visitor.foundNode != null) {
00117 return visitor.foundNode;
00118 }
00119 }
00120 }
00121
00122 return null;
00123 }
00124
00125
00126
00127
00128 protected boolean checkUniqueModesHypothesis() {
00129
00130 for (int i = nodes.size() - 1; i >= 0; --i) {
00131 DENode n = (DENode)nodes.get(i);
00132
00133 for (int j = i - 1; j >= 0; --j) {
00134 DENode n1 = (DENode)nodes.get(j);
00135 if (n.getModeAssignment().equals(n1.getModeAssignment())) {
00136
00137 System.out.println("WARNING: mode assignments not unique: ["
00138 + n.getModeAssignment().toStringShort()
00139 + "] [" + n1.getModeAssignment().toStringShort()
00140 + "]");
00141 return false;
00142 }
00143 }
00144 }
00145
00146 return true;
00147 }
00148
00149 protected boolean invariant() {
00150
00151
00152
00153
00154 Iterator unIt = unexpandedAlphaNodes.iterator();
00155 while (unIt.hasNext()) {
00156 DENode n = (DENode)unIt.next();
00157 if (!n.expanded(DENode.TYPE_BETA) && n.hasChildren()) return false;
00158
00159 if (n.expanded(DENode.TYPE_ALPHA)) return false;
00160 }
00161
00162
00163
00164 Iterator itNodes = iterator();
00165 while (itNodes.hasNext()) {
00166 DENode n = (DENode)itNodes.next();
00167 if (!n.invariant()) return false;
00168 }
00169
00170
00171 if (!checkUniqueModesHypothesis()) return false;
00172
00173 return true;
00174 }
00175
00176
00177
00178
00179 public void propagateInconsToDesc(DENode n) {
00180 assert(invariant());
00181
00182 MarkInconsistentVisitor visitor = new MarkInconsistentVisitor();
00183 visitChildrenPreOrder(n, visitor, true);
00184 assert((n.consistent() == DENode.STATUS_FALSE) && n.descInconsistent());
00185
00186 assert(invariant());
00187 }
00188
00189
00190 }
00191
00192
00193
00194
00195 class SearchMAVisitor extends DoubleLinkedDAGVisitor {
00196
00197 ModeAssignment ma;
00198
00199 DENode foundNode = null;
00200
00201 public SearchMAVisitor(ModeAssignment ma) {
00202 this.ma = ma;
00203 }
00204
00205 public boolean wantMoreNodes() {
00206 return (foundNode == null);
00207 }
00208
00209 public void visit(DoubleLinkedDAGNode n) {
00210
00211 DENode den = (DENode)n;
00212 if (ma.equals(den.getModeAssignment())) {
00213 foundNode = den;
00214 }
00215 }
00216
00217 }
00218
00219
00220
00221
00222 class MarkInconsistentVisitor extends DoubleLinkedDAGVisitor {
00223
00224 public boolean wantMoreNodes() {
00225 return true;
00226 }
00227
00228 public void visit(DoubleLinkedDAGNode n) {
00229 DENode den = (DENode)n;
00230 den.setDescInconsistent();
00231 den.setConsistent(DENode.STATUS_FALSE);
00232 }
00233 }