Skip to content

Commit a42082a

Browse files
authored
Merge pull request #469 from pagnani/master
added rule for 1^x == 1 in POW_RULES
2 parents 45016a5 + 8e6f95e commit a42082a

File tree

2 files changed

+48
-40
lines changed

2 files changed

+48
-40
lines changed

src/simplify_rules.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ let
4040
@rule(^(~x, ~z::_iszero) => 1)
4141
@rule(^(~x, ~z::_isone) => ~x)
4242
@rule(inv(~x) => 1/(~x))
43+
@rule(^(~x::_isone, ~z) => 1)
4344
]
4445

4546
ASSORTED_RULES = [

test/rulesets.jl

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ using SymbolicUtils: getdepth, Rewriters, Term
55
@syms w z α::Real β::Real
66

77
r1 = @rule ~x + ~x => 2 * (~x)
8-
r2 = @acrule ~x * +(~~ys) => sum(map(y-> ~x * y, ~~ys));
8+
r2 = @acrule ~x * +(~~ys) => sum(map(y -> ~x * y, ~~ys))
99

1010
rset = Rewriters.Postwalk(Rewriters.Chain([r2]))
1111
@test getdepth(rset) == typemax(Int)
@@ -22,36 +22,36 @@ end
2222
@eqtest simplify(Term{Real}(real, [x])) == x
2323
@eqtest simplify(Term{Real}(imag, [x])) == 0
2424
@eqtest simplify(Term{Real}(imag, [y])) == imag(y)
25-
@eqtest simplify(x - y) == x + -1*y
26-
@eqtest simplify(x - sin(y)) == x + -1*sin(y)
27-
@eqtest simplify(-sin(x)) == -1*sin(x)
25+
@eqtest simplify(x - y) == x + -1 * y
26+
@eqtest simplify(x - sin(y)) == x + -1 * sin(y)
27+
@eqtest simplify(-sin(x)) == -1 * sin(x)
2828
@eqtest simplify(1 * x * 2) == 2 * x
2929
@eqtest simplify(1 + x + 2) == 3 + x
30-
@eqtest simplify(b*b) == b^2 # tests merge_repeats
31-
@eqtest simplify((a*b)^2) == a^2 * b^2
32-
@eqtest simplify((a*b)^c) == (a*b)^c
30+
@eqtest simplify(b * b) == b^2 # tests merge_repeats
31+
@eqtest simplify((a * b)^2) == a^2 * b^2
32+
@eqtest simplify((a * b)^c) == (a * b)^c
3333

3434
@eqtest simplify(1x + 2x) == 3x
3535
@eqtest simplify(3x + 2x) == 5x
3636

37-
@eqtest simplify(a + b + (x * y) + c + 2 * (x * y) + d) == simplify((3 * x * y) + a + b + c + d)
37+
@eqtest simplify(a + b + (x * y) + c + 2 * (x * y) + d) == simplify((3 * x * y) + a + b + c + d)
3838
@eqtest simplify(a + b + 2 * (x * y) + c + 2 * (x * y) + d) == simplify((4 * x * y) + a + b + c + d)
3939

40-
@eqtest simplify(a * x^y * b * x^d) == simplify(a * b * (x ^ (d + y)))
40+
@eqtest simplify(a * x^y * b * x^d) == simplify(a * b * (x^(d + y)))
4141

42-
@eqtest simplify(a + b + 0*c + d) == simplify(a + b + d)
42+
@eqtest simplify(a + b + 0 * c + d) == simplify(a + b + d)
4343
@eqtest simplify(a * b * c^0 * d) == simplify(a * b * d)
44-
@eqtest simplify(a * b * 1*c * d) == simplify(a * b * c * d)
45-
@eqtest simplify_fractions(x^2.0/(x*y)^2.0) == simplify_fractions(1 / (y^2.0))
44+
@eqtest simplify(a * b * 1 * c * d) == simplify(a * b * c * d)
45+
@eqtest simplify_fractions(x^2.0 / (x * y)^2.0) == simplify_fractions(1 / (y^2.0))
4646

4747
@test simplify(Term(one, [a])) == 1
48-
@test simplify(Term(one, [b+1])) == 1
49-
@test simplify(Term(one, [x+2])) == 1
48+
@test simplify(Term(one, [b + 1])) == 1
49+
@test simplify(Term(one, [x + 2])) == 1
5050

5151

5252
@test simplify(Term(zero, [a])) == 0
53-
@test simplify(Term(zero, [b+1])) == 0
54-
@test simplify(Term(zero, [x+2])) == 0
53+
@test simplify(Term(zero, [b + 1])) == 0
54+
@test simplify(Term(zero, [x + 2])) == 0
5555
end
5656

5757
@testset "boolean" begin
@@ -67,14 +67,14 @@ end
6767
@eqtest simplify((0 < a) & false) == false
6868
@eqtest simplify(Term{Bool}(!, [true])) == false
6969
@eqtest simplify(Term{Bool}(|, [false, true])) == true
70-
@eqtest simplify(ifelse(true, a,b)) == a
71-
@eqtest simplify(ifelse(false, a,b)) == b
70+
@eqtest simplify(ifelse(true, a, b)) == a
71+
@eqtest simplify(ifelse(false, a, b)) == b
7272

7373
# abs
74-
@test simplify(substitute(ifelse(!(a < 0), a,-a), Dict(a=>-1))) == 1
75-
@test simplify(substitute(ifelse(!(a < 0), a,-a), Dict(a=>1))) == 1
76-
@test simplify(substitute(ifelse(a < 0, -a, a), Dict(a=>-1))) == 1
77-
@test simplify(substitute(ifelse(a < 0, -a, a), Dict(a=>1))) == 1
74+
@test simplify(substitute(ifelse(!(a < 0), a, -a), Dict(a => -1))) == 1
75+
@test simplify(substitute(ifelse(!(a < 0), a, -a), Dict(a => 1))) == 1
76+
@test simplify(substitute(ifelse(a < 0, -a, a), Dict(a => -1))) == 1
77+
@test simplify(substitute(ifelse(a < 0, -a, a), Dict(a => 1))) == 1
7878
end
7979

8080
@testset "Pythagorean Identities" begin
@@ -92,29 +92,32 @@ end
9292

9393
@testset "Double angle formulas" begin
9494
@syms r x
95-
@eqtest simplify(r*cos(x/2)^2 - r*sin(x/2)^2) == r*cos(x)
96-
@eqtest simplify(r*sin(x/2)^2 - r*cos(x/2)^2) == -r*cos(x)
97-
@eqtest simplify(2cos(x)*sin(x)) == sin(2x)
95+
@eqtest simplify(r * cos(x / 2)^2 - r * sin(x / 2)^2) == r * cos(x)
96+
@eqtest simplify(r * sin(x / 2)^2 - r * cos(x / 2)^2) == -r * cos(x)
97+
@eqtest simplify(2cos(x) * sin(x)) == sin(2x)
9898
end
9999

100100
@testset "Exponentials" begin
101101
@syms a::Real b::Real
102-
@eqtest simplify(exp(a)*exp(b)) == simplify(exp(a+b))
103-
@eqtest simplify(exp(a)*exp(a)) == simplify(exp(2a))
104-
@test simplify(exp(a)*exp(-a)) == 1
102+
@eqtest simplify(exp(a) * exp(b)) == simplify(exp(a + b))
103+
@eqtest simplify(exp(a) * exp(a)) == simplify(exp(2a))
104+
@test simplify(exp(a) * exp(-a)) == 1
105105
@eqtest simplify(exp(a)^2) == simplify(exp(2a))
106-
@eqtest simplify(exp(a) * a * exp(b)) == simplify(a*exp(a+b))
106+
@eqtest simplify(exp(a) * a * exp(b)) == simplify(a * exp(a + b))
107+
@eqtest simplify(one(Int)^a) == 1
108+
@eqtest simplify(one(Complex{Float64})^a) == 1
109+
@eqtest simplify(a^b * 1^a) == a^b
107110
end
108111

109112
@testset "simplify_fractions" begin
110113
@syms x y z
111-
@eqtest simplify(2*((y + z)/x) - 2*y/x - z/x*2) == 0
114+
@eqtest simplify(2 * ((y + z) / x) - 2 * y / x - z / x * 2) == 0
112115
end
113116

114117
@testset "Depth" begin
115118
@syms x
116119
R = Rewriters.Postwalk(Rewriters.Chain([@rule(sin(~x) => cos(~x)),
117-
@rule(1 + ~x => ~x - 1)]))
120+
@rule(1 + ~x => ~x - 1)]))
118121
@eqtest R(sin(sin(sin(x + 1)))) == cos(cos(cos(x - 1)))
119122
#@eqtest R(sin(sin(sin(x + 1))), depth=2) == cos(cos(sin(x + 1)))
120123
end
@@ -125,24 +128,28 @@ pred(x) = error("Fail")
125128
@syms a b
126129

