@@ -68,6 +68,10 @@ function name(x::BasicSymbolic)
68
68
x. impl. name
69
69
end
70
70
71
+ function coeff (x:: BasicSymbolic )
72
+ x. impl. coeff
73
+ end
74
+
71
75
# Same but different error messages
72
76
@noinline error_on_type () = error (" Internal error: unreachable reached!" )
73
77
@noinline error_sym () = error (" Sym doesn't have a operation or arguments!" )
@@ -293,7 +297,7 @@ function _isequal(a, b, E)
293
297
if E === SYM
294
298
nameof (a) === nameof (b)
295
299
elseif E === ADD || E === MUL
296
- coeff_isequal (a . impl . coeff, b . impl . coeff) && isequal (a. impl. dict, b. impl. dict)
300
+ coeff_isequal (coeff (a), coeff (b) ) && isequal (a. impl. dict, b. impl. dict)
297
301
elseif E === DIV
298
302
isequal (a. impl. num, b. impl. num) && isequal (a. impl. den, b. impl. den)
299
303
elseif E === POW
@@ -337,7 +341,7 @@ function Base.hash(s::BasicSymbolic, salt::UInt)::UInt
337
341
h = s. hash[]
338
342
! iszero (h) && return h
339
343
hashoffset = isadd (s) ? ADD_SALT : SUB_SALT
340
- h′ = hash (hashoffset, hash (s . impl . coeff, hash (s. impl. dict, salt)))
344
+ h′ = hash (hashoffset, hash (coeff (s) , hash (s. impl. dict, salt)))
341
345
s. hash[] = h′
342
346
return h′
343
347
elseif E === DIV
@@ -444,7 +448,7 @@ const Rat = Union{Rational, Integer}
444
448
445
449
function ratcoeff (x)
446
450
if ismul (x)
447
- ratcoeff (x . impl . coeff)
451
+ ratcoeff (coeff (x) )
448
452
elseif x isa Rat
449
453
(true , x)
450
454
else
@@ -455,7 +459,7 @@ ratio(x::Integer,y::Integer) = iszero(rem(x,y)) ? div(x,y) : x//y
455
459
ratio (x:: Rat ,y:: Rat ) = x// y
456
460
function maybe_intcoeff (x)
457
461
if ismul (x)
458
- coeff = x . impl . coeff
462
+ coeff = coeff (x)
459
463
if coeff isa Rational && isone (denominator (coeff))
460
464
_Mul (symtype (x), coeff. num, x. impl. dict; metadata = x. metadata)
461
465
else
@@ -537,7 +541,7 @@ function toterm(t::BasicSymbolic{T}) where {T}
537
541
return t
538
542
elseif E === ADD || E === MUL
539
543
args = BasicSymbolic[]
540
- push! (args, t . impl . coeff)
544
+ push! (args, coeff (t) )
541
545
for (k, coeff) in t. impl. dict
542
546
push! (
543
547
args, coeff == 1 ? k : _Term (T, E === MUL ? (^ ) : (* ), [_Const (coeff), k]))
@@ -562,7 +566,7 @@ function makeadd(sign, coeff, xs...)
562
566
d = Dict {BasicSymbolic, Any} ()
563
567
for x in xs
564
568
if isadd (x)
565
- coeff += x . impl . coeff
569
+ coeff += coeff (x)
566
570
_merge! (+ , d, x. impl. dict, filter = _iszero)
567
571
continue
568
572
end
@@ -572,7 +576,7 @@ function makeadd(sign, coeff, xs...)
572
576
end
573
577
if ismul (x)
574
578
k = _Mul (symtype (x), 1 , x. impl. dict)
575
- v = sign * x . impl . coeff + get (d, k, 0 )
579
+ v = sign * coeff (x) + get (d, k, 0 )
576
580
else
577
581
k = x
578
582
v = sign + get (d, x, 0 )
@@ -593,7 +597,7 @@ function makemul(coeff, xs...; d = Dict{BasicSymbolic, Any}())
593
597
elseif x isa Number
594
598
coeff *= x
595
599
elseif ismul (x)
596
- coeff *= x . impl . coeff
600
+ coeff *= coeff (x)
597
601
_merge! (+ , d, x. impl. dict, filter = _iszero)
598
602
else
599
603
v = 1 + get (d, x, 0 )
@@ -1219,10 +1223,10 @@ function +(a::SN, b::SN)
1219
1223
! issafecanon (+ , a, b) && return term (+ , a, b) # Don't flatten if args have metadata
1220
1224
if isadd (a) && isadd (b)
1221
1225
return _Add (
1222
- add_t (a, b), a . impl . coeff + b . impl . coeff, _merge (+ , a. impl. dict, b. impl. dict, filter = _iszero))
1226
+ add_t (a, b), coeff (a) + coeff (b) , _merge (+ , a. impl. dict, b. impl. dict, filter = _iszero))
1223
1227
elseif isadd (a)
1224
1228
coeff, dict = makeadd (1 , 0 , b)
1225
- return _Add (add_t (a, b), a . impl . coeff + coeff, _merge (+ , a. impl. dict, dict, filter = _iszero))
1229
+ return _Add (add_t (a, b), coeff (a) + coeff, _merge (+ , a. impl. dict, dict, filter = _iszero))
1226
1230
elseif isadd (b)
1227
1231
return b + a
1228
1232
end
@@ -1236,7 +1240,7 @@ function +(a::Number, b::SN)
1236
1240
! issafecanon (+ , b) && return term (+ , a, b) # Don't flatten if args have metadata
1237
1241
iszero (a) && return b
1238
1242
if isadd (b)
1239
- _Add (add_t (a, b), a + b . impl . coeff, b. impl. dict)
1243
+ _Add (add_t (a, b), a + coeff (b) , b. impl. dict)
1240
1244
else
1241
1245
_Add (add_t (a, b), makeadd (1 , a, b)... )
1242
1246
end
@@ -1254,15 +1258,15 @@ function -(a::SN)
1254
1258
return term (- , a)
1255
1259
end
1256
1260
if isadd (a)
1257
- _Add (sub_t (a), - a . impl . coeff, mapvalues ((_, v) -> - v, a. impl. dict))
1261
+ _Add (sub_t (a), - coeff (a) , mapvalues ((_, v) -> - v, a. impl. dict))
1258
1262
else
1259
1263
_Add (sub_t (a), makeadd (- 1 , 0 , a)... )
1260
1264
end
1261
1265
end
1262
1266
function - (a:: SN , b:: SN )
1263
1267
(! issafecanon (+ , a) || ! issafecanon (* , b)) && return term (- , a, b)
1264
1268
if isadd (a) && isadd (b)
1265
- _Add (sub_t (a, b), a . impl . coeff - b . impl . coeff, _merge (- , a. impl. dict, b. impl. dict, filter = _iszero))
1269
+ _Add (sub_t (a, b), coeff (a) - coeff (b) , _merge (- , a. impl. dict, b. impl. dict, filter = _iszero))
1266
1270
else
1267
1271
a + (- b)
1268
1272
end
@@ -1289,16 +1293,16 @@ function *(a::SN, b::SN)
1289
1293
elseif isdiv (b)
1290
1294
_Div (a * b. impl. num, b. impl. den)
1291
1295
elseif ismul (a) && ismul (b)
1292
- _Mul (mul_t (a, b), a . impl . coeff * b . impl . coeff,
1296
+ _Mul (mul_t (a, b), coeff (a) * coeff (b) ,
1293
1297
_merge (+ , a. impl. dict, b. impl. dict, filter = _iszero))
1294
1298
elseif ismul (a) && ispow (b)
1295
1299
if b. impl. exp isa Number
1296
1300
_Mul (mul_t (a, b),
1297
- a . impl . coeff,
1301
+ coeff (a) ,
1298
1302
_merge (+ , a. impl. dict, Base. ImmutableDict (b. impl. base => b. impl. exp),
1299
1303
filter = _iszero))
1300
1304
else
1301
- _Mul (mul_t (a, b), a . impl . coeff,
1305
+ _Mul (mul_t (a, b), coeff (a) ,
1302
1306
_merge (+ , a. impl. dict, Base. ImmutableDict (b => 1 ), filter = _iszero))
1303
1307
end
1304
1308
elseif ispow (a) && ismul (b)
@@ -1321,7 +1325,7 @@ function *(a::Number, b::SN)
1321
1325
elseif isone (- a) && isadd (b)
1322
1326
# -1(a+b) -> -a - b
1323
1327
T = promote_symtype (+ , typeof (a), symtype (b))
1324
- _Add (T, b . impl . coeff * a,
1328
+ _Add (T, coeff (b) * a,
1325
1329
Dict {BasicSymbolic, Any} (k => v * a for (k, v) in b. impl. dict))
1326
1330
else
1327
1331
_Mul (mul_t (a, b), makemul (a, b)... )
@@ -1346,7 +1350,7 @@ function ^(a::SN, b)
1346
1350
elseif b isa Number && b < 0
1347
1351
_Div (1 , a^ (- b))
1348
1352
elseif ismul (a) && b isa Number
1349
- coeff = unstable_pow (a . impl . coeff, b)
1353
+ coeff = unstable_pow (coeff (a) , b)
1350
1354
_Mul (promote_symtype (^ , symtype (a), symtype (b)),
1351
1355
coeff, mapvalues ((k, v) -> b * v, a. impl. dict))
1352
1356
else
0 commit comments