Spaces:
Sleeping
Sleeping
File size: 3,673 Bytes
6ceaa94 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | """Before/after image comparison module."""
from typing import Dict, Any, List, Tuple, Optional
from scoring.engine import ScoreResponse
def compare_scores(original: ScoreResponse, revised: ScoreResponse) -> Dict[str, Any]:
"""
Compare two scored images and produce delta analysis.
Returns dict with:
original_overall, revised_overall, delta_overall,
improvements, regressions, next_recommendations, all_deltas
"""
orig_scores = original.sub_scores
rev_scores = revised.sub_scores
# Compute deltas
all_deltas = {}
for key in orig_scores:
if key in rev_scores:
all_deltas[key] = round(rev_scores[key] - orig_scores[key], 1)
# Identify improvements (>5) and regressions (<-5)
MEANINGFUL = 5.0
improvements = [(k, v) for k, v in all_deltas.items() if v > MEANINGFUL]
regressions = [(k, v) for k, v in all_deltas.items() if v < -MEANINGFUL]
# Sort by magnitude
improvements.sort(key=lambda x: -x[1])
regressions.sort(key=lambda x: x[1])
# Next recommendations: weakest sub-scores in revised version
# Exclude improvement_potential
filtered_rev = {k: v for k, v in rev_scores.items() if k != "improvement_potential"}
next_targets = sorted(filtered_rev.items(), key=lambda x: x[1])[:3]
# Build next recommendations
readable_names = {
"concept_match": "Concept Match",
"visual_focus": "Visual Focus",
"readability": "Readability",
"complexity_balance": "Complexity Balance",
"communication_clarity": "Communication Clarity",
"neural_richness": "Neural Richness",
"memorability_proxy": "Memorability",
}
next_recommendations = []
for name, score in next_targets:
readable = readable_names.get(name, name)
next_recommendations.append({
"sub_score": name,
"current_score": score,
"message": f"Further improve {readable.lower()} (currently {score:.0f}/100) — this is your weakest remaining dimension."
})
return {
"original_overall": round(original.overall_score, 1),
"revised_overall": round(revised.overall_score, 1),
"delta_overall": round(revised.overall_score - original.overall_score, 1),
"improvements": improvements[:5],
"regressions": regressions[:5],
"next_recommendations": next_recommendations,
"all_deltas": all_deltas,
}
def format_comparison_result(result: Dict[str, Any]) -> str:
"""Format comparison result as human-readable text."""
lines = []
orig = result["original_overall"]
rev = result["revised_overall"]
delta = result["delta_overall"]
if delta > 0:
lines.append(f"📈 Overall improved: {orig:.0f} → {rev:.0f} (+{delta:.0f} points)")
elif delta < 0:
lines.append(f"📉 Overall decreased: {orig:.0f} → {rev:.0f} ({delta:.0f} points)")
else:
lines.append(f"➡️ Overall unchanged: {orig:.0f} → {rev:.0f}")
if result["improvements"]:
lines.append("\n✅ Improvements:")
for name, val in result["improvements"]:
lines.append(f" • {name}: +{val:.0f} points")
if result["regressions"]:
lines.append("\n⚠️ Regressions:")
for name, val in result["regressions"]:
lines.append(f" • {name}: {val:.0f} points")
if result["next_recommendations"]:
lines.append("\n📋 Next recommended edits:")
for rec in result["next_recommendations"]:
lines.append(f" • {rec['message']}")
return "\n".join(lines)
|