from util import *
from math import floor
from copy import deepcopy

class Popularity:

    def __init__(self,data):
        self.distanceMatrix = []
        for RowInstance in data:
            row = []
            for ColumnInstance in data:
                row.append(distance(RowInstance,ColumnInstance))
            self.distanceMatrix.append(row)
            del row

        self.NearestNeighbor = []
        for RowInstance in self.distanceMatrix:
            NeighborRow = []
            copiedRow = deepcopy(RowInstance)
            copiedRow.sort()
            for item in RowInstance:
                NeighborRow.append(copiedRow.index(item) + 1)
            self.NearestNeighbor.append(NeighborRow)
            del NeighborRow,copiedRow

        self.TransposeNearestNeighbor = transpose(deepcopy(self.NearestNeighbor))
        self.Popularity = []
        for num in range(len(self.TransposeNearestNeighbor)):
            Nearest = 0
            for place in self.TransposeNearestNeighbor[num]:
                if place == 2:
                    Nearest = Nearest + 1
            self.Popularity.append([data[num],Nearest])
            del Nearest

        self.Popularity.sort(key=lambda instance: instance[1])
        self.Popularity.reverse()
            
    def RatioToZero(self):
        Zeros = 0
        for item in self.Popularity:
            if item[1] == 0:
                Zeros = Zeros + 1
        Else = len(self.Popularity) - Zeros
        return float(Zeros) / float(Else)

    def NonZeroRatios(self):
        Results = []
        length = float(len(self.Popularity))
        for item in self.Popularity:
            if item[1] != 0:
                Results.append( (float(item[1]) / length) * 100 )
        return Results

    def GetWholeSet(self):
        Results = []
        for item in self.Popularity:
            Results.append(item[0])
        return Results

    def MostPopularSet(self,percent):
        num = int(floor(len(self.Popularity) * percent))
        Results = []
        for item in self.Popularity[0:num]:
            Results.append(item[0])
        return Results

    def MostPopular(self):
        return self.Popularity[0][0]
        
