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 public class ModeAssignment implements Cloneable {
00031 
00032     
00033 
00034 
00035 
00036     protected class ModeNodePair {
00037 
00038         Mode mode;
00039         
00040         ModeAssignmentDAGNode node;  
00041         
00042         ModeNodePair(Mode m, ModeAssignmentDAGNode n) {
00043             mode = m;
00044             node = n;
00045         }
00046 
00047         public boolean equals(Object o) {
00048             if (!(o instanceof ModeNodePair)) return false;
00049             ModeNodePair other = (ModeNodePair)o;
00050             return mode.equals(other.mode);
00051         }
00052     }
00053 
00054     
00055 
00056 
00057     protected TreeMap modes = new TreeMap();
00058 
00059     
00060 
00061 
00062 
00063 
00064 
00065 
00066     protected ModeAssignmentDAG maDag = null;
00067 
00068 
00069 
00073     public ModeAssignment() {
00074     }
00075 
00076     
00077 
00078 
00079 
00080 
00081     public ModeAssignmentDAG getMaDag() {
00082         if (maDag == null) {
00083             maDag = createModeAssignmentDAG();
00084         }
00085         
00086         assert(invariant());
00087 
00088         return maDag;
00089     }
00090 
00091     public Object clone() {
00092 
00093         assert(invariant());
00094 
00095         ModeAssignment newMA = new ModeAssignment();
00096         newMA.maDag = null;
00097 
00098         Iterator itPairs = modes.values().iterator();
00099         while (itPairs.hasNext()) {
00100             ModeNodePair pair = (ModeNodePair)itPairs.next();
00101             ModeNodePair newPair = new ModeNodePair(pair.mode, null);
00102             newMA.modes.put(pair.mode.component, newPair);
00103         }
00104 
00105         assert(newMA.invariant());
00106 
00107         return newMA;
00108     }
00109 
00110     public boolean equals(Object o) {
00111 
00112         if (!(o instanceof ModeAssignment)) return false;
00113         else {
00114             ModeAssignment other = (ModeAssignment)o;
00115             return modes.equals(other.modes);            
00116         }
00117     }
00118 
00119     
00120 
00121 
00122     public int size() {
00123         return modes.size();
00124     }
00125 
00126     
00127 
00128 
00129     public Set getComponents() {
00130         return modes.keySet();
00131     }
00132 
00133     
00134 
00135 
00136     public boolean equalComponents(ModeAssignment other) {
00137         boolean result;
00138 
00139         if (size() == other.size()) {
00140             Set comps1 = modes.keySet();
00141             Set comps2 = other.modes.keySet();
00142             result = comps1.equals(comps2);
00143 
00144         } else result = false;
00145         
00146         assert(postcond_equalComponents(other, result));
00147         return result;
00148     }
00149 
00150     
00151 
00152 
00153 
00154 
00155     protected boolean postcond_equalComponents(ModeAssignment other, boolean result) {
00156         
00157         boolean correctResult = true;
00158 
00159         Iterator itModes = iterator();
00160         while (itModes.hasNext()) {
00161             
00162             Mode mode = (Mode)itModes.next();
00163             Mode otherMode = other.getMode(mode.getComponent()); 
00164             if (otherMode == null) {
00165                 correctResult = false;
00166                 break;
00167             }
00168         }
00169 
00170         if (correctResult) {
00171             Iterator itOtherModes = other.iterator();
00172             while (itOtherModes.hasNext()) {
00173                 Mode otherMode = (Mode)itOtherModes.next();
00174                 Mode mode = getMode(otherMode.getComponent());
00175                 if (mode == null) {
00176                     correctResult = false;
00177                     break;
00178                 }
00179             }
00180         }
00181 
00182         return (result == correctResult);
00183     }
00184 
00185     
00186 
00187 
00188     public String toStringShort() {
00189         StringBuffer result = new StringBuffer();
00190 
00191         Iterator itValues = modes.values().iterator();
00192         while (itValues.hasNext()) {
00193             Mode m = ((ModeNodePair)itValues.next()).mode;
00194             if (result.length() > 0) result.append("; ");
00195             result.append(m.toStringShort());
00196         }
00197 
00198         return result.toString();
00199     }
00200 
00201     
00202 
00203 
00204 
00205 
00206 
00207 
00208 
00209     public boolean subst(int fromMode, int toMode) {
00210         assert((fromMode != Mode.MODE_DF) && (toMode != Mode.MODE_DF));
00211         assert(invariant());
00212         
00213         boolean result = false;
00214 
00215         Set entries = modes.entrySet();
00216         Iterator itEntries = entries.iterator();
00217         while (itEntries.hasNext()) {
00218             Map.Entry entry = (Map.Entry)itEntries.next();
00219             
00220             ModeNodePair pair = (ModeNodePair)entry.getValue();
00221             if (pair.mode.type == fromMode) {
00222                 Mode newMode = pair.mode.getComponent().getMode(toMode, null);
00223                 pair.mode = newMode;
00224                 
00225                 result = true;
00226             }
00227         }
00228         
00229         assert(invariant());
00230         return result;
00231     }
00232 
00233     
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241     public boolean subst(Component comp, int toMode, Component parent) {
00242         assert(modes.containsKey(comp));
00243         assert(invariant());
00244 
00245         ModeNodePair pair = (ModeNodePair)modes.get(comp);
00246         
00247         
00248 
00249         if ((maDag != null) && (pair.mode.type == Mode.MODE_DF)) {
00250             Component oldParent = pair.mode.getParent();
00251             ModeAssignmentDAGNode oldParentNode = ((ModeNodePair)modes.get(oldParent)).node;
00252             maDag.removeEdge(oldParentNode, pair.node);
00253         }
00254 
00255         
00256 
00257         Mode newMode = comp.getMode(toMode, parent);
00258         pair.mode = newMode;
00259 
00260         
00261 
00262         if ((maDag != null) && (toMode == Mode.MODE_DF)) {
00263             ModeAssignmentDAGNode parentNode = ((ModeNodePair)modes.get(parent)).node;
00264             maDag.addEdge(parentNode, pair.node);
00265         }
00266 
00267         assert(invariant());
00268         return true;
00269     }
00270 
00271     
00272 
00273 
00274     public boolean setMode(Component comp, int toMode, Component parent) {
00275         assert(invariant());
00276 
00277         Object o = modes.get(comp);
00278         
00279         if (o != null) {   
00280             
00281             ModeNodePair pair = (ModeNodePair)o;
00282 
00283             if ((maDag != null) && (pair.mode.type == Mode.MODE_DF)) {
00284                 Component oldParent = pair.mode.getParent();
00285                 ModeAssignmentDAGNode oldParentNode = ((ModeNodePair)modes.get(oldParent)).node;
00286                 maDag.removeEdge(oldParentNode, pair.node);
00287             }
00288             
00289             
00290             
00291             Mode newMode = comp.getMode(toMode, parent);
00292             pair.mode = newMode;
00293             
00294             
00295             
00296             if ((maDag != null) && (toMode == Mode.MODE_DF)) {
00297                 ModeAssignmentDAGNode parentNode = ((ModeNodePair)modes.get(parent)).node;
00298                 maDag.addEdge(parentNode, pair.node);
00299             }
00300  
00301             assert(invariant());
00302             return true;
00303         }
00304 
00305         else {   
00306 
00307             ModeAssignmentDAGNode newNode = null;
00308             if (maDag != null) newNode = new ModeAssignmentDAGNode(comp);
00309             
00310             ModeNodePair pair = new ModeNodePair(comp.getMode(toMode, parent), newNode);
00311             modes.put(comp, pair);
00312             
00313             if (maDag != null) {
00314                 maDag.addNode(newNode);
00315                 if (toMode == Mode.MODE_DF) {
00316                     ModeAssignmentDAGNode parentNode = ((ModeNodePair)modes.get(parent)).node;
00317                     maDag.addEdge(parentNode, newNode);
00318                 }
00319             }
00320 
00321             assert(invariant());
00322             return false;
00323         }
00324 
00325     }  
00326 
00327     
00328 
00329 
00330 
00331 
00332 
00333 
00334 
00335 
00336     public void setModes(ArrayList components, int toMode) {
00337         assert(toMode != Mode.MODE_DF);
00338 
00339         Iterator itComp = components.iterator();
00340         while (itComp.hasNext()) {
00341             Component c = (Component)itComp.next();
00342             setMode(c, toMode, null);
00343         }
00344     }
00345 
00346     
00347 
00348 
00349 
00350 
00351     public Mode getMode(Component comp) {
00352         Object o = modes.get(comp);
00353         if (o == null) return null;
00354         else {
00355             return ((ModeNodePair)o).mode;
00356         }
00357     }
00358 
00359     public ModeAssignmentDAGNode getNode(Component comp) {
00360         assert(maDag != null);
00361 
00362         Object o = modes.get(comp);
00363         if (o == null) return null;
00364         else {
00365             return ((ModeNodePair)o).node;
00366         }
00367     }
00368 
00369     
00370 
00371 
00372 
00373 
00374 
00375     public int getMode(Component comp, int defaultModeType) {
00376         Object o = modes.get(comp);
00377         
00378         if (o == null) return defaultModeType;
00379         else {
00380             return ((ModeNodePair)o).mode.type;
00381         }
00382     }
00383 
00384     
00385 
00386 
00387     protected int countNumModes(int modeType) {
00388         int result = 0;
00389         
00390         Iterator itModes = getModeIterator(modeType);
00391         while (itModes.hasNext()) {
00392             itModes.next();
00393             ++result;
00394         }
00395         
00396         return result;
00397     }
00398 
00399     
00400 
00401 
00402     public int getNumPFCs() {
00403         int result = (modes.size() - getNumSFCs());
00404         assert(result == countNumModes(Mode.MODE_AB) + countNumModes(Mode.MODE_IF));
00405         return result;
00406     }
00407 
00408     
00409 
00410 
00411     public int getNumSFCs() {
00412         if (maDag == null) {
00413             return countNumModes(Mode.MODE_DF);
00414         } else {
00415             int result = maDag.getNumEdges();
00416             assert(result == countNumModes(Mode.MODE_DF));
00417             return result;
00418         }
00419     }
00420 
00421     public boolean hasMode(int modeType) {
00422         Collection values = modes.values();
00423         Iterator itPairs = values.iterator();
00424         
00425         while (itPairs.hasNext()) {
00426             ModeNodePair pair = (ModeNodePair)itPairs.next();
00427             if (pair.mode.getType() == modeType) return true;
00428         }
00429 
00430         return false;
00431     }
00432    
00433     
00434 
00435 
00436     public int computeLongestDFChain() {
00437         maDag = getMaDag();
00438         return maDag.computeMaxPathLen();
00439     }
00440 
00441     
00442 
00443 
00444     public Iterator iterator() {
00445         return new ModeIterator();
00446     }
00447 
00448     
00449 
00450 
00451 
00452     public Iterator getModeIterator(int modeType) {
00453         return new ModeIterator(modeType);
00454     }
00455 
00456     
00457 
00458 
00459     public Iterator getModeIterator(SortedIntList modeTypes) {
00460         return new ModeIterator(modeTypes);
00461     }
00462 
00463     protected ModeAssignmentDAG createModeAssignmentDAG() {
00464         
00465         ModeAssignmentDAG dag = new ModeAssignmentDAG();
00466 
00467         
00468 
00469         Iterator itPairs = modes.values().iterator();
00470         while (itPairs.hasNext()) {
00471             ModeNodePair pair = (ModeNodePair)itPairs.next();
00472             ModeAssignmentDAGNode n = new ModeAssignmentDAGNode(pair.mode.getComponent());
00473             dag.addNode(n);
00474             pair.node = n;
00475         }
00476 
00477         
00478 
00479         itPairs = modes.values().iterator();
00480         while (itPairs.hasNext()) {
00481             ModeNodePair pair = (ModeNodePair)itPairs.next();
00482             if (pair.mode.type == Mode.MODE_DF) {
00483                 Component parentComp = pair.mode.parent;
00484                 ModeAssignmentDAGNode parentNode = ((ModeNodePair)modes.get(parentComp)).node;
00485                 dag.addEdge(parentNode, pair.node);
00486             } 
00487         }
00488 
00489         assert(correctMaDag(dag));
00490         return dag;
00491 
00492     }  
00493 
00494     protected boolean invariant() {
00495         if ((maDag != null) && !correctMaDag(maDag)) return false;
00496 
00497         return true;
00498     }
00499 
00500     
00501 
00502 
00503     protected boolean correctMaDag(ModeAssignmentDAG dag) {
00504         
00505         if (!dag.invariant()) return false;
00506 
00507         
00508 
00509         Iterator itPairs = modes.values().iterator();
00510         while (itPairs.hasNext()) {
00511             ModeNodePair pair = (ModeNodePair)itPairs.next();
00512             if (pair.node == null) return false;
00513             if (!dag.getNodes().contains(pair.node)) return false;
00514             
00515             if (pair.mode.type == Mode.MODE_DF) {
00516                 Component parentComp = pair.mode.parent;
00517                 ModeAssignmentDAGNode parentNode = ((ModeNodePair)modes.get(parentComp)).node;
00518                 if (!dag.hasEdge(parentNode, pair.node)) return false;
00519             }
00520         }
00521         
00522         
00523         
00524         Iterator itNodes = dag.iterator();
00525         while (itNodes.hasNext()) {
00526             ModeAssignmentDAGNode n = (ModeAssignmentDAGNode)itNodes.next();
00527             if (!modes.containsKey(n.comp)) return false;
00528             
00529             Component parentComp = n.getFailurePred();
00530             if (parentComp != null) {
00531                 ModeNodePair pair = (ModeNodePair)modes.get(n.comp);
00532                 if ((pair.mode.type != Mode.MODE_DF) || (pair.mode.parent != parentComp)) return false;
00533             }
00534         }
00535         
00536 
00537         return true;
00538 
00539     }  
00540 
00541     
00542 
00543 
00544 
00545 
00546 
00547 
00548 
00549 
00550     protected boolean hasMoreConstrainedNodeThan(ModeAssignment other, GraphMatrix transClosure,
00551                                                  GraphMatrix otherTransClosure) {
00552         assert(equalComponents(other));
00553 
00554         ModeAssignmentDAG dag = getMaDag();
00555         ModeAssignmentDAG otherDag = other.getMaDag();
00556 
00557         
00558 
00559         Iterator itNodes = dag.iterator();
00560         while (itNodes.hasNext()) {
00561             ModeAssignmentDAGNode node = (ModeAssignmentDAGNode)itNodes.next();
00562             ModeAssignmentDAGNode otherNode = other.getNode(node.comp);
00563 
00564             
00565 
00566             Iterator itAnc = dag.getAncestorIterator(node, transClosure);
00567             while (itAnc.hasNext()) {
00568                 ModeAssignmentDAGNode anc = (ModeAssignmentDAGNode)itAnc.next();
00569                 assert(dag.isAncestor(anc, node, transClosure));
00570                        
00571                 ModeAssignmentDAGNode otherAnc = other.getNode(anc.comp);
00572                 if (!otherDag.isAncestor(otherAnc, otherNode, otherTransClosure)) return true;
00573             }
00574         }
00575         
00576         return false;
00577     }
00578 
00579 
00580     
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 
00590     public int compareOrderTo(ModeAssignment other, GraphMatrix transClosure,
00591                               GraphMatrix otherTransClosure) {
00592 
00593         assert(equalComponents(other));
00594 
00595         if (hasMoreConstrainedNodeThan(other, transClosure, otherTransClosure)) {
00596             
00597             if (other.hasMoreConstrainedNodeThan(this, otherTransClosure, transClosure)) {
00598                 return 0;
00599             } else return 1;
00600 
00601         } else {
00602             if (other.hasMoreConstrainedNodeThan(this, otherTransClosure, transClosure)) {
00603                 return -1;
00604             } else {
00605                 assert(false);
00606                 return 1000;                
00607             }
00608         }
00609     }
00610 
00611 
00613 
00614 
00615     protected class ModeIterator implements Iterator {
00616       
00617         protected Iterator modesIterator;
00618 
00619         protected Mode next = null;
00620 
00621         protected SortedIntList modeTypes = null;
00622 
00623         
00624         public ModeIterator() {
00625             modesIterator = modes.values().iterator();
00626             moveToNext();
00627         }
00628 
00629         
00630         public ModeIterator(int modeType) {
00631             this.modeTypes = new SortedIntList();
00632             this.modeTypes.addSorted(modeType);
00633             
00634             Collection values = modes.values();
00635             modesIterator = values.iterator();
00636 
00637             moveToNext();
00638         }        
00639   
00640         
00641         public ModeIterator(SortedIntList modeTypes) {
00642             this.modeTypes = modeTypes;
00643  
00644             Collection values = modes.values();
00645             modesIterator = values.iterator();
00646 
00647             moveToNext();
00648         }
00649 
00650         protected void moveToNext() {
00651             next = null;
00652 
00653             while (modesIterator.hasNext()) {
00654                 ModeNodePair pair = (ModeNodePair)modesIterator.next();
00655                 if ((modeTypes == null) || modeTypes.contains(pair.mode.getType())) {
00656                     next = pair.mode;
00657                     break;
00658                 }
00659             }
00660         }
00661 
00662         public boolean hasNext() {
00663             return (next != null);
00664         }
00665 
00666         public Object next() {
00667             Object result = next;
00668             moveToNext();
00669             return result;
00670         }
00671 
00672         public void remove() {
00673             throw new UnsupportedOperationException();
00674         }
00675 
00676     }  
00677 }