def test_cardinality(self):
        def delannoy(m, n):
            s = 0
            for k in range(min(m, n) + 1):
                s += binom(m, k) * binom(n, k) * 2**k
            return s

        for size_X in (1, 2, 3):
            for size_Y in (1, 2, 3, 4):
                card = cardinality(size_X, size_Y)
                card2 = len(list(alignment_matrices(size_X, size_Y)))
                assert_equal(card, card2)
                assert_equal(card, delannoy(size_X - 1, size_Y - 1))
    def test_mean_cost_grad(self):
        X, Y = _make_time_series(size_X=3, size_Y=4, num_dim=2)
        C = squared_euclidean_cost(X, Y)

        A_sum = np.zeros_like(C)
        n = 0
        for A in alignment_matrices(*C.shape):
            A_sum += A
            n += 1
        A_mean1 = A_sum / n
        A_mean2 = mean_cost_value_and_grad_C(C)[1]

        assert_array_almost_equal(A_mean1, A_mean2)

        G = _num_gradient(mean_cost_C, A_sum)  # Any matrix can be used.
        assert_array_almost_equal(A_mean1, G)
    def test_mean_cost(self):
        X, Y = _make_time_series(size_X=3, size_Y=4, num_dim=2)
        C = squared_euclidean_cost(X, Y)

        scores = []
        for A in alignment_matrices(*C.shape):
            scores.append(np.vdot(A, C))
        val1 = np.mean(scores)
        val2 = mean_cost_C(C)
        val3 = mean_cost_value_and_grad_C(C)[0]
        val4 = mean_cost(X, Y)
        val5 = mean_cost_value_and_grad(X, Y)[0]
        assert_almost_equal(val1, val2)
        assert_almost_equal(val1, val3)
        assert_almost_equal(val1, val4)
        assert_almost_equal(val1, val5)
def _expectation_brute_force(C, gamma=1.0):
    p = _probas(C, gamma=gamma)
    E = np.zeros_like(C)
    for i, A in enumerate(alignment_matrices(*C.shape)):
        E += p[i] * A
    return E
def _probas(C, gamma=1.0):
    scores = []
    for A in alignment_matrices(*C.shape):
        scores.append(np.vdot(A, C))
    scores = np.array(scores)
    return softmax(-scores / gamma)
def _sdtw_brute_force(C, gamma=1.0):
    scores = []
    for A in alignment_matrices(*C.shape):
        scores.append(np.vdot(A, C))
    scores = np.array(scores)
    return -gamma * logsumexp(-scores / gamma)