#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Jun 15 10:06:44 2018

@author: jaques
"""


import numpy as np
import matplotlib.pyplot as plt

def roleta(individuo):
    r=np.random.rand() #seleciona um valor no intervalo de 0 a 1
    
    fitness=np.array(list(individuo.values()))#transforma os valores das chaves em um array (vetor linha)
    prbAc=np.cumsum(fitness)/np.sum(fitness)  #probabilidade acumulada = SomaAcumulada / SomaTotal
    #i=np.where(prbAc>r)[0][0] #mesmo resultado que o comentario abaixo, só que mais lento
    
    #toma o primeiro indice de prbAc que é maior que r
    i=np.argmax(prbAc>r) #prbAc>r resulta em uma lista com True (1) e False (0). Neste caso, argmax 
                         #retorna o indice do primeiro True
       
    labels=list(individuo.keys())    #uma lista com as chaves
    explode=np.zeros(len(individuo)) #distancia de separação entre os pedaços da pizza
    explode[i]=0.2  #destaca o pedaço roletado
    plt.title("Individuo selecionado: "+labels[i])
    plt.pie(fitness,labels=labels,autopct='%1.1f%%',counterclock=False,explode=explode)
    plt.show()  #mostra o grafico
    #print('Individuo roletado: %s ' %(list(individuo.keys())[i]))
    return [i,labels[i]] #retorna uma lista com o índice e a chave

#---------------------------------------------------------------------------------------------------
#
#---------------------------------------------------------------------------------------------------    
 #se foi chamado por linha de comando ou executado. Exemplo: "$python roletando.py"
if __name__=='__main__': 
    #dicionario com chaves Si e valores
    individuo={'S1': 2.4, 'S2': 3.1, 'S3': 2.5, 'S4': 0.5, 'S5': 8.3, 'S6': 2.0}
    [i,s]=roleta(individuo)
#else:  #se chamado com import
#    print(__name__)    #imprimiria roletando

#Exemplo:   
#import roletando as rl
#individuo={'S1': 2.4, 'S2': 3.1, 'S3': 2.5, 'S4': 0.5, 'S5': 8.3, 'S6': 2.0}
#rl.roleta(individuo)