Skip to content

Commit 266d3e6

Browse files
authored
Merge pull request #262 from Suavesito-Olimpiada/suave/conj_rule
Simplify `conj` and `real` for `::Real`
2 parents 0e1f219 + 933b982 commit 266d3e6

File tree

4 files changed

+14
-6
lines changed

4 files changed

+14
-6
lines changed

src/methods.jl

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import SpecialFunctions: gamma, loggamma, erf, erfc, erfcinv, erfi, erfcx,
44
besselj1, bessely0, bessely1, besselj, bessely, besseli,
55
besselk, hankelh1, hankelh2, polygamma, beta, logbeta
66

7-
const monadic = [deg2rad, rad2deg, transpose, conj, asind, log1p, acsch,
7+
const monadic = [deg2rad, rad2deg, transpose, asind, log1p, acsch,
88
acos, asec, acosh, acsc, cscd, log, tand, log10, csch, asinh,
99
abs2, cosh, sin, cos, atan, cospi, cbrt, acosd, acoth, acotd,
1010
asecd, exp, acot, sqrt, sind, sinpi, asech, log2, tan, exp10,
1111
sech, coth, asin, cotd, cosd, sinh, abs, csc, tanh, secd,
12-
atand, sec, acscd, cot, exp2, expm1, atanh, real, gamma,
12+
atand, sec, acscd, cot, exp2, expm1, atanh, gamma,
1313
loggamma, erf, erfc, erfcinv, erfi, erfcx, dawson, digamma,
1414
trigamma, invdigamma, polygamma, airyai, airyaiprime, airybi,
1515
airybiprime, besselj0, besselj1, bessely0, bessely1]
@@ -97,9 +97,6 @@ promote_symtype(::typeof(rem2pi), T::Type{<:Number}, mode) = T
9797
Base.rem2pi(x::Symbolic{<:Number}, mode::Base.RoundingMode) = term(rem2pi, x, mode)
9898

9999
for f in monadic
100-
if f in [real]
101-
continue
102-
end
103100
@eval promote_symtype(::$(typeof(f)), T::Type{<:Number}) = promote_type(T, Real)
104101
@eval (::$(typeof(f)))(a::Symbolic{<:Number}) = term($f, a)
105102
end
@@ -113,6 +110,10 @@ end
113110

114111
promote_symtype(::typeof(Base.real), T::Type{<:Number}) = Real
115112
Base.real(s::Symbolic{<:Number}) = islike(s, Real) ? s : term(real, s)
113+
promote_symtype(::typeof(Base.conj), T::Type{<:Number}) = T
114+
Base.conj(s::Symbolic{<:Number}) = islike(s, Real) ? s : term(conj, s)
115+
promote_symtype(::typeof(Base.imag), T::Type{<:Number}) = Real
116+
Base.imag(s::Symbolic{<:Number}) = islike(s, Real) ? zero(symtype(s)) : term(conj, s)
116117

117118
## Booleans
118119

src/simplify_rules.jl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ let
5151
@rule(~x / ~y => ~x * pow(~y, -1))
5252
@rule(one(~x) => one(symtype(~x)))
5353
@rule(zero(~x) => zero(symtype(~x)))
54+
@rule(conj(~x::_isreal) => ~x)
55+
@rule(real(~x::_isreal) => ~x)
56+
@rule(imag(~x::_isreal) => zero(symtype(~x)))
5457
@rule(ifelse(~x::is_literal_number, ~y, ~z) => ~x ? ~y : ~z)
5558
]
5659

src/utils.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ is_literal_number(x) = isliteral(Number)(x)
115115
_iszero(x) = x isa Number && iszero(x)
116116
_isone(x) = x isa Number && isone(x)
117117
_isinteger(x) = (x isa Number && isinteger(x)) || (x isa Symbolic && symtype(x) <: Integer)
118+
_isreal(x) = (x isa Number && isreal(x)) || (x isa Symbolic && symtype(x) <: Real)
118119

119120
issortedₑ(args) = issorted(args, lt=<ₑ)
120121
needs_sorting(f) = x -> is_operation(f)(x) && !issortedₑ(arguments(x))

test/rulesets.jl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using Random: shuffle, seed!
2-
using SymbolicUtils: getdepth, Rewriters
2+
using SymbolicUtils: getdepth, Rewriters, Term
33

44
@testset "Chain, Postwalk and Fixpoint" begin
55
@syms w z α::Real β::Real
@@ -18,6 +18,9 @@ end
1818

1919
@testset "Numeric" begin
2020
@syms a::Integer b c d x::Real y::Number
21+
@eqtest simplify(Term{Real}(conj, [x])) == x
22+
@eqtest simplify(Term{Real}(real, [x])) == x
23+
@eqtest simplify(Term{Real}(imag, [x])) == 0
2124
@eqtest simplify(x - y) == x + -1*y
2225
@eqtest simplify(x - sin(y)) == x + -1*sin(y)
2326
@eqtest simplify(-sin(x)) == -1*sin(x)

0 commit comments

Comments
 (0)