@@ -80,6 +80,10 @@ function get_num(x::BasicSymbolic)
80
80
x. impl. num
81
81
end
82
82
83
+ function get_den (x:: BasicSymbolic )
84
+ x. impl. den
85
+ end
86
+
83
87
# Same but different error messages
84
88
@noinline error_on_type () = error (" Internal error: unreachable reached!" )
85
89
@noinline error_sym () = error (" Sym doesn't have a operation or arguments!" )
@@ -307,7 +311,7 @@ function _isequal(a, b, E)
307
311
elseif E === ADD || E === MUL
308
312
coeff_isequal (get_coeff (a), get_coeff (b)) && isequal (get_dict (a), get_dict (b))
309
313
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) )
311
315
elseif E === POW
312
316
isequal (a. impl. exp, b. impl. exp) && isequal (a. impl. base, b. impl. base)
313
317
elseif E === TERM
@@ -353,7 +357,7 @@ function Base.hash(s::BasicSymbolic, salt::UInt)::UInt
353
357
s. hash[] = h′
354
358
return h′
355
359
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))
357
361
elseif E === POW
358
362
hash (s. impl. exp, hash (s. impl. base, salt ⊻ POW_SALT))
359
363
elseif E === TERM
@@ -487,11 +491,11 @@ function _Div(::Type{T}, num, den; kwargs...) where {T}
487
491
_iszero (num) && return zero (typeof (num))
488
492
_isone (den) && return num
489
493
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))
491
495
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)
493
497
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))
495
499
end
496
500
if den isa Number && _isone (- den)
497
501
return - 1 * num
531
535
iscall (x) && operation (x) === (* ) ? arguments (x) : Any[x]
532
536
end
533
537
534
- @inline denominators (x) = isdiv (x) ? numerators (x . impl . den ) : Any[1 ]
538
+ @inline denominators (x) = isdiv (x) ? numerators (get_den (x) ) : Any[1 ]
535
539
536
540
function _Pow (:: Type{T} , base, exp; kwargs... ) where {T}
537
541
_iszero (exp) && return 1
@@ -556,7 +560,7 @@ function toterm(t::BasicSymbolic{T}) where {T}
556
560
end
557
561
_Term (T, operation (t), args)
558
562
elseif E === DIV
559
- _Term (T, / , [get_num (t), t . impl . den ])
563
+ _Term (T, / , [get_num (t), get_den (t) ])
560
564
elseif E === POW
561
565
_Term (T, ^ , [t. impl. base, t. impl. exp])
562
566
else
@@ -1295,11 +1299,11 @@ function *(a::SN, b::SN)
1295
1299
# Always make sure Div wraps Mul
1296
1300
! issafecanon (* , a, b) && return term (* , a, b)
1297
1301
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) )
1299
1303
elseif isdiv (a)
1300
- _Div (get_num (a) * b, a . impl . den )
1304
+ _Div (get_num (a) * b, get_den (a) )
1301
1305
elseif isdiv (b)
1302
- _Div (a * get_num (b), b . impl . den )
1306
+ _Div (a * get_num (b), get_den (b) )
1303
1307
elseif ismul (a) && ismul (b)
1304
1308
_Mul (mul_t (a, b), get_coeff (a) * get_coeff (b),
1305
1309
_merge (+ , get_dict (a), get_dict (b), filter = _iszero))
@@ -1329,7 +1333,7 @@ function *(a::Number, b::SN)
1329
1333
elseif isone (a)
1330
1334
b
1331
1335
elseif isdiv (b)
1332
- _Div (a * get_num (b), b . impl . den )
1336
+ _Div (a * get_num (b), get_den (b) )
1333
1337
elseif isone (- a) && isadd (b)
1334
1338
# -1(a+b) -> -a - b
1335
1339
T = promote_symtype (+ , typeof (a), symtype (b))
0 commit comments