Skip to content

Commit f044cec

Browse files
committed
Define get_den
1 parent e011b04 commit f044cec

File tree

3 files changed

+28
-24
lines changed

3 files changed

+28
-24
lines changed

src/polyform.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,11 +296,11 @@ end
296296
#add_divs(x, y) = x + y
297297
function add_divs(x, y)
298298
if isdiv(x) && isdiv(y)
299-
return (get_num(x) * y.impl.den + get_num(y) * x.impl.den) / (x.impl.den * y.impl.den)
299+
return (get_num(x) * get_den(y) + get_num(y) * get_den(x)) / (get_den(x) * get_den(y))
300300
elseif isdiv(x)
301-
return (get_num(x) + y * x.impl.den) / x.impl.den
301+
return (get_num(x) + y * get_den(x)) / get_den(x)
302302
elseif isdiv(y)
303-
return (x * y.impl.den + get_num(y)) / y.impl.den
303+
return (x * get_den(y) + get_num(y)) / get_den(y)
304304
else
305305
x + y
306306
end
@@ -384,7 +384,7 @@ function fraction_isone(x)
384384
end
385385

386386
function needs_div_rules(x)
387-
(isdiv(x) && !(get_num(x) isa Number) && !(x.impl.den isa Number)) ||
387+
(isdiv(x) && !(get_num(x) isa Number) && !(get_den(x) isa Number)) ||
388388
(iscall(x) && operation(x) === (+) && count(has_div, arguments(x)) > 1) ||
389389
(iscall(x) && any(needs_div_rules, arguments(x)))
390390
end
@@ -417,11 +417,11 @@ Has optimized processes for `Mul` and `Pow` terms.
417417
"""
418418
function quick_cancel(d)
419419
if ispow(d) && isdiv(d.impl.base)
420-
return quick_cancel((get_num(d.impl.base)^d.impl.exp) / (d.impl.base.impl.den^d.impl.exp))
420+
return quick_cancel((get_num(d.impl.base)^d.impl.exp) / (get_den(d.impl.base)^d.impl.exp))
421421
elseif ismul(d) && any(isdiv, arguments(d))
422422
return prod(arguments(d))
423423
elseif isdiv(d)
424-
num, den = quick_cancel(get_num(d), d.impl.den)
424+
num, den = quick_cancel(get_num(d), get_den(d))
425425
return _Div(num, den)
426426
else
427427
return d

src/types.jl

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ function get_num(x::BasicSymbolic)
8080
x.impl.num
8181
end
8282

83+
function get_den(x::BasicSymbolic)
84+
x.impl.den
85+
end
86+
8387
# Same but different error messages
8488
@noinline error_on_type() = error("Internal error: unreachable reached!")
8589
@noinline error_sym() = error("Sym doesn't have a operation or arguments!")
@@ -307,7 +311,7 @@ function _isequal(a, b, E)
307311
elseif E === ADD || E === MUL
308312
coeff_isequal(get_coeff(a), get_coeff(b)) && isequal(get_dict(a), get_dict(b))
309313
elseif E === DIV
310-
isequal(get_num(a), get_num(b)) && isequal(a.impl.den, b.impl.den)
314+
isequal(get_num(a), get_num(b)) && isequal(get_den(a), get_den(b))
311315
elseif E === POW
312316
isequal(a.impl.exp, b.impl.exp) && isequal(a.impl.base, b.impl.base)
313317
elseif E === TERM
@@ -353,7 +357,7 @@ function Base.hash(s::BasicSymbolic, salt::UInt)::UInt
353357
s.hash[] = h′
354358
return h′
355359
elseif E === DIV
356-
return hash(get_num(s), hash(s.impl.den, salt DIV_SALT))
360+
return hash(get_num(s), hash(get_den(s), salt DIV_SALT))
357361
elseif E === POW
358362
hash(s.impl.exp, hash(s.impl.base, salt POW_SALT))
359363
elseif E === TERM
@@ -487,11 +491,11 @@ function _Div(::Type{T}, num, den; kwargs...) where {T}
487491
_iszero(num) && return zero(typeof(num))
488492
_isone(den) && return num
489493
if isdiv(num) && isdiv(den)
490-
return _Div(T, get_num(num) * den.impl.den, num.impl.den * get_num(den))
494+
return _Div(T, get_num(num) * get_den(den), get_den(num) * get_num(den))
491495
elseif isdiv(num)
492-
return _Div(T, get_num(num), num.impl.den * den)
496+
return _Div(T, get_num(num), get_den(num) * den)
493497
elseif isdiv(den)
494-
return _Div(T, num * den.impl.den, get_num(den))
498+
return _Div(T, num * get_den(den), get_num(den))
495499
end
496500
if den isa Number && _isone(-den)
497501
return -1 * num
@@ -531,7 +535,7 @@ end
531535
iscall(x) && operation(x) === (*) ? arguments(x) : Any[x]
532536
end
533537

534-
@inline denominators(x) = isdiv(x) ? numerators(x.impl.den) : Any[1]
538+
@inline denominators(x) = isdiv(x) ? numerators(get_den(x)) : Any[1]
535539

536540
function _Pow(::Type{T}, base, exp; kwargs...) where {T}
537541
_iszero(exp) && return 1
@@ -556,7 +560,7 @@ function toterm(t::BasicSymbolic{T}) where {T}
556560
end
557561
_Term(T, operation(t), args)
558562
elseif E === DIV
559-
_Term(T, /, [get_num(t), t.impl.den])
563+
_Term(T, /, [get_num(t), get_den(t)])
560564
elseif E === POW
561565
_Term(T, ^, [t.impl.base, t.impl.exp])
562566
else
@@ -1295,11 +1299,11 @@ function *(a::SN, b::SN)
12951299
# Always make sure Div wraps Mul
12961300
!issafecanon(*, a, b) && return term(*, a, b)
12971301
if isdiv(a) && isdiv(b)
1298-
_Div(get_num(a) * get_num(b), a.impl.den * b.impl.den)
1302+
_Div(get_num(a) * get_num(b), get_den(a) * get_den(b))
12991303
elseif isdiv(a)
1300-
_Div(get_num(a) * b, a.impl.den)
1304+
_Div(get_num(a) * b, get_den(a))
13011305
elseif isdiv(b)
1302-
_Div(a * get_num(b), b.impl.den)
1306+
_Div(a * get_num(b), get_den(b))
13031307
elseif ismul(a) && ismul(b)
13041308
_Mul(mul_t(a, b), get_coeff(a) * get_coeff(b),
13051309
_merge(+, get_dict(a), get_dict(b), filter = _iszero))
@@ -1329,7 +1333,7 @@ function *(a::Number, b::SN)
13291333
elseif isone(a)
13301334
b
13311335
elseif isdiv(b)
1332-
_Div(a * get_num(b), b.impl.den)
1336+
_Div(a * get_num(b), get_den(b))
13331337
elseif isone(-a) && isadd(b)
13341338
# -1(a+b) -> -a - b
13351339
T = promote_symtype(+, typeof(a), symtype(b))

test/basics.jl

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
using SymbolicUtils: Symbolic, FnType, symtype, operation, arguments, issym, isterm,
2-
BasicSymbolic, term, get_name, get_coeff, get_dict, get_num
2+
BasicSymbolic, term, get_name, get_coeff, get_dict, get_num, get_den
33
using SymbolicUtils
44
using IfElse: ifelse
55
using Setfield
@@ -348,20 +348,20 @@ end
348348
@syms x::SafeReal y::Real
349349
@test issym(get_num(2x / 2y))
350350
@test get_coeff(get_num(2x / 3y)) == 2
351-
@test get_coeff((2x / 3y).impl.den) == 3
351+
@test get_coeff(get_den(2x / 3y)) == 3
352352
@test get_coeff(get_num(2x / -3x)) == -2
353-
@test get_coeff((2x / -3x).impl.den) == 3
353+
@test get_coeff(get_den(2x / -3x)) == 3
354354
@test get_coeff(get_num(2.5x / 3x)) == 2.5
355-
@test get_coeff((2.5x / 3x).impl.den) == 3
356-
@test get_coeff((x / 3x).impl.den) == 3
355+
@test get_coeff(get_den(2.5x / 3x)) == 3
356+
@test get_coeff(get_den(x / 3x)) == 3
357357

358358
@syms x y
359359
@test issym(get_num(2x / 2y))
360360
@test get_coeff(get_num(2x / 3y)) == 2
361-
@test get_coeff((2x / 3y).impl.den) == 3
361+
@test get_coeff(get_den(2x / 3y)) == 3
362362
@test (2x / -3x) == -2 // 3
363363
@test get_num(2.5x / 3x) == 2.5
364-
@test (2.5x / 3x).impl.den == 3
364+
@test get_den(2.5x / 3x) == 3
365365
@test (x / 3x) == 1 // 3
366366
@test isequal(x / 1, x)
367367
@test isequal(x / -1, -x)

0 commit comments

Comments
 (0)