def check_dot3(x, M): def g(x): return 5 * x**3 + 3 * x def f(x): return g(dot(M, x)) dg = g(forward.seed(dot(M, x))).dvalue check_general(None, x, f, dot(dg, M))
def check_dot2(x, M): def g(x): return 5 * x**3 + 3 * x dg = g(forward.seed(x)).dvalue def f(x): return dot(M, g(x)) check_general(None, x, f, dot(M, dg))
def test_vector_scalar(): for x in [-3, 3]: for y in [np.ones(0), np.ones(1), np.ones(2), np.linspace(0, 1, 3)]: df2d = np.atleast_2d(df(x)) dv = np.atleast_2d(np.zeros_like(y)).transpose() dgxy2d = g(forward.seed(x) * y).dvalue.todense() yield check_general, None, x, lambda x: stack(f(x), y), csr_matrix(np.vstack((df2d, dv))) yield check_general, None, x, lambda x: stack(y, f(x)), csr_matrix(np.vstack((dv, df2d))) yield check_general, None, x, lambda x: stack(f(x), g(x * y)), csr_matrix(np.vstack((df2d, dgxy2d))) yield check_general, None, x, lambda x: stack(g(x * y), f(x)), csr_matrix(np.vstack((dgxy2d, df2d)))
def test_vector_scalar(x, y): df2d = np.atleast_2d(df(x)) dv = np.atleast_2d(np.zeros_like(y)).transpose() dgxy2d = g(forward.seed(x) * y).dvalue.toarray() check_general(x, lambda x: stack(f(x), y), csr_matrix(np.vstack( (df2d, dv)))) check_general(x, lambda x: stack(y, f(x)), csr_matrix(np.vstack( (dv, df2d)))) check_general(x, lambda x: stack(f(x), g(x * y)), csr_matrix(np.vstack((df2d, dgxy2d)))) check_general(x, lambda x: stack(g(x * y), f(x)), csr_matrix(np.vstack((dgxy2d, df2d))))
def test_sparsesum(): idx, v = sparsesum(10, [(0, 1), (0, 1), (3, -1)], return_sparse=True) assert (idx == np.asarray([0, 3])).all() assert (v == np.asarray([2., -1.])).all() x = forward.seed(np.linspace(0, 1, 11)) idx, d = sparsesum( 20, [(np.arange(11), x), (np.arange(11), x)], return_sparse=True) assert (idx == np.arange(11)).all() assert (d.gradient.diagonal() == 2.).all() d = sparsesum(1, [(np.zeros(2, dtype=int), np.ones(2)), (np.zeros(1, dtype=int), np.ones(1))]) assert d == 3
def check_general(msg, x, f, grad): y = f(forward.seed(x)) dy = grad assert_almost_equal(y.value, f(x)) _check_grad(y.dvalue, dy)
def check_vector_scalar(msg, x, v, f, df): y = f(forward.seed(x), v) assert_almost_equal(y.value, f(x, v)) assert y.dvalue.shape == (len(y.value), 1) assert_almost_equal(np.asarray(y.dvalue.todense()).flatten(), df(x, v))
def check_vector(msg, x, f, df): y = f(forward.seed(x)) d = np.atleast_1d(df(x) * np.ones_like(y.value)) dy = scipy.sparse.spdiags(d, 0, len(d), len(d), format='csr') assert_almost_equal(y.value, f(x)) _check_grad(y.dvalue, dy)
def check_scalar(msg, x, f, df): y = f(forward.seed(x)) assert_almost_equal(y.value, f(x)) assert_almost_equal(y.dvalue, df(x))
def test_array_priority(): x = np.zeros(5) g = np.zeros(5) assert isinstance(forward.seed(x) * g, forward.value) assert isinstance(g * forward.seed(x), forward.value)
def check_vector_scalar(x, v, f, df): y = f(forward.seed(x), v) assert_almost_equal(y.value, f(x, v)) assert y.dvalue.shape == (len(y.value), 1) assert_almost_equal(y.dvalue.toarray().ravel(), df(x, v))
def check_scalar(x, f, df): y = f(forward.seed(x)) # Direct comparison is avoided to avoid problem if x+0.j != x-0.j assert_equal(y.value - f(x), 0) deriv = df(x) assert_almost_equal(y.dvalue, deriv)