127130
rs = Rewriters.Postwalk(Rewriters.Chain(([@rule ~x + ~y::pred => ~x])))
128-
@test_throws Metatheory.Rules.RuleRewriteError rs(a+b)
129-
err = try rs(a+b) catch err; err; end
130-
@test sprint(io->Base.showerror(io, err)) == "Failed to apply rule ~x + ~(y::pred) => ~x on expression a + b"
131+
@test_throws Metatheory.Rules.RuleRewriteError rs(a + b)
132+
err = try
133+
rs(a + b)
134+
catch err
135+
err
136+
end
137+
@test sprint(io -> Base.showerror(io, err)) == "Failed to apply rule ~x + ~(y::pred) => ~x on expression a + b"
131138
end
132139

133140
@testset "Threading" begin
134141
@syms a b c d
135142
ex = (((0.6666666666666666 / (c / 1)) + ((1 * a) / (c / 1))) +
136143
(1.0 / (((1 * d) / (1 + b)) * (1 / b)))) +
137-
((((1 * a) + (1 * a)) / ((2.0 * (d + 1)) / 1.0)) +
138-
((((d * 1) / (1 + c)) * 2.0) / ((1 / d) + (1 / c))))
144+
((((1 * a) + (1 * a)) / ((2.0 * (d + 1)) / 1.0)) +
145+
((((d * 1) / (1 + c)) * 2.0) / ((1 / d) + (1 / c))))
139146
@eqtest simplify(ex) == simplify(ex, threaded=true, thread_subtree_cutoff=3)
140147
@test SymbolicUtils.node_count(a + b * c / d) == 7
141148
end
142149

