""" Eval metrics and related


Further hacked by  
"""

def accuracy(output, target, topk=(1,), mean=True):
    """Computes the accuracy over the k top predictions for the specified values of k"""
    maxk = min(max(topk), output.size()[1])
    batch_size = target.size(0)
    _, pred = output.topk(maxk, 1, True, True)
    pred = pred.t()
    correct = pred.eq(target.reshape(1, -1).expand_as(pred))
    if mean:
        return [correct[:min(k, maxk)].reshape(-1).float().sum(0) * 100. / batch_size for k in topk]
    else:
        return [correct[:min(k, maxk)].reshape(-1).float().sum(0) for k in topk]
