Spaces:
Runtime error
Runtime error
| """Round-2 refine — prompt bias and dimension inference.""" | |
| from __future__ import annotations | |
| REFINE_SEEDS = (789, 1011) | |
| DIM_SUFFIX = { | |
| "semantic": "emphasis on subject and scene content, clear semantic alignment", | |
| "aesthetic": "fine-art aesthetic register, gallery-polished look", | |
| "color_mood": "emphasis on color mood and palette harmony", | |
| } | |
| DIM_SUFFIX_ZH = { | |
| "semantic": "强调主体与场景内容", | |
| "aesthetic": "强调高级艺术感", | |
| "color_mood": "强调色调与色板统一", | |
| } | |
| def infer_priority_dim(user_idx: int, scores: list[dict]) -> str: | |
| """Which dimension the user's pick scores highest on.""" | |
| user = scores[user_idx] | |
| return max(("semantic", "aesthetic", "color_mood"), key=lambda k: user[k]) | |
| def infer_gap_dim(user_idx: int, ai_idx: int, scores: list[dict]) -> str: | |
| """Dimension where user and AI disagree most.""" | |
| user = scores[user_idx] | |
| ai = scores[ai_idx] | |
| user_best = infer_priority_dim(user_idx, scores) | |
| ai_best = max(("semantic", "aesthetic", "color_mood"), key=lambda k: ai[k]) | |
| if user_best != ai_best: | |
| return user_best | |
| gaps = {d: abs(user[d] - ai[d]) for d in ("semantic", "aesthetic", "color_mood")} | |
| return max(gaps, key=gaps.get) | |
| def build_refine_prompt(base_prompt: str, user_idx: int, ai_idx: int, scores: list[dict]) -> str: | |
| """Append English bias suffix for SD 1.5 Round 2.""" | |
| dim = infer_gap_dim(user_idx, ai_idx, scores) | |
| suffix = DIM_SUFFIX.get(dim, DIM_SUFFIX["semantic"]) | |
| base = (base_prompt or "").strip() | |
| if not base: | |
| return suffix | |
| return f"{base}, {suffix}" | |
| def compute_dimension_weights(votes: list[dict]) -> dict[str, float]: | |
| """Aggregate dimension emphasis from vote records.""" | |
| totals = {"semantic": 0.0, "aesthetic": 0.0, "color_mood": 0.0} | |
| if not votes: | |
| return {k: round(1 / 3, 3) for k in totals} | |
| for v in votes: | |
| scores = v.get("scores") or [] | |
| idx = v.get("user_idx", 0) | |
| if idx < len(scores): | |
| row = scores[idx] | |
| for d in totals: | |
| totals[d] += row.get(d, 0) | |
| s = sum(totals.values()) or 1.0 | |
| return {k: round(v / s, 3) for k, v in totals.items()} | |