33 lines
1.3 KiB
Python
Executable File
33 lines
1.3 KiB
Python
Executable File
def calc_confidence_3way(top_prob: float) -> float:
|
|
"""Returns the true win probability percentage (e.g. 0.45 -> 45.0)."""
|
|
return max(0, min(99.0, top_prob * 100))
|
|
|
|
def calc_confidence_2way(prob: float) -> float:
|
|
"""Returns the true win probability percentage for the favored side."""
|
|
# Find the probability of the >0.5 side
|
|
win_prob = prob if prob >= 0.5 else (1.0 - prob)
|
|
return max(0, min(99.0, win_prob * 100))
|
|
|
|
def calc_confidence_dc(top_prob: float) -> float:
|
|
"""Returns the true win probability percentage for double chance."""
|
|
return max(0, min(99.0, top_prob * 100))
|
|
|
|
def calc_confidence_3way_with_agreement(top_prob: float, agreement_ratio: float,
|
|
boost: float = 1.05, penalty: float = 0.95) -> float:
|
|
"""
|
|
Returns the true win probability percentage, slightly adjusted by engine consensus.
|
|
|
|
Args:
|
|
top_prob: highest probability among options
|
|
agreement_ratio: 0.0 to 1.0 — how many engines agree on the pick
|
|
"""
|
|
base = calc_confidence_3way(top_prob)
|
|
|
|
# Slight nudge rather than massive swing, to keep it feeling like a true probability
|
|
if agreement_ratio >= 0.75:
|
|
return min(99.0, base * boost)
|
|
elif agreement_ratio <= 0.25:
|
|
return max(0.0, base * penalty)
|
|
|
|
return base
|