# Path: sklearn/utils/validation.py
# def check_array(array, accept_sparse=None, dtype=None, order=None, copy=False,
#                 force_all_finite=True, ensure_2d=True, allow_nd=False):
#     """Input validation on an array, list, sparse matrix or similar.
# 
#     By default, the input is converted to an at least 2nd numpy array.
# 
#     Parameters
#     ----------
#     array : object
#         Input object to check / convert.
# 
#     accept_sparse : string, list of string or None (default=None)
#         String[s] representing allowed sparse matrix formats, such as 'csc',
#         'csr', etc.  None means that sparse matrix input will raise an error.
#         If the input is sparse but not in the allowed format, it will be
#         converted to the first listed format.
# 
#     dtype : string, type or None (default=none)
#         Data type of result. If None, the dtype of the input is preserved.
# 
#     order : 'F', 'C' or None (default=None)
#         Whether an array will be forced to be fortran or c-style.
# 
#     copy : boolean (default=False)
#         Whether a forced copy will be triggered. If copy=False, a copy might
#         be triggered by a conversion.
# 
#     force_all_finite : boolean (default=True)
#         Whether to raise an error on np.inf and np.nan in X.
# 
#     ensure_2d : boolean (default=True)
#         Whether to make X at least 2d.
# 
#     allow_nd : boolean (default=False)
#         Whether to allow X.ndim > 2.
# 
#     Returns
#     -------
#     X_converted : object
#         The converted and validated X.
#     """
#     if isinstance(accept_sparse, str):
#         accept_sparse = [accept_sparse]
# 
#     if sp.issparse(array):
#         array = _ensure_sparse_format(array, accept_sparse, dtype, order,
#                                       copy, force_all_finite)
#     else:
#         if ensure_2d:
#             array = np.atleast_2d(array)
#         array = np.array(array, dtype=dtype, order=order, copy=copy)
#         if not allow_nd and array.ndim >= 3:
#             raise ValueError("Found array with dim %d. Expected <= 2" %
#                              array.ndim)
#         if force_all_finite:
#             _assert_all_finite(array)
# 
#     return array
# 
# Path: sklearn/utils/validation.py
# def check_random_state(seed):
#     """Turn seed into a np.random.RandomState instance
# 
#     If seed is None, return the RandomState singleton used by np.random.
#     If seed is an int, return a new RandomState instance seeded with seed.
#     If seed is already a RandomState instance, return it.
#     Otherwise raise ValueError.
#     """
#     if seed is None or seed is np.random:
#         return np.random.mtrand._rand
#     if isinstance(seed, (numbers.Integral, np.integer)):
#         return np.random.RandomState(seed)
#     if isinstance(seed, np.random.RandomState):
#         return seed
#     raise ValueError('%r cannot be used to seed a numpy.random.RandomState'
#                      ' instance' % seed)


