',
f'{_e(title)}
',
f''
f'{_e(note)}
',
f''
f'{_e(slot_label)} : '
f'{_e(varying_slot)} '
f''
f'{n_runs} runs, {n_groups} {_e(h_groups.lower())}'
f'
',
'',
'',
]
for col in (h_value, h_mean, h_stdev, h_rank, h_n_obs):
parts.append(
f'| '
f'{_e(col)} | '
)
parts.append("
")
# Tri par rang moyen ascendant
rows = sorted(
per_value.items(),
key=lambda kv: (kv[1].get("mean_rank") or float("inf")),
)
for value, d in rows:
mean = d.get("mean")
stdev = d.get("stdev")
rank = d.get("mean_rank")
n_obs = int(d.get("n_observations") or 0)
if isinstance(mean, (int, float)):
color = _bg_for_relative_score(
float(mean), low, high, higher_is_better,
)
mean_cell = (
f'{_format_score(mean)} | '
)
else:
mean_cell = (
'— | '
)
stdev_str = (
f"± {_format_score(stdev)}"
if isinstance(stdev, (int, float)) else "—"
)
rank_str = f"{rank:.2f}" if isinstance(rank, (int, float)) else "—"
marker = ""
if value == best:
marker = ' ★'
elif value == worst:
marker = ' ▼'
parts.append(
f''
f'| '
f'{_e(str(value))}{marker} | '
f'{mean_cell}'
f'{stdev_str} | '
f'{rank_str} | '
f'{n_obs} | '
f'
'
)
parts.append("
")
return "".join(parts)
__all__ = ["build_incremental_comparison_html"]