func extensionPoint(G *digraph.Digraph, emb *subgraph.Embedding, e *digraph.Edge, src, targ int) *subgraph.Extension { hasTarg := false hasSrc := false var srcIdx int = len(emb.SG.V) var targIdx int = len(emb.SG.V) if src >= 0 { hasSrc = true srcIdx = src } if targ >= 0 { hasTarg = true targIdx = targ } for idx, id := range emb.Ids { if hasTarg && hasSrc { break } if !hasSrc && e.Src == id { hasSrc = true srcIdx = idx } if !hasTarg && e.Targ == id { hasTarg = true targIdx = idx } } return subgraph.NewExt( subgraph.Vertex{Idx: srcIdx, Color: G.V[e.Src].Color}, subgraph.Vertex{Idx: targIdx, Color: G.V[e.Targ].Color}, e.Color) }
func DeserializeExtension(bytes []byte) *subgraph.Extension { srcIdx := int(binary.BigEndian.Uint32(bytes[0:4])) srcColor := int(binary.BigEndian.Uint32(bytes[4:8])) targIdx := int(binary.BigEndian.Uint32(bytes[8:12])) targColor := int(binary.BigEndian.Uint32(bytes[12:16])) color := int(binary.BigEndian.Uint32(bytes[16:20])) return subgraph.NewExt( subgraph.Vertex{Idx: srcIdx, Color: srcColor}, subgraph.Vertex{Idx: targIdx, Color: targColor}, color, ) }
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 }