func writePattern(count int, outDir string, embeddings, patterns io.Writer, nodeAttrs *bptree.BpTree, all store.Findable, key []byte) { patDir := EmptyDir(path.Join(outDir, fmt.Sprintf("%d", count))) patDot := path.Join(patDir, "pattern.dot") patVeg := path.Join(patDir, "pattern.veg") patName := path.Join(patDir, "pattern.name") patCount := path.Join(patDir, "count") instDir := EmptyDir(path.Join(patDir, "instances")) i := 0 for _, sg, next := all.Find(key)(); next != nil; _, sg, next = next() { if i == 0 { fmt.Fprintln(patterns, "//", sg.Label()) fmt.Fprintln(patterns) fmt.Fprintln(patterns, sg.String()) fmt.Fprintln(embeddings, "//", sg.Label()) fmt.Fprintln(embeddings) if pat, err := os.Create(patDot); err != nil { log.Fatal(err) } else { fmt.Fprintln(pat, sg.String()) pat.Close() } if name, err := os.Create(patName); err != nil { log.Fatal(err) } else { fmt.Fprintln(name, sg.Label()) name.Close() } if veg, err := os.Create(patVeg); err != nil { log.Fatal(err) } else { veg.Write(sg.VEG(nil)) veg.Close() } } curDir := EmptyDir(path.Join(instDir, fmt.Sprintf("%d", i))) emDot := path.Join(curDir, "embedding.dot") emVeg := path.Join(curDir, "embedding.veg") if nodeAttrs != nil { attrs := make(map[int]map[string]interface{}) for _, v := range sg.V { bid := make([]byte, 4) binary.BigEndian.PutUint32(bid, uint32(v.Id)) err := nodeAttrs.DoFind( bid, func(key, value []byte) error { a, err := graph.ParseJson(value) if err != nil { log.Fatal(err) } attrs[v.Id] = a return nil }) if err != nil { log.Fatal(err) } } fmt.Fprintln(embeddings, sg.StringWithAttrs(attrs)) if em, err := os.Create(emDot); err != nil { log.Fatal(err) } else { fmt.Fprintln(em, sg.StringWithAttrs(attrs)) em.Close() } if veg, err := os.Create(emVeg); err != nil { log.Fatal(err) } else { veg.Write(sg.VEG(attrs)) veg.Close() } } else { fmt.Fprintln(embeddings, sg.String()) if em, err := os.Create(emDot); err != nil { log.Fatal(err) } else { fmt.Fprintln(em, sg.String()) em.Close() } if veg, err := os.Create(emVeg); err != nil { log.Fatal(err) } else { veg.Write(sg.VEG(nil)) veg.Close() } } i++ } if c, err := os.Create(patCount); err != nil { log.Fatal(err) } else { fmt.Fprintln(c, i) c.Close() } fmt.Fprintln(patterns) fmt.Fprintln(patterns) fmt.Fprintln(embeddings) fmt.Fprintln(embeddings) }