diff options
Diffstat (limited to 'pkg/signal/signal.go')
| -rw-r--r-- | pkg/signal/signal.go | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/pkg/signal/signal.go b/pkg/signal/signal.go index a22d19f67..ffa27ce97 100644 --- a/pkg/signal/signal.go +++ b/pkg/signal/signal.go @@ -146,7 +146,7 @@ type Context struct { func Minimize(corpus []Context) []any { type ContextPrio struct { prio prioType - idx int + idx []int } covered := make(map[elemType]ContextPrio) for i, inp := range corpus { @@ -154,14 +154,35 @@ func Minimize(corpus []Context) []any { if prev, ok := covered[e]; !ok || p > prev.prio { covered[e] = ContextPrio{ prio: p, - idx: i, + idx: []int{i}, + } + } else if prev := covered[e]; p == prev.prio { + covered[e] = ContextPrio{ + prio: p, + idx: append(prev.idx, i), } } } } indices := make(map[int]struct{}, len(corpus)) for _, cp := range covered { - indices[cp.idx] = struct{}{} + if len(cp.idx) == 1 { + indices[cp.idx[0]] = struct{}{} + } + } + for _, cp := range covered { + if len(cp.idx) != 1 { + alreadyCovered := false + for pc := range cp.idx { + if _, ok := indices[pc]; ok { + alreadyCovered = true + break + } + } + if !alreadyCovered { + indices[cp.idx[0]] = struct{}{} + } + } } result := make([]any, 0, len(indices)) for idx := range indices { |
