public int SearchMaxDist() { Stack <HClusterNode> st = new Stack <HClusterNode>(); HClusterNode current = null; int kMax; kMax = -(int)this.levelDist; kMin = (int)this.levelDist; st.Push(this); while (st.Count != 0) { current = st.Pop(); if (current.levelDist > kMax) { kMax = (int)current.levelDist; } if (current.levelDist < kMin) { kMin = (int)current.levelDist; } if (current.joined != null) { foreach (var item in current.joined) { st.Push(item); } } } return(kMax); }
public Dictionary <double, List <HClusterNode> > GetClustersByLevels() { Dictionary <double, List <HClusterNode> > dic = new Dictionary <double, List <HClusterNode> >(); Stack <HClusterNode> st = new Stack <HClusterNode>(); HClusterNode current = null; st.Push(this); while (st.Count != 0) { current = st.Pop(); if (!dic.ContainsKey(current.levelDist)) { dic.Add(current.levelDist, new List <HClusterNode>()); } dic[current.levelDist].Add(current); if (current.joined != null) { foreach (var item in current.joined) { st.Push(item); } } } return(dic); }
public Dictionary <HClusterNode, System.Drawing.Color> MarkNodes(List <string> toMark, System.Drawing.Color color) { Dictionary <HClusterNode, System.Drawing.Color> returnList = new Dictionary <HClusterNode, System.Drawing.Color>(); Stack <HClusterNode> st = new Stack <HClusterNode>(); HClusterNode current = null; st.Push(this); while (st.Count != 0) { current = st.Pop(); if (current.joined == null || current.joined.Count == 0) { foreach (var item in toMark) { if (current.setStruct.Contains(item)) { returnList.Add(current, color); break; } } } else if (current.joined != null) { foreach (var item in current.joined) { st.Push(item); } } } return(returnList); }
public bool IsVisible(HClusterNode node) { Stack <HClusterNode> st = new Stack <HClusterNode>(); HClusterNode current = null; if (this == node) { return(true); } st.Push(this); while (st.Count != 0) { current = st.Pop(); if (current.joined != null) { foreach (var item in current.joined) { if (item == node) { return(true); } st.Push(item); } } } return(false); }
public List <HClusterNode> GetLeaves() { List <HClusterNode> listH = new List <HClusterNode>(); Stack <HClusterNode> st = new Stack <HClusterNode>(); HClusterNode current = null; st.Push(this); while (st.Count != 0) { current = st.Pop(); if (current.joined != null) { foreach (var item in current.joined) { st.Push(item); } } else { listH.Add(current); } } return(listH); }
public Dictionary <HClusterNode, System.Drawing.Color> CutDendrog(int distThreshold) { Dictionary <HClusterNode, System.Drawing.Color> returnList = new Dictionary <HClusterNode, System.Drawing.Color>(); Stack <HClusterNode> st = new Stack <HClusterNode>(); HClusterNode current = null; st.Push(this); while (st.Count != 0) { current = st.Pop(); if (current.levelDist < distThreshold) { returnList.Add(current, System.Drawing.Color.Red); } else if (current.joined != null) { foreach (var item in current.joined) { st.Push(item); } } } return(returnList); }
public ClusterOutput HierarchicalClustering(List <string> structures) { List<List<HClusterNode>> level =new List<List<HClusterNode>>(); List<HClusterNode> levelNodes=new List<HClusterNode>(); List<HClusterNode> rowNodes=new List<HClusterNode>(); ClusterOutput outCl = new ClusterOutput(); int levelCount = 0; bool end=false; HClusterNode node; if (structures.Count <= 1) { outCl.hNode = new HClusterNode(); outCl.hNode.setStruct = structures; outCl.hNode.refStructure = structures[0]; outCl.hNode.levelDist = 0; outCl.hNode.joined = null; return outCl; } dMeasure.CalcDistMatrix(structures); for(int i=0;i<structures.Count;i++) { node=new HClusterNode(); node.refStructure=structures[i]; node.joined=null; node.setStruct.Add(structures[i]); node.levelNum = levelCount; node.levelDist = dMeasure.maxSimilarity; node.realDist = dMeasure.GetRealValue(node.levelDist); levelNodes.Add(node); } level.Add(levelNodes); while(!end) { levelNodes=new List<HClusterNode>(); List<List<HClusterNode>> rowList = LevelMinimalDist(level[level.Count - 1]); if (rowList.Count > 0) { foreach (var item in rowList) { node=new HClusterNode(); node.joined=item; node.levelDist = min; node.realDist = dMeasure.GetRealValue(min); node.levelNum = level.Count; for(int m=0;m<item.Count;m++) { node.setStruct.AddRange(item[m].setStruct); item[m].fNode = true; } //node.refStructure = dMeasure.GetReferenceStructure(node.setStruct); List<string> refList = new List<string>(); foreach (var itemJoined in node.joined) refList.Add(itemJoined.refStructure); node.refStructure = null; if (mustRefStructure != null) foreach (var itemRef in refList) if (itemRef == mustRefStructure) node.refStructure = mustRefStructure; if(node.refStructure==null) node.refStructure = dMeasure.GetReferenceStructure(node.setStruct,refList); levelNodes.Add(node); } } if(levelNodes.Count>0) { level.Add(levelNodes); for(int i=0;i<level[level.Count-2].Count;i++) { if(!level[level.Count-2][i].fNode) level[level.Count-1].Add(level[level.Count-2][i]); } } if(level[level.Count-1].Count==1) end=true; } outCl.hNode = level[level.Count - 1][0]; outCl.hNode.levelNum = 0; //At the end level num must be set properly Queue<HClusterNode> qq = new Queue<HClusterNode>(); HClusterNode h; for (int i = 0; i < level.Count; i++) for (int j = 0; j < level[i].Count; j++) level[i][j].fNode = true; for (int i = 0; i < level.Count; i++) for (int j = 0; j < level[i].Count; j++) if (level[i][j].fNode) { level[i][j].levelDist = Math.Abs(level[i][j].levelDist - dMeasure.maxSimilarity); level[i][j].realDist = dMeasure.GetRealValue(level[i][j].levelDist); level[i][j].fNode = false; } qq.Enqueue(level[level.Count - 1][0]); while (qq.Count != 0) { h = qq.Dequeue(); if (h.joined != null) foreach (var item in h.joined) { item.levelNum = h.levelNum + 1; qq.Enqueue(item); } } outCl.hNode.dirName = dirName; outCl.clusters = null; outCl.juryLike = null; return outCl; }
public bool IsVisible(HClusterNode node) { Stack<HClusterNode> st = new Stack<HClusterNode>(); HClusterNode current = null; if (this == node) return true; st.Push(this); while (st.Count != 0) { current = st.Pop(); if (current.joined != null) foreach (var item in current.joined) { if (item == node) return true; st.Push(item); } } return false; }
public ClusterOutput HierarchicalClustering(List <string> structures) { List <List <HClusterNode> > level = new List <List <HClusterNode> >(); List <HClusterNode> levelNodes = new List <HClusterNode>(); List <HClusterNode> rowNodes = new List <HClusterNode>(); ClusterOutput outCl = new ClusterOutput(); int levelCount = 0; bool end = false; HClusterNode node; if (structures.Count <= 1) { outCl.hNode = new HClusterNode(); outCl.hNode.setStruct = structures; outCl.hNode.refStructure = structures[0]; outCl.hNode.levelDist = 0; outCl.hNode.joined = null; return(outCl); } dMeasure.CalcDistMatrix(structures); for (int i = 0; i < structures.Count; i++) { node = new HClusterNode(); node.refStructure = structures[i]; node.joined = null; node.setStruct.Add(structures[i]); node.levelNum = levelCount; node.levelDist = dMeasure.maxSimilarity; node.realDist = dMeasure.GetRealValue(node.levelDist); levelNodes.Add(node); } level.Add(levelNodes); while (!end) { levelNodes = new List <HClusterNode>(); List <List <HClusterNode> > rowList = LevelMinimalDist(level[level.Count - 1]); if (rowList.Count > 0) { foreach (var item in rowList) { node = new HClusterNode(); node.joined = item; node.levelDist = min; node.realDist = dMeasure.GetRealValue(min); node.levelNum = level.Count; for (int m = 0; m < item.Count; m++) { node.setStruct.AddRange(item[m].setStruct); item[m].fNode = true; } //node.refStructure = dMeasure.GetReferenceStructure(node.setStruct); List <string> refList = new List <string>(); foreach (var itemJoined in node.joined) { refList.Add(itemJoined.refStructure); } node.refStructure = null; if (mustRefStructure != null) { foreach (var itemRef in refList) { if (itemRef == mustRefStructure) { node.refStructure = mustRefStructure; } } } if (node.refStructure == null) { node.refStructure = dMeasure.GetReferenceStructure(node.setStruct, refList); } levelNodes.Add(node); } } if (levelNodes.Count > 0) { level.Add(levelNodes); for (int i = 0; i < level[level.Count - 2].Count; i++) { if (!level[level.Count - 2][i].fNode) { level[level.Count - 1].Add(level[level.Count - 2][i]); } } } if (level[level.Count - 1].Count == 1) { end = true; } } outCl.hNode = level[level.Count - 1][0]; outCl.hNode.levelNum = 0; //At the end level num must be set properly Queue <HClusterNode> qq = new Queue <HClusterNode>(); HClusterNode h; for (int i = 0; i < level.Count; i++) { for (int j = 0; j < level[i].Count; j++) { level[i][j].fNode = true; } } for (int i = 0; i < level.Count; i++) { for (int j = 0; j < level[i].Count; j++) { if (level[i][j].fNode) { level[i][j].levelDist = Math.Abs(level[i][j].levelDist - dMeasure.maxSimilarity); level[i][j].realDist = dMeasure.GetRealValue(level[i][j].levelDist); level[i][j].fNode = false; } } } qq.Enqueue(level[level.Count - 1][0]); while (qq.Count != 0) { h = qq.Dequeue(); if (h.joined != null) { foreach (var item in h.joined) { item.levelNum = h.levelNum + 1; qq.Enqueue(item); } } } outCl.hNode.dirName = dirName; outCl.clusters = null; outCl.juryLike = null; return(outCl); }