public List <IndexedGraph> GetAllJoins(Graph g1, IndexedGraph g2, object delta1) { _subgraphEnumerator.MatchNeighborhood(g1, g2, 0, delta1); return(new List <IndexedGraph>(_subgraphEnumerator._rets.Cast <IndexedGraph>())); }
List <IndexedGraph> JoinGraphPair(Graph g1, IndexedGraph g2) { int i; List <IndexedGraph> ret = new List <IndexedGraph>(); Vertex[] newVertex = new Vertex[g2._vertexes.Length + 1], originalVertex = g2._vertexes; originalVertex.CopyTo(newVertex, 0); newVertex[newVertex.Length - 1] = new Vertex(); g2._vertexes = newVertex; for (int j = 0; j < g1._vertexes.Length; j++) { Vertex v = g1._vertexes[j]; if (v._vLabel.Length == 0) { continue; } int[] restLabels = new int[v._vLabel.Length - 1], originalLabels = v._vLabel; v._vLabel = restLabels; for (i = 0; i < restLabels.Length; i++) { restLabels[i] = originalLabels[i + 1]; } for (i = 0; i < originalLabels.Length; i++) { if (i >= 1) { restLabels[i - 1] = originalLabels[i - 1]; } VLabel vlabel = new VLabel(); vlabel._vid = j; vlabel._vlid = originalLabels[i]; ret.AddRange(GetAllJoins(g1, g2, vlabel)); } v._vLabel = originalLabels; } if (g1._edges.Length > 0) { Edge[] restEdges = new Edge[g1._edges.Length - 1], originalEdges = g1._edges; g1._edges = restEdges; for (i = 0; i < restEdges.Length; i++) { restEdges[i] = originalEdges[i]; } Edge laste = originalEdges[originalEdges.Length - 1]; Vertex lastv1 = g1._vertexes[laste._from], lastv2 = g1._vertexes[laste._to]; for (int j = 0; j < originalEdges.Length; j++) { if (j < originalEdges.Length - 1) { restEdges[j] = originalEdges[originalEdges.Length - 1]; } Edge e = originalEdges[j]; Vertex v1 = g1._vertexes[e._from], v2 = g1._vertexes[e._to]; int[] restOutEdge = new int[v1._outEdge.Length - 1], restInEdge = new int[v2._inEdge.Length - 1], originalOutEdge = v1._outEdge, originalInEdge = v2._inEdge; i = 0; foreach (int eid in originalOutEdge) { if (eid != j) { restOutEdge[i++] = eid; } } v1._outEdge = restOutEdge; i = 0; foreach (int eid in originalInEdge) { if (eid != j) { restInEdge[i++] = eid; } } v2._inEdge = restInEdge; int[] restOutEdgeLast, restInEdgeLast, originalOutEdgeLast = lastv1._outEdge, originalInEdgeLast = lastv2._inEdge; if (j < originalEdges.Length - 1) { restOutEdgeLast = new int[lastv1._outEdge.Length]; restInEdgeLast = new int[lastv2._inEdge.Length]; for (i = 0; i < lastv1._outEdge.Length; i++) { if (lastv1._outEdge[i] == originalEdges.Length - 1) { restOutEdgeLast[i] = j; } else { restOutEdgeLast[i] = lastv1._outEdge[i]; } } lastv1._outEdge = restOutEdgeLast; for (i = 0; i < lastv2._inEdge.Length; i++) { if (lastv2._inEdge[i] == originalEdges.Length - 1) { restInEdgeLast[i] = j; } else { restInEdgeLast[i] = lastv2._inEdge[i]; } } lastv2._inEdge = restInEdgeLast; } ret.AddRange(GetAllJoins(g1, g2, e)); if (j < originalEdges.Length - 1) { restEdges[j] = originalEdges[j]; lastv1._outEdge = originalOutEdgeLast; lastv2._inEdge = originalInEdgeLast; } v1._outEdge = originalOutEdge; v2._inEdge = originalInEdge; } g1._edges = originalEdges; } g2._vertexes = originalVertex; for (i = 0; i < ret.Count; i++) { Graph g = ret[i]; if (g._vertexes[g._vertexes.Length - 1].Isolated()) { Vertex[] newV = new Vertex[g._vertexes.Length - 1]; for (int j = 0; j < newV.Length; j++) { newV[j] = g._vertexes[j]; } g._vertexes = newV; } } return(ret); }
List <int> GetSupportedVertex(Graph pattern, IndexedGraph data) { List <int> ret = new List <int>(); return(ret); }
public FrequentNeighborhoodMining(IndexedGraph g) { _g = g; _subGTester = new SubGraphTest(); _niindex = new NodeInvariantIndex(_g); }
public SupportCounter(IndexedGraph db) { _g = db; _niindex = new NodeInvariantIndex(db); }
public List <Tuple <IndexedGraph, List <int> > > MineEgonet(int minSupp, int maxSize, int maxRadius, int[] constraintVSet) { //bool useVIDList = false; List <int> constraintVSetList = constraintVSet.ToList(); DateTime begin = DateTime.Now; //FrequentPathMining fpm = new FrequentPathMiningDepth(); FrequentPathMining fpm = new FrequentPathMiningBreadth(); fpm.Init(_g, minSupp, maxSize, constraintVSet, true, maxRadius); //fpm.Init(_g, minSupp, maxSize); Console.WriteLine("{0} seconds. {1} path results.", (DateTime.Now - begin).TotalSeconds, fpm._resultCache.Count); List <Tuple <IndexedGraph, List <int> > > ret = new List <Tuple <IndexedGraph, List <int> > >(); Console.WriteLine("Adding {0} paths.", fpm.GetPathAndVID(1).Count); List <Tuple <IndexedGraph, List <int> > > lastResults = fpm.GetPathAndVID(1); ret.AddRange(fpm.GetPathAndVID(1)); //IndexedGraph z = new IndexedGraph(); //z.Read(@"E:\RkNPQ\1.txt"); //SubGraphTest sgt1 = new SubGraphTest(); for (int size = 2; size <= maxSize; size++) { begin = DateTime.Now; Console.WriteLine("Computing Size-{0} Candidate Patterns.", size); List <Tuple <IndexedGraph, List <int> > > tempResults = new List <Tuple <IndexedGraph, List <int> > >(); for (int i = 0; i < lastResults.Count; i++) { for (int j = i; j < lastResults.Count; j++) { List <IndexedGraph> newPatterns = null; List <int> vids = null; if (j == i) { Graph tempG = lastResults[i].Item1.ShallowCopy(); newPatterns = JoinGraphPair(tempG, lastResults[i].Item1); vids = lastResults[i].Item2; } else { vids = Tools.MergeSortedArray(lastResults[i].Item2, lastResults[j].Item2); if (vids.Count < minSupp) { continue; } newPatterns = JoinGraphPair(lastResults[i].Item1, lastResults[j].Item1); } foreach (IndexedGraph pattern in newPatterns) { //if (sgt1.MatchNeighborhood(z, pattern, 0)) //{ // Console.WriteLine(); //} bool hasDup = false; foreach (var pair in tempResults) { if (_subGTester.MatchNeighborhood(pattern, pair.Item1, 0)) { hasDup = true; break; } } if (!hasDup) { tempResults.Add(new Tuple <IndexedGraph, List <int> >(pattern, vids)); } } } } Console.WriteLine("{0} seconds. {1} candidates.", (DateTime.Now - begin).TotalSeconds, tempResults.Count); begin = DateTime.Now; Console.WriteLine("Validating Size-{0} Candidate Patterns.", size); //Compute Zipper Patterns List <Tuple <IndexedGraph, List <int> > > zipperPatterns = new List <Tuple <IndexedGraph, List <int> > >(); if (size > maxRadius + 1 && size <= 2 * maxRadius + 1) { SubGraphTest sgt = new SubGraphTest(true, MapOperationInstances.GetZipperHeads); foreach (var tup in lastResults) { //if(sgt1.MatchNeighborhood(z,tup.Item1,0)) // tup.Item1.Print(); var headPosList = ZipperHandler.DetectPotentialZipper(tup.Item1, maxRadius); if (headPosList == null) { continue; } List <int> vids = null; Dictionary <Tuple <int, int>, List <int> > mapELabel2Vids = new Dictionary <Tuple <int, int>, List <int> >(); vids = tup.Item2; foreach (int i in vids) { sgt.MatchNeighborhood(tup.Item1, _g, i, headPosList); HashSet <Tuple <int, int> > eLabels = new HashSet <Tuple <int, int> >(); sgt._rets.ForEach(e => eLabels.Add((Tuple <int, int>)e)); foreach (var pair in eLabels) { if (!mapELabel2Vids.ContainsKey(pair)) { mapELabel2Vids[pair] = new List <int>(); } mapELabel2Vids[pair].Add(i); } } foreach (var pair in mapELabel2Vids) { if (pair.Value.Count >= minSupp) { Edge newEdge = new Edge(); newEdge._from = headPosList[pair.Key.Item2].Item1; newEdge._to = headPosList[pair.Key.Item2].Item2; newEdge._eLabel = pair.Key.Item1; IndexedGraph g = tup.Item1.ShallowCopy(); Edge[] newEdgeList = new Edge[g._edges.Length + 1]; g._edges.CopyTo(newEdgeList, 0); newEdgeList[newEdgeList.Length - 1] = newEdge; g._edges = newEdgeList; Vertex v1 = g._vertexes[newEdge._from]; int[] newOutEdgeList = new int[v1._outEdge.Length + 1]; v1._outEdge.CopyTo(newOutEdgeList, 0); newOutEdgeList[newOutEdgeList.Length - 1] = newEdgeList.Length - 1; v1._outEdge = newOutEdgeList; Vertex v2 = g._vertexes[newEdge._to]; int[] newInEdgeList = new int[v2._inEdge.Length + 1]; v2._inEdge.CopyTo(newInEdgeList, 0); newInEdgeList[newInEdgeList.Length - 1] = newEdgeList.Length - 1; v2._inEdge = newInEdgeList; g.GenIndex(); zipperPatterns.Add(new Tuple <IndexedGraph, List <int> >(g, pair.Value)); } } } } lastResults.Clear(); foreach (var pair in tempResults) { int supp = 0; List <List <int> > ccands = _niindex.GetCandidatesForeachVertex(pair.Item1); if (ccands.Exists(e => e != null && e.Count == 0)) { continue; } //if (ccands[0].Count < minSupp) //continue; _subGTester._cands = ccands; List <int> vids = null, filteredVids = null; filteredVids = new List <int>(); vids = pair.Item2; foreach (int i in vids) { if (_subGTester.MatchNeighborhood(pair.Item1, _g, i)) { supp++; filteredVids.Add(i); } } _subGTester._cands = null; if (supp >= minSupp) { ret.Add(new Tuple <IndexedGraph, List <int> >(pair.Item1, filteredVids)); //pattern.Print(); //Console.WriteLine(supp+"\n"); lastResults.Add(new Tuple <IndexedGraph, List <int> >(pair.Item1, filteredVids)); } } Console.WriteLine("{0} seconds. {1} results.", (DateTime.Now - begin).TotalSeconds, lastResults.Count); begin = DateTime.Now; if (size <= maxRadius + 1) { var addpath = fpm.GetPathAndVID(size); lastResults.AddRange(addpath); Console.WriteLine("Adding {0} paths.", addpath.Count); //lastResults.Sort((x, y) => x._vertexes.Length - y._vertexes.Length); ret.AddRange(fpm.GetPathAndVID(size)); } else { //add Zipper Patterns Console.WriteLine("Adding {0} Zippers.", zipperPatterns.Count); lastResults.AddRange(zipperPatterns); ret.AddRange(zipperPatterns); } if (lastResults.Count == 0) { break; } } return(ret); }
public IndexedGraph ToIndexedGraph() { IndexedGraph ret = new IndexedGraph(); if (this[this.Count - 1].Item2 == StepType.Nlabel) { ret._vertexes = new Vertex[this.Count]; for (int i = 0; i < ret._vertexes.Length; i++) { ret._vertexes[i] = new Vertex(); } ret._vertexes[this.Count - 1]._vLabel = new int[1] { this[this.Count - 1].Item1 }; ret._edges = new Edge[this.Count - 1]; for (int i = 0; i < this.Count - 1; i++) { Edge e = new Edge(); e._eLabel = this[i].Item1; if (this[i].Item2 == StepType.Forward) { e._from = i; e._to = i + 1; } else { e._to = i; e._from = i + 1; } ret._edges[i] = e; if (i == 0) { if (this[0].Item2 == StepType.Forward) { ret._vertexes[0]._outEdge = new int[1] { 0 } } ; else { ret._vertexes[0]._inEdge = new int[1] { 0 } }; } if (i == this.Count - 2) { if (this[i].Item2 == StepType.Forward) { ret._vertexes[i + 1]._inEdge = new int[1] { i } } ; else { ret._vertexes[i + 1]._outEdge = new int[1] { i } }; } else { if (this[i].Item2 == StepType.Forward) { if (this[i + 1].Item2 == StepType.Forward) { ret._vertexes[i + 1]._inEdge = new int[1] { i }; ret._vertexes[i + 1]._outEdge = new int[1] { i + 1 }; } else { ret._vertexes[i + 1]._inEdge = new int[2] { i, i + 1 }; } } else { if (this[i + 1].Item2 == StepType.Forward) { ret._vertexes[i + 1]._outEdge = new int[2] { i, i + 1 } } ; else { ret._vertexes[i + 1]._inEdge = new int[1] { i + 1 }; ret._vertexes[i + 1]._outEdge = new int[1] { i }; } } } } } else { ret._vertexes = new Vertex[this.Count + 1]; for (int i = 0; i < ret._vertexes.Length; i++) { ret._vertexes[i] = new Vertex(); } ret._edges = new Edge[this.Count]; for (int i = 0; i < this.Count; i++) { Edge e = new Edge(); e._eLabel = this[i].Item1; if (this[i].Item2 == StepType.Forward) { e._from = i; e._to = i + 1; } else { e._to = i; e._from = i + 1; } ret._edges[i] = e; if (i == 0) { if (this[0].Item2 == StepType.Forward) { ret._vertexes[0]._outEdge = new int[1] { 0 } } ; else { ret._vertexes[0]._inEdge = new int[1] { 0 } }; } if (i == this.Count - 1) { if (this[i].Item2 == StepType.Forward) { ret._vertexes[i + 1]._inEdge = new int[1] { i } } ; else { ret._vertexes[i + 1]._outEdge = new int[1] { i } }; } else { if (this[i].Item2 == StepType.Forward) { if (this[i + 1].Item2 == StepType.Forward) { ret._vertexes[i + 1]._inEdge = new int[1] { i }; ret._vertexes[i + 1]._outEdge = new int[1] { i + 1 }; } else { ret._vertexes[i + 1]._inEdge = new int[2] { i, i + 1 }; } } else { if (this[i + 1].Item2 == StepType.Forward) { ret._vertexes[i + 1]._outEdge = new int[2] { i, i + 1 } } ; else { ret._vertexes[i + 1]._inEdge = new int[1] { i + 1 }; ret._vertexes[i + 1]._outEdge = new int[1] { i }; } } } } } ret.GenIndex(); return(ret); } }