def debug(folders, n_components, r = None, max_dimension = 1):
    X,y = load_dataset(folders)
    p = Preprocess(n_components)
    X = p.fit_transform(X)
    
    if r is None:
        distances = PairwiseDistances(X.tolist())
        distances = ExplicitDistances(distances)
        n_samples = len(X)
        r_candidates = sorted(set(np.array(distances.distances).flatten()))
        for r2 in r_candidates:
            print r2
            cx = vietoris_rips(X.tolist(), max_dimension, r2)
            cords = mds_plot(X, y)
            lines_plot(cx, cords)
            plt.show()
    else:
        cx = vietoris_rips(X.tolist(), max_dimension, r)
        actual_max_dimension = len(max(cx, key=len)) - 1
        for d in range(actual_max_dimension, 2, -1):
            sx_d = filter_simplices(cx, d)
            print "dimension", d, ":", len(sx_d), "simplices"
            for i, sx in enumerate(sx_d):
                print i, "..."
                cords = mds_plot(X, y)
                edges = list(combinations(sx, 2))
                lines_plot(edges, cords, color=np.random.rand(3,))
                plt.show()
def prepare_data(dataset, pca_n):
    global n_classes, X, y, pp, X_tr, X_inv
    n_classes = len(dataset)
    X, y = load_dataset(dataset)
    pp = Preprocess(pca_n)
    X_tr = pp.fit_transform(X)
    X_inv = pp.inverse_transform(X_tr)
    ax = plt.axes([0., 0., 1., 1.])
    color_set = 'bgrcmykw'
    colors = [color_set[int(t)] for t in target]
    plt.scatter(coords[:, 0], coords[:, 1], marker='o', s=200, c=colors)

    return coords

def lines_plot(lines, cords, color='r'):
    lines = [line for line in lines if len(line) == 2]
    for line in lines:
        if len(line) != 2: continue
        [p1,p2] = line
        plt.plot([cords[p1, 0], cords[p2, 0]], [cords[p1, 1], cords[p2, 1]], color=color)

if __name__ == '__main__':
    from dataset import load_dataset
    from preprocess import Preprocess, NoScaler
    from sklearn.preprocessing import StandardScaler

    X,Y = load_dataset(['../data/cup', '../data/paper', '../data/pen'])
    cords = mds_plot(X, Y)
    plt.savefig('./mds_no_preprocessing.png')

    p = Preprocess(0.75)#, NoScaler())
    X = p.fit_transform(X)
    cords = mds_plot(X, Y, fig=2)
    plt.savefig('./mds_preprocessing.png')
    #lines = [[1,2],[2,3],[3,1]]
    #lines_plot(lines, cords)
    #plt.show()
from preprocess import Preprocess

def vietoris_rips(points, skeleton, max, distances = None):
    """
    Generate the Vietoris-Rips complex on the given set of points in 2D.
    Only simplexes up to dimension skeleton are computed.
    The max parameter denotes the distance cut-off value.
    The distances parameter can be used to precompute distances.
    """

    if distances is None:
        distances = PairwiseDistances(points)

    rips = Rips(distances)

    simplices = Filtration()
    rips.generate(skeleton, max, simplices.append)
    return [list(simplex.vertices) for simplex in simplices]

if __name__ == '__main__':
    from dataset import load_dataset
    x,y = load_dataset(['../data/tea_cup', '../data/spoon', '../data/apple'])

    p = Preprocess(0.7)
    x = p.fit_transform(x)

    # vietoris_rips expect a python list.
    x = x.tolist()
    s = vietoris_rips(x, 4, 500)
    print s