import numpy as np
from scipy import linalg
from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform
from ..base import BaseEstimator
from ..utils import check_array
from ..utils import check_random_state
from ..utils.extmath import _ravel
from ..decomposition import RandomizedPCA
from ..metrics.pairwise import pairwise_distances
from . import _utils
        Using t-SNE. Journal of Machine Learning Research 9:2579-2605, 2008.

    [2] van der Maaten, L.J.P. t-Distributed Stochastic Neighbor Embedding
        http://homepage.tudelft.nl/19j49/t-SNE.html
    """
    def __init__(self, n_components=2, perplexity=30.0,
                 early_exaggeration=4.0, learning_rate=1000.0, n_iter=1000,
                 metric="euclidean", init="random", verbose=0,
                 random_state=None):
        if init not in ["pca", "random"]:
            raise ValueError("'init' must be either 'pca' or 'random'")
        self.n_components = n_components
        self.perplexity = perplexity
        self.early_exaggeration = early_exaggeration
        self.learning_rate = learning_rate
        self.n_iter = n_iter
        self.metric = metric
        self.init = init
        self.verbose = verbose
        self.random_state = random_state

    def _fit(self, X):
        """Fit the model using X as training data.

        Parameters
        ----------
        X : array, shape (n_samples, n_features) or (n_samples, n_samples)
            If the metric is 'precomputed' X must be a square distance
            matrix. Otherwise it contains a sample per row.
        """

# Path: sklearn/utils/validation.py
# def check_array(array, accept_sparse=None, dtype=None, order=None, copy=False,
#                 force_all_finite=True, ensure_2d=True, allow_nd=False):
#     """Input validation on an array, list, sparse matrix or similar.
# 
#     By default, the input is converted to an at least 2nd numpy array.
# 
#     Parameters
#     ----------
#     array : object
#         Input object to check / convert.
# 
#     accept_sparse : string, list of string or None (default=None)
#         String[s] representing allowed sparse matrix formats, such as 'csc',
#         'csr', etc.  None means that sparse matrix input will raise an error.
#         If the input is sparse but not in the allowed format, it will be
#         converted to the first listed format.
# 
#     dtype : string, type or None (default=none)
#         Data type of result. If None, the dtype of the input is preserved.
# 
#     order : 'F', 'C' or None (default=None)
#         Whether an array will be forced to be fortran or c-style.
# 
#     copy : boolean (default=False)
#         Whether a forced copy will be triggered. If copy=False, a copy might
#         be triggered by a conversion.
# 
#     force_all_finite : boolean (default=True)
#         Whether to raise an error on np.inf and np.nan in X.
# 
#     ensure_2d : boolean (default=True)
#         Whether to make X at least 2d.
# 
#     allow_nd : boolean (default=False)
#         Whether to allow X.ndim > 2.
# 
#     Returns
#     -------
#     X_converted : object
#         The converted and validated X.
#     """
#     if isinstance(accept_sparse, str):
#         accept_sparse = [accept_sparse]
# 
#     if sp.issparse(array):
#         array = _ensure_sparse_format(array, accept_sparse, dtype, order,
#                                       copy, force_all_finite)
#     else:
#         if ensure_2d:
#             array = np.atleast_2d(array)
#         array = np.array(array, dtype=dtype, order=order, copy=copy)
#         if not allow_nd and array.ndim >= 3:
#             raise ValueError("Found array with dim %d. Expected <= 2" %
#                              array.ndim)
#         if force_all_finite:
#             _assert_all_finite(array)
# 
#     return array
# 
# Path: sklearn/utils/validation.py
# def check_random_state(seed):
#     """Turn seed into a np.random.RandomState instance
# 
#     If seed is None, return the RandomState singleton used by np.random.
#     If seed is an int, return a new RandomState instance seeded with seed.
#     If seed is already a RandomState instance, return it.
#     Otherwise raise ValueError.
#     """
#     if seed is None or seed is np.random:
#         return np.random.mtrand._rand
#     if isinstance(seed, (numbers.Integral, np.integer)):
#         return np.random.RandomState(seed)
#     if isinstance(seed, np.random.RandomState):
#         return seed
#     raise ValueError('%r cannot be used to seed a numpy.random.RandomState'
#                      ' instance' % seed)


# Path: sklearn/manifold/t_sne.py
import numpy as np
from scipy import linalg
from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform
from ..base import BaseEstimator
from ..utils import check_array
from ..utils import check_random_state
from ..utils.extmath import _ravel
from ..decomposition import RandomizedPCA
from ..metrics.pairwise import pairwise_distances
from . import _utils

        Using t-SNE. Journal of Machine Learning Research 9:2579-2605, 2008.

    [2] van der Maaten, L.J.P. t-Distributed Stochastic Neighbor Embedding
        http://homepage.tudelft.nl/19j49/t-SNE.html
    """
    def __init__(self, n_components=2, perplexity=30.0,
                 early_exaggeration=4.0, learning_rate=1000.0, n_iter=1000,
                 metric="euclidean", init="random", verbose=0,
                 random_state=None):
        if init not in ["pca", "random"]:
            raise ValueError("'init' must be either 'pca' or 'random'")
        self.n_components = n_components
        self.perplexity = perplexity
        self.early_exaggeration = early_exaggeration
        self.learning_rate = learning_rate
        self.n_iter = n_iter
        self.metric = metric
        self.init = init
        self.verbose = verbose
        self.random_state = random_state

    def _fit(self, X):
        """Fit the model using X as training data.

        Parameters
        ----------
        X : array, shape (n_samples, n_features) or (n_samples, n_samples)
            If the metric is 'precomputed' X must be a square distance
            matrix. Otherwise it contains a sample per row.
        """

        X = check_array(X, accept_sparse=['csr', 'csc', 'coo'])