146
147
// Compute log-posterior for each candidate culprit commit
148
>
logWeights := make([]float64, N)
bisect.go
149
>
for i, o := range obs {
150
>
kBefore := prefixFails[i]
151
>
nBefore := prefixPasses[i] + prefixFails[i]
152
>
kAfter := totalFails - kBefore
153
>
nAfter := totalObs - nBefore
154
>
155
>
logWeights[i] = math.Log(o.Prior) +
156
>
logBetaBinomial(nBefore, kBefore, 1, 1) +
157
>
logBetaBinomial(nAfter, kAfter, 1, 1)
158
>
}
159
160
>
probs := logSumExpNormalize(logWeights)
bisect.go
161
>
162
>
results := make([]BisectResult, N)
163
>
for i, o := range obs {
164
>
results[i] = BisectResult{
165
>
CommitSHA: o.CommitSHA,
166
>
CommitIdx: o.CommitIdx,
167
>
Probability: probs[i],
168
>
FailsBefore: prefixFails[i],
169
>
PassesBefore: prefixPasses[i],
170
>
FailsAfter: totalFails - prefixFails[i],
171
>
PassesAfter: totalPasses - prefixPasses[i],
172
>
CommitTitle: o.CommitSHA, // placeholder; overwritten if heuristics fetch metadata
173
>
HeuristicNote: "",
174
>
}
175
>
}
176
177
>
sort.Slice(results, func(i, j int) bool {
bisect.go
178
>
return results[i].Probability > results[j].Probability
179
>
})
180
>
return results
181
}
182