/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.clothocad.tool.cello; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import sun.security.provider.certpath.Vertex; /** * * @author rozagh */ public class DAGraph { public ArrayList<DAGVertex> Vertices; public ArrayList<DAGEdge> Edges; private DAGVertex _parent; public DAGraph () { this.Edges = new ArrayList<DAGEdge>(); this.Vertices = new ArrayList<DAGVertex>(); } public DAGraph(List<DAGVertex> Vertices, List<DAGEdge> Edges ) { this.Edges = new ArrayList<DAGEdge>(Edges); this.Vertices = new ArrayList<DAGVertex>(Vertices); } public DAGraph( DAGraph g) { /*this.Edges = new ArrayList<DAGEdge>(); for (int i = 0; i< g.Edges.size(); i++) this.Edges.add(g.Edges.get(i).Copy()); this.Vertices = new ArrayList<DAGVertex>(); for (int i=0; i<g.Vertices.size(); i++) this.Vertices.add(g.Vertices.get(i).Copy()); * */ if (g.Vertices != null) { this.Vertices = new ArrayList<DAGVertex>(); for (int i=0; i<g.Vertices.size(); i++) this.Vertices.add(g.Vertices.get(i).Copy()); } if (g.Edges != null) { this.Edges = new ArrayList<DAGEdge>(); for (int i = 0; i< g.Edges.size(); i++) this.Edges.add(g.Edges.get(i).Copy()); } for (int i = 0; i < this.Vertices.size(); i++) { if (g.Vertices.get(i).Outgoing != null) { int i2 = this.findEdge(g.Vertices.get(i).Outgoing.Index); if (-1 < i2 && i2< this.Edges.size()) this.Vertices.get(i).Outgoing = this.Edges.get(i2); } } for (int i = 0; i < this.Edges.size(); i++) { if (g.Edges.get(i).From != null) { int i2 = this.findVertex(g.Edges.get(i).From.Index); if (-1 < i2 && i2 < this.Vertices.size()) this.Edges.get(i).From = this.Vertices.get(i2); } if (g.Edges.get(i).To != null) { int i2 = this.findVertex(g.Edges.get(i).To.Index); if (-1 < i2 && i2< this.Vertices.size()) this.Edges.get(i).To = this.Vertices.get(i2); } if (g.Edges.get(i).Next != null) { int i2 = this.findEdge(g.Edges.get(i).Next.Index); if (-1 < i2 && i2 < this.Edges.size()) this.Edges.get(i).Next = this.Edges.get(i2); } } } public DAGraph Copy () { DAGraph g = new DAGraph(this); return g; } /* public DAGraph CopyByParent () { ArrayList<DAGVertex> parents = this.findParent(); DAGraph result = new DAGraph(); for (int i =0; i< parents.size(); i++) { } } * */ public void setParent (DAGVertex v) { this._parent = v; } public DAGVertex getParent () { return this._parent; } public int VertexCount(){ return this.Vertices.size(); } public void AddVertex ( DAGVertex v ){ this.Vertices.add(v); } public void AddChild (DAGVertex Parent, DAGVertex Child ) { this.Vertices.add(Child); DAGEdge e = new DAGEdge(Parent, Child, null); //Parent.AddEdge(e); this.Edges.add(e); } public String PrintGraph () { String result = ""; for (int i=0; i< this.Vertices.size(); i++) { result += "\n\n Vertex is --> "+ this.Vertices.get(i).Name +"\t" + String.valueOf( this.Vertices.get(i).Index); result += "\tCover Part : " + String.valueOf( this.Vertices.get(i).Cover); result += "\tCover Part Number : " + String.valueOf( this.Vertices.get(i).subCover); if (this.Vertices.get(i).Feature != null) result += "\tPrimitive Sequence : " + this.Vertices.get(i).Feature.print(); result +="\nChilds: " ; DAGEdge e= this.Vertices.get(i).Outgoing; while (e!= null ) { if (e.To != null) result += " --> "+e.To.Name +" -- " + String.valueOf( e.To.Index) + "\t"; e = e.Next; } } return result; } public void ChangeChild(DAGVertex oldV, DAGVertex newV ) { for(int i = 0; i< this.Edges.size(); i++) { if (this.Edges.get(i).To == oldV) { this.Edges.get(i).To = new DAGVertex(); this.Edges.get(i).To = newV; } } } public void ReplaceVertex (DAGVertex oldV, DAGVertex newV) { //change all edges from oldv to from newv for(int i = 0; i< this.Edges.size(); i++) { if (this.Edges.get(i).From == oldV) { this.Edges.get(i).From = new DAGVertex(); this.Edges.get(i).From = newV; } } //change all edges to oldv to from newv for(int i = 0; i< this.Edges.size(); i++) { if (this.Edges.get(i).To == oldV) { this.Edges.get(i).To = new DAGVertex(); this.Edges.get(i).To = newV; } } } public ArrayList<DAGVertex> findRoots () { ArrayList<DAGVertex> parents = new ArrayList<DAGVertex>(); for (int i=0; i< this.Vertices.size(); i++) { DAGVertex curv = this.Vertices.get(i); boolean isparent = true; for (int j=0; j< this.Edges.size(); j++) { DAGEdge cure = this.Edges.get(j); if (cure.To == curv) { isparent=false; break; } } if (isparent) parents.add(curv); } return parents; } public ArrayList<DAGVertex> findLeaf () { ArrayList<DAGVertex> result = new ArrayList<DAGVertex>(); for (int i=0; i< this.Vertices.size(); i++) if (this.Vertices.get(i).Outgoing == null) result.add(this.Vertices.get(i)); return result; } public int findEdge (int index) { for (int i=0; i< this.Edges.size(); i++) { DAGEdge cure = this.Edges.get(i); if (cure.Index == index) { return i; } } return -1; } public int findVertex (int index) { for (int i=0; i< this.Vertices.size(); i++) { DAGVertex curv = this.Vertices.get(i); if (curv.Index == index) { return i; } } return -1; } public String printSequence () { ArrayList<DAGVertex> roots = this.findRoots(); String result = ""; for (int i=0; i< roots.size(); i++) { result += "\n" + this.makeSequenceArray(roots.get(i)); } return result; } public String makeSequenceArray (DAGVertex v) { String Result = ""; HashMap<String, ArrayList<String>> sequenceArray = new HashMap<String, ArrayList<String>>(); DFSSearch(v, sequenceArray); Iterator iterator = sequenceArray.keySet().iterator(); while(iterator.hasNext()){ ArrayList<String> temp = sequenceArray.get((String) iterator.next()); Result+="\n"; for (int i=0; i< temp.size(); i++) Result+= " " + temp.get(i); } return Result; } public void DFSSearch (DAGVertex v, HashMap<String, ArrayList<String>> sequenceArray) { DAGEdge e = v.Outgoing; while (e!= null) { DFSSearch(e.To, sequenceArray); e = e.Next; } if (v.Feature !=null) { String Key = String.valueOf( v.Cover)+"_"+String.valueOf( v.subCover); if (!sequenceArray.containsKey(Key)) sequenceArray.put(Key, new ArrayList<String>()); if (v.Feature._sequence != null) { //Result += "("+v.Feature._sequence+")"; sequenceArray.get(Key).add(v.Feature._sequence); }else { sequenceArray.get(Key).add("(N/A)"); //Result += "(N/A)"; } } } }