143150
@testset "timerwrite" begin
144151
@syms a b c d
145-
expr1 = foldr((x,y)->rand([*, /])(x,y), rand([a,b,c,d], 100))
152+
expr1 = foldr((x, y) -> rand([*, /])(x, y), rand([a, b, c, d], 100))
146153
SymbolicUtils.@timerewrite simplify(expr1)
147154
end
148155

@@ -159,14 +166,14 @@ _f(x) = x === a
159166
@testset "where" begin
160167
using Metatheory
161168
expected = :(_f(~x) ? ~x + ~y : nothing)
162-
@test Metatheory.Syntax.rewrite_rhs(:((~x + ~y) where _f(~x))) == expected
169+
@test Metatheory.Syntax.rewrite_rhs(:((~x + ~y) where {_f(~x)})) == expected
163170

164171
@syms a b
165-
r = @rule ~x => ~x where _f(~x)
172+
r = @rule ~x => ~x where {_f(~x)}
166173
@eqtest r(a) == a
167174
@test isnothing(r(b))
168175

169-
r = @acrule ~x => ~x where _f(~x)
176+
r = @acrule ~x => ~x where {_f(~x)}
170177
@eqtest r(a) == a
171178
@test r(b) === nothing
172179
end

0 commit comments

Comments
 (0)