Description:
        Top m - 1 alternatives m(m - 1) + 2m moment conditions objective function
    Parameters:
        params:  all parameters for the Plackett-Luce mixture model (numpy ndarray)
        moments: values of the moment conditions from the data (numpy ndarray)

def top3_full(params, moments):
    """
    Description:
        Top m - 1 alternatives m(m - 1) + 2m moment conditions objective function
    Parameters:
        params:  all parameters for the Plackett-Luce mixture model (numpy ndarray)
        moments: values of the moment conditions from the data (numpy ndarray)
    """
    #variables
    params = np.asarray(params) #convert numpy matrix to list
    alpha = params[0] #first parameter is the alpha value
    half = int((len(params) - 1) / 2) #assuming 2 mixtures
    a = params[1:half + 1] #first mixture
    b = params[half + 1:] #second mixture
    p = np.asarray(moments) #convert numpy matrix to list
    p1 = list(alpha*a+(1-alpha)*b-p[:half]) #new list with one element
    p2 = [] #new empty list

    #iterate through each 
    for i in range(0, half):
        #alpha times the score of a given point in mixture one, mutiplied by
            #each of the other scores, divided by the sum of the other values
        #Each of these top two plackett-luce values is added to the same values
            #from the other mixture, then the moment value is subtracted for those
            #top two from the vote
        p1 += list(alpha*a[i]*np.hstack((a[:i],a[i + 1:]))/(1-a[i])
            +(1-alpha)*b[i]*np.hstack((b[:i],b[i + 1:]))/(1-b[i])
            -p[half + (half - 1) * i:half + (half - 1) * (i + 1)])

    #iterate through each value in each mixture
    for i in range(0, half):
        #begin with alpha values for given mixture
        num_a = alpha
        num_b = 1 - alpha

        #iterate again
        for j in range(0, half):
            #this eventually multiplies all values to its alpha
            num_a *= a[j]
            num_b *= b[j]
            #divide by the sum of other values
            if j > i:
                num_a /= np.sum(np.concatenate((a[j:], a[:i])))
                num_b /= np.sum(np.concatenate((b[j:], b[:i])))
            elif j < i:
                num_a /= np.sum(a[j:i])
                num_b /= np.sum(b[j:i])
        p2.append(num_a + num_b - p[half + (half * (half - 1)) + i])
    p3 = np.array(p2)
    #create one array
    allp = np.concatenate((p1,p3))
    return np.sum(allp**2)