コード例 #1
0
def test_solver_23_reciprocal_lte():
    for c in [1, 3]:
        # Positive
        # 1 / X < 10
        solution = Interval.Ropen(-oo, 0) | Interval.Lopen(Rat(c, 10), oo)
        event = (c / Y) < 10
        assert event.solve() == solution
        # 1 / X <= 10
        solution = Interval.Ropen(-oo, 0) | Interval(Rat(c, 10), oo)
        event = (c / Y) <= 10
        assert event.solve() == solution
        # 1 / X <= sqrt(2)
        solution = Interval.Ropen(-oo, 0) | Interval(c / sympy.sqrt(2), oo)
        event = (c / Y) <= sympy.sqrt(2)
        assert event.solve() == solution
        # Negative.
        # 1 / X < -10
        solution = Interval.open(-Rat(c, 10), 0)
        event = (c / Y) < -10
        assert event.solve() == solution
        # 1 / X <= -10
        solution = Interval.Ropen(-Rat(c, 10), 0)
        event = (c / Y) <= -10
        assert event.solve() == solution
        # 1 / X <= -sqrt(2)
        solution = Interval.Ropen(-c / sympy.sqrt(2), 0)
        event = (c / Y) <= -sympy.sqrt(2)
        assert event.solve() == solution
コード例 #2
0
def test_solver_13():
    # 2*sqrt(|x|**2) - 3 > 10
    solution = Union(
        Interval.open(-oo, -Rat(13, 2)),
        Interval.open(Rat(13, 2), oo))
    event = (2*Sqrt(abs(Y)**2) - 3) > 10
    answer = event.solve()
    assert answer == solution
コード例 #3
0
def test_solver_9_closed():
    # 2(log(x))**3 - log(x) -5 >= 0
    solution = Interval(
        sympy.exp(1/(6*(sympy.sqrt(2019)/36 + Rat(5,4))**(Rat(1, 3)))
            + (sympy.sqrt(2019)/36 + Rat(5,4))**(Rat(1,3))),
        oo)
    event = 2*(Log(Y))**3 - Log(Y) - 5 >= 0
    answer = event.solve()
    assert answer == solution
コード例 #4
0
def test_solver_18():
    # 3*(x**(1/7))**4 - 3*(x**(1/7))**2 <= 9
    solution = Interval(0, (Rat(1, 2) + sympy.sqrt(13)/2)**(Rat(7, 2)))

    Z = Y**(Rat(1, 7))
    expr = 3*Z**4 - 3*Z**2
    event = (expr <= 9)
    answer = event.solve()
    assert answer == solution

    interval = (~event).solve()
    assert interval == Interval.open(solution.right, oo)
コード例 #5
0
def test_solver_27_piecewise_many():
    expr = (Y < 0)*(Y**2) + (0 <= Y)*Y**(Rat(1, 2))
    event = expr << {3}
    assert sorted(event.solve()) == [-sympy.sqrt(3), 9]
    event = 0 < expr
    assert event.solve() == Union(
        Interval.open(-oo, 0),
        Interval.open(0, oo))

    # TODO: Consider banning the restriction of a function
    # to a segment outside of its domain.
    expr = (Y < 0)*Y**(Rat(1, 2))
    assert (expr < 1).solve() is EmptySet
コード例 #6
0
def test_parse_17():
    # https://www.wolframalpha.com/input/?i=Expand%5B%2810%2F7+%2B+X%29+%28-1%2F%285+Sqrt%5B2%5D%29+%2B+X%29+%28-Sqrt%5B5%5D+%2B+X%29%5D
    for Z in [X, Log(X), Abs(1+X**2)]:
        expr = (Z - Rat(1, 10) * sympy.sqrt(2)) \
            * (Z + Rat(10, 7)) \
            * (Z - sympy.sqrt(5))
        coeffs = [
            sympy.sqrt(10)/7,
            1/sympy.sqrt(10) - (10*sympy.sqrt(5))/7 - sympy.sqrt(2)/7,
            (-sympy.sqrt(5) - 1/(5 * sympy.sqrt(2))) + Rat(10)/7,
            1,
        ]
        expr_prime = Poly(Z, coeffs)
        assert expr == expr_prime
