def run(centroids,data_pnts,k,outfile_1,outfile_2 = None):
    old_centroids = np.empty(centroids.shape)
    count = 0
    # plt.figure()

    # Iterate until convergence
    # print centroids
    total_cost = []
    while (not is_stop(old_centroids,centroids,count)):
        old_centroids = centroids
        # dic maps centroids with data points
        temp = assign_centroids(data_pnts,centroids,k)
        dic  = temp[0]
        cost = temp[1]
        centroids = gen_new_centroids(dic)
        total_cost.append([cost,count])

        count +=1

    # outputs iteration graph
    # plt.savefig(outfile_1)

    # outputs final graph, with all scatter points
    if outfile_2:
        utils.plot_final(dic,outfile_2)

    return total_cost
def run(data_pnts,k):
    '''Runs the whole program'''
    package = initialize(data_pnts,k)
    count = 0
    old_package = None

    while not converges(package,count,data_pnts,k,old_package):
        old_package = package
        dic = e_step(data_pnts,k,package)
        package = m_step(data_pnts,k,dic)

        count += 1
    final_dic = form_clusters(dic,data_pnts)
    utils.plot_final(final_dic,"gmm.png")

    return (final_dic,dic)