function generateFailures(actualColorFilter) {
let rows = html`
<div class="failure title">
<h2>Actual: <em>${actualColorFilter}</em></h2>
</div>
<div class="failure header">
<div class="rgb">RGB values</div>
<div class="color-sample">Predicted</div>
<div class="color-sample">Actual</div>
<div class="prob">P<sub>white</sub></div>
<div class="prob">P<sub>green</sub></div>
<div class="prob">P<sub>yellow</sub></div>
</div>`;
for (const { X, predicted_color, actual_color, probabilities } of failures) {
if (actualColorFilter && actual_color !== actualColorFilter) {
continue;
}
const [probW, probG, probY] = probabilities;
const rgb = X.map(x => x * 255);
const row = html`
<div class="failure">
<div class="rgb">${X.map(v => v.toFixed(3)).join(", ")}</div>
<div class="color-sample" style="background-color: rgb(${rgb.join(", ")}); color: ${isDark(rgb) ? "white" : "black"}">${predicted_color}</div>
<div class="color-sample" style="background-color: rgb(${rgb.join(", ")}); color: ${isDark(rgb) ? "white" : "black"}">${actual_color}</div>
<div class="prob">${probW.toFixed(3)}</div>
<div class="prob">${probG.toFixed(3)}</div>
<div class="prob">${probY.toFixed(3)}</div>
</div>`
rows = html`${rows}${row}`;
}
return rows;
}