コード例 #7
0
def test_solver_9_open():
    # 2(log(x))**3 - log(x) -5 > 0
    solution = Interval.open(
        sympy.exp(1/(6*(sympy.sqrt(2019)/36 + Rat(5,4))**(Rat(1, 3)))
            + (sympy.sqrt(2019)/36 + Rat(5,4))**(Rat(1,3))),
        oo)
    # Our solver handles this case as follows
    # expr' = 2*Z**3 - Z - 5 > 0 [[subst. Z=log(X)]]
    # [Z_low, Z_high] = sympy_solver(expr')
    #       Z_low < Z iff Z_low < log(X) iff exp(Z_low) < X
    #       Z < Z_high iff log(X) < Z_high iff X < exp(Z_high)
    # sympy_solver(expr) = [exp(Z_low), exp(Z_high)]
    # For F invertible, can thus solve Poly(coeffs, F) > 0 using this method.
    event = 2*(Log(Y))**3 - Log(Y) - 5 > 0
    answer = event.solve()
    assert answer == solution
コード例 #8
0
def test_solver_finite_injective():
    sqrt3 = sympy.sqrt(3)
    # Identity.
    solution = FiniteReal(2, 4, -10, sqrt3)
    event = Y << {2, 4, -10, sqrt3}
    assert event.solve() == solution
    # Exp.
    solution = FiniteReal(sympy.log(10), sympy.log(3), sympy.log(sqrt3))
    event = Exp(Y) << {10, 3, sqrt3}
    assert event.solve() == solution
    # Exp2.
    solution = FiniteReal(sympy.log(10, 2), 4, sympy.log(sqrt3, 2))
    event = (2**Y) << {10, 16, sqrt3}
    assert event.solve() == solution
    # Log.
    solution = FiniteReal(sympy.exp(10), sympy.exp(-3), sympy.exp(sqrt3))
    event = Log(Y) << {10, -3, sqrt3}
    assert event.solve() == solution
    # Log2
    solution = FiniteReal(sympy.Pow(2, 10), sympy.Pow(2, -3), sympy.Pow(2, sqrt3))
    event = Logarithm(Y, 2) << {10, -3, sqrt3}
    assert event.solve() == solution
    # Radical.
    solution = FiniteReal(7**4, 12**4, sqrt3**4)
    event = Y**Rat(1, 4) << {7, 12, sqrt3}
    assert event.solve() == solution
コード例 #9
0
def test_solver_24_negative_power_Rat():
    # Case 1.
    event = Y**Rat(-1, 3) < 6
    assert event.solve() == Interval.Lopen(Rat(1, 216), oo)
    # Case 2.
    event = (-1 < Y**Rat(-1, 3)) < 6
    assert event.solve() == Interval.Lopen(Rat(1, 216), oo)
    # Case 3.
    event = 5 <= Y**Rat(-1, 3)
    assert event.solve() == Interval.Lopen(0, Rat(1, 125))
    # Case 4.
    event = (5 <= Y**Rat(-1, 3)) < 6
    assert event.solve() == Interval.Lopen(Rat(1, 216), Rat(1, 125))
コード例 #10
0
def test_parse_15():
    # ((x**4)**(1/7)) < 9
    expr = ((X**4))**Rat(1, 7)
    expr_prime = Radical(Pow(Y, 4), 7)
    assert expr == expr_prime

    event = EventInterval(expr_prime, Interval.open(-oo, 9))
    assert (expr < 9) == event
コード例 #11
0
def test_solver_24_negative_power_integer():
    # Case 1.
    event = Y**(-3) < 6
    assert event.solve() == Union(
        Interval.open(-oo, 0),
        Interval.open(6**Rat(-1, 3), oo))
    # Case 2.
    event = (-1 < Y**(-3)) < 6
    assert event.solve() == Union(
        Interval.open(-oo, -1),
        Interval.open(6**Rat(-1, 3), oo))
    # Case 3.
    event = 5 <= Y**(-3)
    assert event.solve() == Interval.Lopen(0, 5**Rat(-1, 3))
    # Case 4.
    event = (5 <= Y**(-3)) < 6
    assert event.solve() == Interval.Lopen(6**Rat(-1, 3), 5**Rat(-1, 3))
コード例 #12
0
def test_solver_19():
    # 3*(x**(1/7))**4 - 3*(x**(1/7))**2 <= 9
    #   or || 3*(x**(1/7))**4 - 3*(x**(1/7))**2 > 11
    solution = Union(
        Interval(0, (Rat(1, 2) + sympy.sqrt(13)/2)**(Rat(7, 2))),
        Interval.open((Rat(1,2) + sympy.sqrt(141)/6)**(Rat(7, 2)), oo))

    Z = Y**(Rat(1, 7))
    expr = 3*Z**4 - 3*Z**2
    event = (expr <= 9) | (expr > 11)
    answer = event.solve()
    assert answer == solution

    interval = (~event).solve()
    assert interval == Interval.Lopen(
        solution.args[0].right,
        solution.args[1].left)
