import numpy as np


def mean_squared_error(y, t):
    return 0.5 * np.sum((y - t) ** 2)


def cross_entropy_error(y, t):
    delta = 1e-7
    return -np.sum(t * np.log(y + delta))


# FIXME ちょっとうまくいかないしよくわからない
def labeled_cross_entropy_error(y, t):
    print(y, t)
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)

    batch_size = y.shape[0]
    print(y[np.arange(batch_size), t])
    print(np.log(y[np.arange(batch_size), t]))
    return -np.sum(np.log(y[np.arange(batch_size), t])) / batch_size


if __name__ == '__main__':
    t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
    y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
    print(mean_squared_error(np.array(y), np.array(t)))
    print(cross_entropy_error(np.array(y), np.array(t)))

    y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.5, 0.0]
    print(mean_squared_error(np.array(y), np.array(t)))
    print(cross_entropy_error(np.array(y), np.array(t)))

    import sys, os

    sys.path.append(os.pardir)
    from dataset.mnist import load_mnist

    (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=False)
    train_size = x_train.shape[0]
    batch_size = 10
    batch_mask = np.random.choice(train_size, batch_size)
    x_batch = x_train[batch_mask]
    t_batch = t_train[batch_mask]
    print(labeled_cross_entropy_error(x_batch, t_batch))
