diff --git a/cmd/gen.go b/cmd/gen.go index b78f69f..90ebd29 100644 --- a/cmd/gen.go +++ b/cmd/gen.go @@ -14,6 +14,9 @@ import ( var fileFlagKey = "file" var colNameKey = "col" +var minDepthKey = "min-depth" +var minLogDepthKey = "min--log-depth" +var maxDepthKey = "max-depth" var genCmd = &cobra.Command{ Use: "gen", @@ -42,7 +45,7 @@ var genCmd = &cobra.Command{ words = append(words, record[colIndex]) } - iroha := lib.NewIroha(words) + iroha := lib.NewIroha(words, &lib.DepthOptions{}) iroha.PrintWordCountMap() iroha.PrintWordByKatakanaMap() rowIndicesList, err := iroha.Search() @@ -112,4 +115,18 @@ func init() { if err := viper.BindPFlag(colNameKey, genCmd.Flags().Lookup(colNameKey)); err != nil { panic(err) } + if err := registerIntToFlags(genCmd, minDepthKey, -1, "min depth"); err != nil { + panic(err) + } + if err := registerIntToFlags(genCmd, maxDepthKey, -1, "max depth"); err != nil { + panic(err) + } + if err := registerIntToFlags(genCmd, minLogDepthKey, 0, "min log depth"); err != nil { + panic(err) + } +} + +func registerIntToFlags(cmd *cobra.Command, name string, value int, usage string) error { + cmd.Flags().Int(name, value, usage) + return viper.BindPFlag(name, cmd.Flags().Lookup(name)) } diff --git a/lib/iroha.go b/lib/iroha.go index 8c31d27..ccb1b1a 100644 --- a/lib/iroha.go +++ b/lib/iroha.go @@ -7,21 +7,25 @@ import ( "golang.org/x/sync/errgroup" ) -var logDepthThreshold = 1 -var minParallelDepth = 1 -var maxParallelDepth = 2 - type Iroha struct { katakanaBitsMap KatakanaBitsMap katakana *Katakana log *Log + depths *DepthOptions +} + +type DepthOptions struct { + MaxLog int + MinParallel int + MaxParallel int } -func NewIroha(words []string) *Iroha { +func NewIroha(words []string, options *DepthOptions) *Iroha { km, _ := newKatakanaBitsMap() return &Iroha{ katakanaBitsMap: km, katakana: NewKatakana(words), + depths: options, } } @@ -35,7 +39,7 @@ func (i *Iroha) PrintWordByKatakanaMap() { func (i *Iroha) Search() (rowIndicesList [][]int, err error) { katakanaBitsAndWordsList := i.katakana.ListSortedKatakanaBitsAndWords() - i.log = NewLog(katakanaBitsAndWordsList, logDepthThreshold, minParallelDepth) + i.log = NewLog(katakanaBitsAndWordsList, i.depths.MaxLog, i.depths.MinParallel) wordsList, _, err := i.searchByBits(katakanaBitsAndWordsList, WordBits(0)) if err != nil { return nil, err @@ -100,7 +104,7 @@ func (i *Iroha) searchByBits(katakanaBitsAndWords []*KatakanaBitsAndWords, remai depth := int(KatakanaLen) - len(katakanaBitsAndWords) var irohaWordLists [][]*Word - goroutineMode := depth >= minParallelDepth && depth <= maxParallelDepth + goroutineMode := depth >= i.depths.MinParallel && depth <= i.depths.MaxParallel if goroutineMode { eg := errgroup.Group{}