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
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
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
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)
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
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
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
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
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))
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
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))
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)
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
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
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
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
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])
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'
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
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
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
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)
def test_divide_multiplication(): assert (X**2 + 2) / 2 == Poly(X, [1, 0, Rat(1, 2)])
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)
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