import autograd.numpy as np
import autograd.numpy.random as npr
from autograd.test_util import check_grads
from autograd import dict as ag_dict, isinstance as ag_isinstance
from autograd import grad
import operator as op
npr.seed(0)
def test_getter():
def fun(input_dict):
A = np.sum(input_dict['item_1'])
B = np.sum(input_dict['item_2'])
C = np.sum(input_dict['item_2'])
return A + B + C
d_fun = grad(fun)
input_dict = {'item_1' : npr.randn(5, 6),
'item_2' : npr.randn(4, 3),
'item_X' : npr.randn(2, 4)}
result = d_fun(input_dict)
assert np.allclose(result['item_1'], np.ones((5, 6)))
assert np.allclose(result['item_2'], 2 * np.ones((4, 3)))
assert np.allclose(result['item_X'], np.zeros((2, 4)))
def test_grads():
def fun(input_dict):
A = np.sum(np.sin(input_dict['item_1']))
B = np.sum(np.cos(input_dict['item_2']))
return A + B
def d_fun(input_dict):
g = grad(fun)(input_dict)
A = np.sum(g['item_1'])
B = np.sum(np.sin(g['item_1']))
C = np.sum(np.sin(g['item_2']))
return A + B + C
input_dict = {'item_1' : npr.randn(5, 6),
'item_2' : npr.randn(4, 3),
'item_X' : npr.randn(2, 4)}
check_grads(fun)(input_dict)
check_grads(d_fun)(input_dict)
def test_iter():
def fun(input_dict):
A = 0.
B = 0.
for i, k in enumerate(sorted(input_dict)):
A = A + np.sum(np.sin(input_dict[k])) * (i + 1.0)
B = B + np.sum(np.cos(input_dict[k]))
return A + B
def d_fun(input_dict):
g = grad(fun)(input_dict)
A = np.sum(g['item_1'])
B = np.sum(np.sin(g['item_1']))
C = np.sum(np.sin(g['item_2']))
return A + B + C
input_dict = {'item_1' : npr.randn(5, 6),
'item_2' : npr.randn(4, 3),
'item_X' : npr.randn(2, 4)}
check_grads(fun)(input_dict)
check_grads(d_fun)(input_dict)
def test_items_values_keys():
def fun(input_dict):
A = 0.
B = 0.
for i, (k, v) in enumerate(sorted(input_dict.items(), key=op.itemgetter(0))):
A = A + np.sum(np.sin(v)) * (i + 1.0)
B = B + np.sum(np.cos(v))
for v in input_dict.values():
A = A + np.sum(np.sin(v))
for k in sorted(input_dict.keys()):
A = A + np.sum(np.cos(input_dict[k]))
return A + B
def d_fun(input_dict):
g = grad(fun)(input_dict)
A = np.sum(g['item_1'])
B = np.sum(np.sin(g['item_1']))
C = np.sum(np.sin(g['item_2']))
return A + B + C
input_dict = {'item_1' : npr.randn(5, 6),
'item_2' : npr.randn(4, 3),
'item_X' : npr.randn(2, 4)}
check_grads(fun)(input_dict)
check_grads(d_fun)(input_dict)
def test_get():
def fun(d, x):
return d.get('item_1', x)**2
check_grads(fun, argnum=(0, 1))({'item_1': 3.}, 2.)
check_grads(fun, argnum=(0, 1))({'item_2': 4.}, 2.)
check_grads(fun, argnum=(0, 1))({}, 2.)
def test_make_dict():
def fun(x):
return ag_dict([('a', x)], b=x)
check_grads(fun, modes=['rev'])(1.0)
def fun(x):
return ag_dict({'a': x})
check_grads(fun, modes=['rev'])(1.0)
# check some other forms of the constructor
ag_dict()
ag_dict(())
ag_dict({})
def test_isinstance():
def fun(x):
assert ag_isinstance(x, dict)
assert ag_isinstance(x, ag_dict)
return x['x']
fun({'x': 1.})
grad(fun)({'x': 1.})