"""Hypothetical two-proportion planning calculation; no dependencies.
Not Vodafone's sample sizes or baseline conversion rates.
Equal allocation, independent binary outcomes, two-sided alpha .05, power .80.
Normal approximation, no continuity correction or multiple-test adjustment.
"""
from math import ceil, sqrt
from statistics import NormalDist

def per_arm(baseline=.02, relative_uplift=.08, alpha=.05, power=.80):
    target=baseline*(1+relative_uplift)
    if not 0<baseline<target<1: raise ValueError('Expected 0 < baseline < target < 1')
    pooled=(baseline+target)/2
    critical=NormalDist().inv_cdf(1-alpha/2)
    sensitivity=NormalDist().inv_cdf(power)
    return ceil((critical*sqrt(2*pooled*(1-pooled))+sensitivity*sqrt(baseline*(1-baseline)+target*(1-target)))**2/(target-baseline)**2)

if __name__=='__main__':
    print('Hypothetical baseline: 2%; target: 2.16%; equal allocation')
    print('Required observations per arm:',per_arm())
    print('Total observations:',2*per_arm())
