def main():
    from   bootstrapping_olympics.extra.reprep import ReprepPublisher

    N = 20
    K = 2

    # M = np.random.rand(N, N, K)
    M = np.zeros((K, N, N))
    for i, j in itertools.product(range(N), range(N)):
        if i <= j:
            M[:, i, j] = 0
        else:
            M[:, i, j] = np.random.rand(K)

    M[:, :, :] = 0
    M[0, 5, 10] = 1
    M[1, 15, 10] = -1

    bds = BDSEstimator2()

    y_mean = np.random.rand(N)
    A = np.random.randn(N, N)
    T = 10000

    Au = np.random.randn(K, K)

    error_M = []
    error_M2 = []
    for t in range(T):
        u = np.dot(Au, np.random.randn(K))
#        if (T - 1) % 100 == 0:
#            u = 0 * u
        y = y_mean + np.dot(A, np.random.randn(N))
        y_dot = bds_dynamics(M, y, u)
        dt = 0.1
        bds.update(y=y, y_dot=y_dot, u=u, dt=dt)

        if t > T / 2:
            bds.fits1.reset()
            bds.fits2.reset()

        if t % 100 == 0:
            Mest = bds.get_M()
            e = np.abs(M - Mest).mean()
            error_M.append(e)
            Mest2, M2info = bds.get_M2() #@UnusedVariable
            e2 = np.abs(M - Mest2).mean()
            error_M2.append(e2)
            sys.stderr.write('%8d/%d %-10.5g %-10.5g  \n' % (t, T, e, e2))
            pass

    rp = ReprepPublisher('bds_estimator_test_learn')
    Mest = bds.get_M()

    Merr = np.abs(M - Mest)
    bds.publish(rp)

    for i in range(K):
        rp.array_as_image('M%s' % i, M[i, :, :])

    for i in range(K):
        rp.array_as_image('est_M%s' % i, Mest[i, :, :])

    for i in range(K):
        rp.array_as_image('Merr%s' % i, Merr[i, :, :])

    with rp.plot('error') as pylab:
        pylab.semilogy(np.array(error_M), 'x')
        pylab.semilogy(np.array(error_M2), 'ro')
        pylab.axis((0, len(error_M), 0, max(error_M) * 1.1))
    rp.r.to_html('bds_estimator_test_learn.html')