"""Multi-label metrics, archived independently of dataset/runtime imports.""" import numpy as np def classification_metrics(targets, predicted, names): """Compute multi-label metrics directly; no optional compiled metrics library.""" actual = targets.astype(bool) tp = (actual & predicted).sum(axis=0) fp = (~actual & predicted).sum(axis=0) fn = (actual & ~predicted).sum(axis=0) def divide(a, b): return np.divide(a, b, out=np.zeros_like(a, dtype=float), where=b != 0) precision = divide(tp, tp + fp) recall = divide(tp, tp + fn) f1 = divide(2 * tp, 2 * tp + fp + fn) denom = int(2 * tp.sum() + fp.sum() + fn.sum()) return {"micro_f1": float(2 * tp.sum() / denom) if denom else 0.0, "macro_f1": float(f1.mean()), "per_label": {name: {"precision": float(precision[i]), "recall": float(recall[i]), "f1": float(f1[i]), "support": int(actual[:, i].sum())} for i, name in enumerate(names)}}