func extensionsFromEmbeddings(dt *Digraph, pattern *subgraph.SubGraph, ei subgraph.EmbIterator, seen map[int]bool) (total int, overlap []map[int]bool, fisEmbs []*subgraph.Embedding, sets []*hashtable.LinearHash, exts types.Set) { if dt.Mode&FIS == FIS { seen = make(map[int]bool) fisEmbs = make([]*subgraph.Embedding, 0, 10) } else { sets = make([]*hashtable.LinearHash, len(pattern.V)) } if dt.Mode&OverlapPruning == OverlapPruning { overlap = make([]map[int]bool, len(pattern.V)) } exts = set.NewSetMap(hashtable.NewLinearHash()) add := validExtChecker(dt, func(emb *subgraph.Embedding, ext *subgraph.Extension) { exts.Add(ext) }) for emb, next := ei(false); next != nil; emb, next = next(false) { seenIt := false for idx, id := range emb.Ids { if fisEmbs != nil { if seen[id] { seenIt = true } } if overlap != nil { if overlap[idx] == nil { overlap[idx] = make(map[int]bool) } overlap[idx][id] = true } if seen != nil { seen[id] = true } if sets != nil { if sets[idx] == nil { sets[idx] = hashtable.NewLinearHash() } set := sets[idx] if !set.Has(types.Int(id)) { set.Put(types.Int(id), emb) } } for _, e := range dt.G.Kids[id] { add(emb, &dt.G.E[e], idx, -1) } for _, e := range dt.G.Parents[id] { add(emb, &dt.G.E[e], -1, idx) } } if fisEmbs != nil && !seenIt { fisEmbs = append(fisEmbs, emb) } total++ } return total, overlap, fisEmbs, sets, exts }
func VertexSets(sgs partition) []*set.MapSet { if len(sgs) == 0 { return make([]*set.MapSet, 0) } sets := make([]*set.MapSet, 0, len(sgs[0].V)) for i := range sgs[0].V { set := set.NewMapSet(set.NewSortedSet(len(sgs))) for j, sg := range sgs { id := types.Int(sg.V[i].Id) if !set.Has(id) { set.Put(id, j) } } sets = append(sets, set) } return sets }
func extensionsFromFreqEdges(dt *Digraph, pattern *subgraph.SubGraph, ei subgraph.EmbIterator, seen map[int]bool) (total int, overlap []map[int]bool, fisEmbs []*subgraph.Embedding, sets []*hashtable.LinearHash, exts types.Set) { if dt.Mode&FIS == FIS { seen = make(map[int]bool) fisEmbs = make([]*subgraph.Embedding, 0, 10) } else { sets = make([]*hashtable.LinearHash, len(pattern.V)) } if dt.Mode&OverlapPruning == OverlapPruning { overlap = make([]map[int]bool, len(pattern.V)) } support := dt.Support() done := make(chan types.Set) go func(done chan types.Set) { exts := make(chan *subgraph.Extension, len(pattern.V)) go func() { hash := set.NewSetMap(hashtable.NewLinearHash()) for ext := range exts { if !pattern.HasExtension(ext) { hash.Add(ext) } } done <- hash close(done) }() for i := range pattern.V { u := &pattern.V[i] for _, e := range dt.Indices.EdgesFromColor[u.Color] { for j := range pattern.V { v := &pattern.V[j] if v.Color == e.TargColor { ep := subgraph.NewExt( subgraph.Vertex{Idx: i, Color: e.SrcColor}, subgraph.Vertex{Idx: j, Color: e.TargColor}, e.EdgeColor) exts <- ep } } ep := subgraph.NewExt( subgraph.Vertex{Idx: i, Color: u.Color}, subgraph.Vertex{Idx: len(pattern.V), Color: e.TargColor}, e.EdgeColor) exts <- ep } for _, e := range dt.Indices.EdgesToColor[u.Color] { ep := subgraph.NewExt( subgraph.Vertex{Idx: len(pattern.V), Color: e.SrcColor}, subgraph.Vertex{Idx: i, Color: u.Color}, e.EdgeColor) exts <- ep } } close(exts) }(done) stop := false for emb, next := ei(stop); next != nil; emb, next = next(stop) { min := -1 seenIt := false for idx, id := range emb.Ids { if fisEmbs != nil { if seen[id] { seenIt = true } } if overlap != nil { if overlap[idx] == nil { overlap[idx] = make(map[int]bool) } overlap[idx][id] = true } if seen != nil { seen[id] = true } if sets != nil { if sets[idx] == nil { sets[idx] = hashtable.NewLinearHash() } set := sets[idx] if !set.Has(types.Int(id)) { set.Put(types.Int(id), emb) } size := set.Size() if min == -1 || size < min { min = size } } } if fisEmbs != nil && !seenIt { fisEmbs = append(fisEmbs, emb) min = len(fisEmbs) } total++ if min >= support { stop = true } } if total < support { return total, overlap, fisEmbs, sets, nil } return total, overlap, fisEmbs, sets, <-done }