def test_negative_binomial_gradient_sparse_dispersed():
    n = 10
    random_state = np.random.RandomState(42)
    X = random_state.rand(n, 3)
    dis = euclidean_distances(X)
    alpha, beta = -3, 1

    fdis = beta * dis**alpha
    fdis[np.isinf(fdis)] = 0
    dispersion_estimated = fdis + fdis ** 2
    p = fdis / (fdis + dispersion_estimated)

    # counts = random_state.negative_binomial(dispersion, 1 - p)
    # counts = np.triu(counts)
    counts = np.triu(fdis)
    counts[np.arange(len(counts)), np.arange(len(counts))] = 0
    counts = sparse.coo_matrix(counts, dtype=float)

    _, mean, variance, _ = dispersion.compute_mean_variance(
        counts,
        np.array([counts.shape[0]]))
    mean, variance = mean[:-1], variance[:-1]
    d = dispersion.ExponentialDispersion()
    d.fit(mean, variance)

    gradient_sparse = negative_binomial_structure.negative_binomial_gradient(
        X, counts, dispersion=d)
    gradient_dense = negative_binomial_structure.negative_binomial_gradient(
        X, counts.toarray(), dispersion=d)

    assert_array_almost_equal(gradient_dense, gradient_sparse)
    assert_array_almost_equal(
       np.zeros(gradient_sparse.shape), gradient_sparse, -5)
def test_negative_binomial_gradient_sparse_dispersed():
    n = 10
    random_state = np.random.RandomState(42)
    X = random_state.rand(n, 3)
    dis = euclidean_distances(X)
    alpha, beta = -3, 1

    fdis = beta * dis**alpha
    fdis[np.isinf(fdis)] = 1
    dispersion = fdis + fdis ** 2
    p = fdis / (fdis + dispersion)

    counts = random_state.negative_binomial(dispersion, 1 - p)
    counts = np.triu(counts)
    counts[np.arange(len(counts)), np.arange(len(counts))] = 0
    counts = sparse.coo_matrix(counts, dtype=float)
    return True
    # from minorswing import dispersion
    mean, variance = dispersion.compute_mean_variance(
        counts,
        np.array([counts.shape[0]]))
    mean, variance = mean[:-1], variance[:-1]
    d = dispersion.DispersionPolynomial()
    d.fit(mean, variance)

    gradient_sparse = negative_binomial_structure.negative_binomial_gradient(
        X, counts, dispersion=d)
def test_negative_binomial_gradient_sparse():
    n = 10
    random_state = np.random.RandomState(42)
    X = random_state.rand(n, 3)
    dis = euclidean_distances(X)
    alpha, beta = -3, 1

    counts = beta * dis ** alpha
    counts = np.triu(counts)
    counts[np.arange(len(counts)), np.arange(len(counts))] = 0
    counts = sparse.coo_matrix(counts)

    gradient_sparse = negative_binomial_structure.negative_binomial_gradient(
        X, counts)

    rand_X = random_state.randn(*X.shape)
    assert_array_almost_equal(np.zeros(gradient_sparse.shape), gradient_sparse)

    rand_grad_sparse = negative_binomial_structure.negative_binomial_gradient(
        rand_X, counts)
    rand_grad_dense = negative_binomial_structure.negative_binomial_gradient(
        rand_X, counts.toarray())
    assert_array_almost_equal(rand_grad_sparse, rand_grad_dense)
def test_negative_binomial_gradient_sparse():
    n = 10
    random_state = np.random.RandomState(42)
    X = random_state.rand(n, 3)
    dis = euclidean_distances(X)
    alpha, beta = -3, 1

    counts = beta * dis ** alpha
    counts = np.triu(counts)
    counts[np.arange(len(counts)), np.arange(len(counts))] = 0
    counts = sparse.coo_matrix(counts)

    gradient_sparse = negative_binomial_structure.negative_binomial_gradient(
        X, counts)
    assert_array_almost_equal(np.zeros(gradient_sparse.shape), gradient_sparse)