コード例 #13
0
def test_parse_16():
    # (x**(1/7))**4 < 9
    for expr in [((X**Rat(1,7)))**4, (X**(1,7))**4]:
        expr_prime = Pow(Radical(Y, 7), 4)
        assert expr == expr_prime

    event = EventInterval(expr, Interval.open(-oo, 9))
    assert (expr < 9) == event
コード例 #14
0
def test_solver_23_reciprocal_range():
    solution = Interval.Ropen(-1, -Rat(1, 3))
    event = ((-3 < 1/Y) <= -1)
    assert event.solve() == solution

    solution = Interval.open(0, Rat(1, 3))
    event = ((-3 < 1/(2*Y-1)) < -1)
    assert event.solve() == solution

    solution = Interval.open(-1 / sympy.sqrt(3), 1 / sympy.sqrt(3))
    event = ((-3 < 1/(2*(abs(Y)**2)-1)) <= -1)
    assert event.solve() == solution

    solution = Union(
        Interval.open(-1 / sympy.sqrt(3), 0),
        Interval.open(0, 1 / sympy.sqrt(3)))
    event = ((-3 < 1/(2*(abs(Y)**2)-1)) < -1)
    assert event.solve() == solution
コード例 #15
0
def test_solver_23_reciprocal_gte():
    for c in [1, 3]:
        # Positive
        # 10 < 1 / X
        solution = Interval.open(0, Rat(c, 10))
        event = 10 < (c / Y)
        assert event.solve() == solution
        # 10 <= 1 / X
        solution = Interval.Lopen(0, Rat(c, 10))
        event = 10 <= (c / Y)
        assert event.solve() == solution
        # Negative
        # -10 < 1 / X
        solution = Interval.Lopen(0, oo) | Interval.open(-oo, -Rat(c, 10))
        event = -10 < (c / Y)
        assert event.solve() == solution
        # -10 <= 1 / X
        solution = Interval.Lopen(0, oo) | Interval.Lopen(-oo, -Rat(c, 10))
        event =  -10 <= (c / Y)
        assert event.solve() == solution
コード例 #16
0
def test_solver_finite_non_injective():
    sqrt2 = sympy.sqrt(2)
    # Abs.
    solution = FiniteReal(-10, -3, 3, 10)
    event = abs(Y) << {10, 3}
    assert event.solve() == solution
    # Abs(Poly).
    solution = FiniteReal(-5, -Rat(3,2), Rat(3,2), 5)
    event = abs(2*Y) << {10, 3}
    assert event.solve() == solution
    # Poly order 2.
    solution = FiniteReal(-sqrt2, sqrt2)
    event = (Y**2) << {2}
    assert event.solve() == solution
    # Poly order 3.
    solution = FiniteReal(1, 3)
    event = Y**3 << {1, 27}
    assert event.solve() == solution
    # Poly Abs.
    solution = FiniteReal(-3, -1, 1, 3)
    event = (abs(Y))**3 << {1, 27}
    assert event.solve() == solution
    # Abs Not.
    solution = Union(
        Interval.open(-oo, -1),
        Interval.open(-1, 1),
        Interval.open(1, oo))
    event = ~(abs(Y) << {1})
    assert event.solve() == solution
    # Abs in EmptySet.
    solution = EmptySet
    event = (abs(Y))**3 << set()
    assert event.solve() == solution
    # Abs Not in EmptySet (yields all reals).
    solution = Interval(-oo, oo)
    event = ~(((abs(Y))**3) << set())
    assert event.solve() == solution
    # Log in Reals (yields positive reals).
    solution = Interval.open(0, oo)
    event = ~((Log(Y))**3 << set())
    assert event.solve() == solution
コード例 #17
0
def test_parse_18():
    # 3*(x**(1/7))**4 - 3*(x**(1/7))**2 <= 9
    Z = X**Rat(1, 7)
    expr = 3*Z**4 - 3*Z**2
    expr_prime = Poly(Radical(Y, 7), [0, 0, -3, 0, 3])
    assert expr == expr_prime

    event = EventInterval(expr_prime, Interval(-oo, 9))
    assert (expr <= 9) == event

    event_not = EventInterval(expr_prime, Interval.open(9, oo))
    assert ~(expr <= 9) == event_not

    expr = (3*Abs(Z))**4 - (3*Abs(Z))**2
    expr_prime = Poly(Poly(Abs(Z), [0, 3]), [0, 0, -1, 0, 3])
