def test_jacobian_self(): q = Array((num2, num3)) jac = q.jacobian(q) assert jac[0, 0] == 1 assert jac[0, 1] == 0 assert jac[1, 0] == 0 assert jac[1, 1] == 1
def test_steepest_descent_armijo(): """Should trigger the line search """ initial_guess = Array([Number(2), Number(1)]) _, xstar, _, _ = optimizations.steepest_descent(rosenbrock, initial_guess, iterations=50)
def test_iter(): q = Array((num2, num3)) q_ = [] for el in q: q_.append(el) assert q_ == [num2, num3]
def test_steepest_descent(): initial_guess = Array([Number(1.1), Number(1.1)]) _, xstar, _, _ = optimizations.steepest_descent(bowl, initial_guess, iterations=400) # print(xstar) assert xstar[0].val == pytest.approx(1, abs=1e-3) assert xstar[1].val == pytest.approx(1, abs=1e-3)
def inner_func(*args, **kwargs): # Check if args[0] has len. If so, apply the function elementwise and return an array # rather than a Number try: value = func(*args, **kwargs) deriv = deriv_func(*args, **kwargs) return Number(value, deriv) except AttributeError: vals = [func(element, *args[1:], **kwargs) for element in args[0]] derivs = [deriv_func(element, *args[1:], **kwargs) for element in args[0]] numbers = [Number(val, deriv) for val, deriv in zip(vals, derivs)] return Array(numbers)
def test_str(): q = Array((num2, num3)) assert str(q) == '[Number(val=2) Number(val=3)]'
def test_indexing(): q = Array((num2, num3)) assert q[0] == num2
def test_mul_array(): q = Array((num2, num3)) w = q * q assert w[0].val == 4 assert w[1].val == 9
def test_len(): q = Array((num2, num3)) assert len(q) == 2
def test_radd_scalar(): q = Array((num2, num3)) w = 2 + q assert w[0].val == 4 assert w[1].val == 5
def test_rsub_scalar(): q = Array((num2, num3)) w = 10 - q assert w[0].val == 8 assert w[1].val == 7
def test_array_converts_to_number(): q = Array((Number(0), 0)) assert q[0].val == 0 assert q[1].val == 0
def test_add(): q = Array((num2, num3)) w = q + q assert w[0].val == 4 assert w[1].val == 6
def test_array_func(): q = Array((Number(0), Number(1))) w = operations.exp(q) assert w[0].val == pytest.approx(1) assert w[1].val == pytest.approx(np.exp(1))
def test_jacobian_scalar(): q = Array((num2, num3)) jac = q.jacobian(q[0]) assert jac[0] == 1 assert jac[1] == 0
def test_neg(): q = Array((num2, num3)) w = -q assert w[0].val == -2 assert w[1].val == -3
def test_rpow(): q = Array((num2, num3)) v = [2, 2] w = v**q assert w[0].val == 4 assert w[1].val == 8
def test_pow(): q = Array((num2, num3)) w = q**2 assert w[0].val == 4 assert w[1].val == 9
def test_div_scalar(): q = Array((num2, num3)) w = q / 2 assert w[0].val == pytest.approx(1) assert w[1].val == pytest.approx(3 / 2)
def test_eq(): q = Array((Number(0), 0)) assert q == q
def test_setitem(): q = Array((num2, num3)) q[0] = num2 assert q[0] == num2
def test_repr(): q = Array((num2, num3)) assert repr(q) == 'Array([Number(val=2) Number(val=3)])'
def test_add_scalar(): q = Array((num2, num3)) w = q + 1 assert w[0].val == 3 assert w[1].val == 4
def test_rdiv(): q = Array((num2, num3)) w = 12 / q assert w[0].val == pytest.approx(6) assert w[1].val == pytest.approx(4)
def test_sub_array(): q = Array((num2, num3)) w = q - q assert w[0].val == 0 assert w[1].val == 0
def test_neq(): q = Array((Number(0), 0)) w = Array((Number(0), 1)) assert q != w
def test_sub_scalar(): q = Array((num2, num3)) w = q - 1 assert w[0].val == 1 assert w[1].val == 2
def test_dot(): q = Array((Number(0), 0)) assert q.dot(q).val == 0
def test_neq_mixed(): q = Array((Number(0), 0)) assert q != 'a' assert q != 1
def test_array_only_number(): q = Array((num2, num2)) with pytest.raises(ValueError): q[0] = 1