#!/usr/bin/python

import random
import os

p = []

algorithm = "eg1"
randomSeed = 1
horizon = 1000
epsilon = 0.8
numRuns = 1000
totalReward = 0

bestIdentifiedArm = -1

def getArmToPull(numArms, successes, trials, algorithm, horizon, epsilon):

    global bestIdentifiedArm

    totalTrials = 0
    for a in range(0, numArms):
        if(trials[a] == 0):
            return a
        totalTrials += trials[a]

    maxArm = 0
    maxX = successes[0] * 1.0 / trials[0]
    for a in range(1, numArms):
        x = successes[a] * 1.0 / trials[a]
        if(x > maxX):
            maxArm = a
            maxX = x

    armToPull = -1
    if(algorithm == "eg1"):
        if(totalTrials < epsilon * horizon):
            armToPull = random.randint(0, numArms - 1)
        else:
            if(bestIdentifiedArm == -1):
                bestIdentifiedArm = maxArm
            armToPull = bestIdentifiedArm
    elif(algorithm == "eg2"):
        if(totalTrials < epsilon * horizon):
            armToPull = random.randint(0, numArms - 1) 
        else:
            armToPull = maxArm
    elif(algorithm == "eg3"):
        x = random.random()
        if(x < epsilon):
            armToPull = random.randint(0, numArms - 1) 
        else:
            armToPull = maxArm

    return armToPull


f = open("biases.txt")
biases = f.readlines()
numArms = len(biases)
for b in range(0, numArms):
    p.append(float(biases[b]))
f.close()

random.seed(randomSeed)

outcomes= []
for r in range(0, numRuns):
    outcomesR = []
    for a in range(0, numArms):
        outcomesRA = []
        for t in range(0, horizon):
            reward = 0
            x = random.random()
            if(x < p[a]):
                reward = 1
            outcomesRA.append(reward)
        outcomesR.append(outcomesRA)
    outcomes.append(outcomesR)


for r in range(0, numRuns):
    successes = []
    trials = []
    for a in range(0, numArms):
        successes.append(0)
        trials.append(0)

    for t in range(0, horizon):
        arm = getArmToPull(numArms, successes, trials, algorithm, horizon, epsilon)


        successes[arm] += outcomes[r][arm][trials[arm]]

        totalReward += outcomes[r][arm][trials[arm]]

        trials[arm] += 1

rewardPerRun = totalReward * 1.0 / numRuns

print str(algorithm) + " gets average reward per run = " + str(rewardPerRun)