コード例 #18
0
def test_errors():
    with pytest.raises(ValueError):
        1 + Log(X) - Exp(X)
    with pytest.raises(TypeError):
        Log(X) ** Exp(X)
    with pytest.raises(ValueError):
        Abs(X) ** sympy.sqrt(10)
    with pytest.raises(ValueError):
        Log(X) * X
    with pytest.raises(ValueError):
        (2*Log(X)) - Rat(1, 10) * Abs(X)
    with pytest.raises(ValueError):
        X**(1.71)
    with pytest.raises(ValueError):
        Abs(X)**(1.1, 8)
    with pytest.raises(ValueError):
        Abs(X)**(7, 8)
    with pytest.raises(ValueError):
        (-3)**X
    with pytest.raises(ValueError):
        (Identity('Z')**2)*(Y > 0)
    with pytest.raises(ValueError):
        (Y > 0) * (Identity('Z')**2)
    with pytest.raises(ValueError):
        ((Y > 0) | (Identity('Z') < 3)) * (Identity('Z')**2)
    with pytest.raises(ValueError):
        Y**2 + (0 <= Y) * Y
    with pytest.raises(ValueError):
        (Y <= 0)*(Y**2) + (0 <= Y)*Y**((1, 2))
    with pytest.raises(ValueError):
        (Y <= 0)*(Y**2) + (0 <= Identity('Z'))*Y**((1, 2))
    with pytest.raises(ValueError):
        (Y <= 0)*(Y**2) + (0 <= Identity('Z'))*Identity('Z')**((1, 2))

    # TypeErrors from 'return NotImplemented'.
    with pytest.raises(TypeError):
        X + 'a'
    with pytest.raises(TypeError):
        X * 'a'
    with pytest.raises(TypeError):
        X / 'a'
    with pytest.raises(TypeError):
        X**'s'
コード例 #19
0
def test_parse_19():
    # 3*(x**(1/7))**4 - 3*(x**(1/7))**2 <= 9
    #   or || 3*(x**(1/7))**4 - 3*(x**(1/7))**2 > 11
    Z = X**Rat(1, 7)
    expr = 3*Z**4 - 3*Z**2

    event = (expr <= 9) | (expr > 11)
    event_prime = EventOr([
        EventInterval(expr, Interval(-oo, 9)),
        EventInterval(expr, Interval.open(11, oo)),
    ])
    assert event == event_prime

    event = ((expr <= 9) | (expr > 11)) & (~(expr < 10))
    event_prime = EventAnd([
        EventOr([
            EventInterval(expr, Interval(-oo, 9)),
            EventInterval(expr, Interval.open(11, oo))]),
        EventInterval(expr, Interval(10, oo))
    ])
    assert event == event_prime
コード例 #20
0
def test_solver_15():
    # ((x**4)**(1/7)) < 9
    solution = Interval.open(-27*sympy.sqrt(3), 27*sympy.sqrt(3))
    event = ((Y**4))**(Rat(1, 7)) < 9
    answer = event.solve()
    assert answer == solution
コード例 #21
0
def test_parse_24_negative_power():
    assert X**(-3) == Reciprocal(Pow(X, 3))
    assert X**((-3, 1)) == Reciprocal(Pow(X, 3))
    assert X**(-Rat(1, 3)) == Reciprocal(Radical(X, 3))
    with pytest.raises(ValueError):
        X**0
コード例 #22
0
def test_solver_17():
    p = sympy.Poly(
        (X - sympy.sqrt(2)/10) * (X+Rat(10, 7)) * (X - sympy.sqrt(5)),
        X)
    expr = p.args[0] < 1
    sympy_solver(expr)
コード例 #23
0
def test_divide_multiplication():
    assert (X**2 + 2) / 2 == Poly(X, [1, 0, Rat(1, 2)])
コード例 #24
0
e = (n + nbar) / 2
ebar = n - e
I = e1 * e2 * e * ebar


def intersect_lines(L1, L2):
    global I
    '''
    Computes the intersection bivector of two conformal lines L1, L2
    '''
    C = I * ((I * L1) ^ (I * L2))
    return C


A = F(Rat(1, 2) * e1)
B = F(2 * e1)
C = F(Rat(4, 5) * e1 + Rat(3, 5) * e2)
D = F(Rat(4, 5) * e1 - Rat(3, 5) * e2)

print('A =', A)
print('B =', B)
print('C =', C)
print('D =', D)

T = A ^ B ^ C
print('T =', T)
U = F(e1) ^ (F(e2)) ^ F(-1 * e1)
print('U =', U)
inter = intersect_lines(U, T)
print('inter =', inter)
コード例 #25
0
def test_solver_16():
    # (x**(1/7))**4 < 9
    solution = Interval.Ropen(0, 27*sympy.sqrt(3))
    event = ((Y**Rat(1,7)))**4 < 9
    answer = event.solve()
    assert answer == solution