## some misc functions for embeddings

try: ## try to import the parallel variation
    from MulticoreTSNE import MulticoreTSNE as TSNE
    import multiprocessing as mp
    parallel_tsne = True
except ImportError:
    try:
        from sklearn.manifold import TSNE
        parallel_tsne = False
    except:
        pass

import pandas as pd
import numpy as np

def get_2d_coordinates_tsne(multinet,output_format="json",verbose=True):

    embedding = multinet.embedding
    X = embedding[0]
    indices = embedding[1]
    if verbose:
        multinet.monitor("Doing the TSNE reduction to 2 dimensions!")
    if parallel_tsne:
        X_embedded = TSNE(n_components=2,n_jobs=mp.cpu_count()).fit_transform(X)
    else:
        X_embedded = TSNE(n_components=2).fit_transform(X)

    dfr = pd.DataFrame(X_embedded,columns=['dim1','dim2'])
    dfr['node_names'] = [n for n in multinet.get_nodes()]
    dfr['node_codes'] = indices
    
    if output_format == "json":
        return dfr.to_json(orient='records')
    
    elif output_format == "dataframe":
        ## pure pandas dataframe
        return dfr
    
    elif output_format == "pos_dict":
        output_dict = {}
        for index, row in dfr.iterrows():
            output_dict[row['node_names']] = ( row['dim1'],row['dim2'])
        return output_dict
    
    else:
        return None

def layout_positions_to_json(position_dict):
    
    outlist = []
    for k,v in position_dict.items():
        outlist.append({node_names:k,dim1:v[0],dim2:v[1]})
    return outlist