def METHOD_NAME(algo, dim, n_jobs=None):
    from sklearn.manifold import TSNE, Isomap, LocallyLinearEmbedding, MDS, SpectralEmbedding
    from sklearn.decomposition import TruncatedSVD, DictionaryLearning, FactorAnalysis, FastICA, KernelPCA, PCA, \
        LatentDirichletAllocation
    # manifold
    if algo == 'TSNE': return TSNE(n_components=dim, n_jobs=n_jobs)
    if algo == 'ISOMAP': return Isomap(n_components=dim, n_jobs=n_jobs)
    if algo == 'LLE': return LocallyLinearEmbedding(n_components=dim, n_jobs=n_jobs)
    if algo == 'Spectral Embedding': return SpectralEmbedding(n_components=dim, n_jobs=n_jobs)
    if algo == 'MDS': return MDS(n_components=dim, n_jobs=n_jobs)
    # Matrix Decomposition
    if algo == 'PCA': return PCA(n_components=dim)  # No hyper
    if algo == 'SVD aka LSA': return TruncatedSVD(n_components=dim)  # No hyper
    if algo == 'DictionaryLearning': return DictionaryLearning(n_components=dim, n_jobs=n_jobs)
    if algo == 'FactorAnalysis': return FactorAnalysis(n_components=dim)  # no hyper
    if algo == 'FastICA': return FastICA(n_components=dim)  # no hyper
    if algo == 'KernelPCA': return KernelPCA(n_components=dim, n_jobs=n_jobs)
    # not applicable because negative values, todo we could just take absolute values of all embeds..
    if algo == 'LatentDirichletAllocation': return LatentDirichletAllocation(n_components=dim)
    # if algo =='NMF': return NMF(n_components=dim)