func search(c *command) { c.assertLeastNArg(2) // Some search options don't translate directly to command line parameters // specified by the flag package. if flagSearchDesc { flagSearchOpts.Order = bowdb.OrderDesc } switch flagSearchSort { case "cosine": flagSearchOpts.SortBy = bowdb.SortByCosine case "euclid": flagSearchOpts.SortBy = bowdb.SortByEuclid default: util.Fatalf("Unknown sort field '%s'.", flagSearchSort) } db := util.OpenBowDB(c.flags.Arg(0)) bowPaths := c.flags.Args()[1:] _, err := db.ReadAll() util.Assert(err, "Could not read BOW database entries") // always hide the progress bar here. bows := util.ProcessBowers(bowPaths, db.Lib, false, flagCpu, true) out, outDone := outputter() // launch goroutines to search queries in parallel wgSearch := new(sync.WaitGroup) for i := 0; i < flagCpu; i++ { wgSearch.Add(1) go func() { defer wgSearch.Done() for b := range bows { sr := db.Search(flagSearchOpts, b) out <- searchResult{b, sr} } }() } wgSearch.Wait() close(out) <-outDone util.Assert(db.Close()) }
func mkBowDb(c *command) { c.assertLeastNArg(3) dbPath := c.flags.Arg(0) flib := util.Library(c.flags.Arg(1)) bowPaths := c.flags.Args()[2:] util.AssertOverwritable(dbPath, flagOverwrite) db, err := bowdb.Create(flib, dbPath) util.Assert(err) bows := util.ProcessBowers(bowPaths, flib, false, flagCpu, util.FlagQuiet) for b := range bows { db.Add(b) } util.Assert(db.Close()) }
func vectors(c *command) { c.assertLeastNArg(2) flib := util.Library(c.flags.Arg(0)) bowPaths := c.flags.Args()[1:] tostrs := func(freqs []float32) []string { strs := make([]string, len(freqs)) for i := range freqs { strs[i] = strconv.FormatFloat(float64(freqs[i]), 'f', -1, 32) } return strs } results := util.ProcessBowers(bowPaths, flib, flagPairdistModels, flagCpu, true) for r := range results { fmt.Printf("%s\t%s\n", r.Id, strings.Join(tostrs(r.Bow.Freqs), "\t")) } }
func pairdist(c *command) { c.assertLeastNArg(2) flib := util.Library(c.flags.Arg(0)) bowPaths := c.flags.Args()[1:] bows := make([]bow.Bowed, 0, 1000) results := util.ProcessBowers(bowPaths, flib, flagPairdistModels, flagCpu, util.FlagQuiet) for r := range results { bows = append(bows, r) } for i := 0; i < len(bows); i++ { b1 := bows[i] for j := i + 1; j < len(bows); j++ { b2 := bows[j] dist := math.Abs(b1.Bow.Cosine(b2.Bow)) fmt.Printf("%s\t%s\t%0.4f\n", b1.Id, b2.Id, dist) } } }