@@ -72,6 +72,10 @@ function get_coeff(x::BasicSymbolic)
72
72
x. impl. coeff
73
73
end
74
74
75
+ function get_dict (x:: BasicSymbolic )
76
+ x. impl. dict
77
+ end
78
+
75
79
# Same but different error messages
76
80
@noinline error_on_type () = error (" Internal error: unreachable reached!" )
77
81
@noinline error_sym () = error (" Sym doesn't have a operation or arguments!" )
@@ -297,7 +301,7 @@ function _isequal(a, b, E)
297
301
if E === SYM
298
302
nameof (a) === nameof (b)
299
303
elseif E === ADD || E === MUL
300
- coeff_isequal (get_coeff (a), get_coeff (b)) && isequal (a . impl . dict, b . impl . dict )
304
+ coeff_isequal (get_coeff (a), get_coeff (b)) && isequal (get_dict (a), get_dict (b) )
301
305
elseif E === DIV
302
306
isequal (a. impl. num, b. impl. num) && isequal (a. impl. den, b. impl. den)
303
307
elseif E === POW
@@ -341,7 +345,7 @@ function Base.hash(s::BasicSymbolic, salt::UInt)::UInt
341
345
h = s. hash[]
342
346
! iszero (h) && return h
343
347
hashoffset = isadd (s) ? ADD_SALT : SUB_SALT
344
- h′ = hash (hashoffset, hash (get_coeff (s), hash (s . impl . dict , salt)))
348
+ h′ = hash (hashoffset, hash (get_coeff (s), hash (get_dict (s) , salt)))
345
349
s. hash[] = h′
346
350
return h′
347
351
elseif E === DIV
@@ -461,7 +465,7 @@ function maybe_intcoeff(x)
461
465
if ismul (x)
462
466
coeff = get_coeff (x)
463
467
if coeff isa Rational && isone (denominator (coeff))
464
- _Mul (symtype (x), coeff. num, x . impl . dict ; metadata = x. metadata)
468
+ _Mul (symtype (x), coeff. num, get_dict (x) ; metadata = x. metadata)
465
469
else
466
470
x
467
471
end
@@ -542,7 +546,7 @@ function toterm(t::BasicSymbolic{T}) where {T}
542
546
elseif E === ADD || E === MUL
543
547
args = BasicSymbolic[]
544
548
push! (args, get_coeff (t))
545
- for (k, coeff) in t . impl . dict
549
+ for (k, coeff) in get_dict (t)
546
550
push! (
547
551
args, coeff == 1 ? k : _Term (T, E === MUL ? (^ ) : (* ), [_Const (coeff), k]))
548
552
end
@@ -567,15 +571,15 @@ function makeadd(sign, coeff, xs...)
567
571
for x in xs
568
572
if isadd (x)
569
573
coeff += get_coeff (x)
570
- _merge! (+ , d, x . impl . dict , filter = _iszero)
574
+ _merge! (+ , d, get_dict (x) , filter = _iszero)
571
575
continue
572
576
end
573
577
if x isa Number
574
578
coeff += x
575
579
continue
576
580
end
577
581
if ismul (x)
578
- k = _Mul (symtype (x), 1 , x . impl . dict )
582
+ k = _Mul (symtype (x), 1 , get_dict (x) )
579
583
v = sign * get_coeff (x) + get (d, k, 0 )
580
584
else
581
585
k = x
@@ -598,7 +602,7 @@ function makemul(coeff, xs...; d = Dict{BasicSymbolic, Any}())
598
602
coeff *= x
599
603
elseif ismul (x)
600
604
coeff *= get_coeff (x)
601
- _merge! (+ , d, x . impl . dict , filter = _iszero)
605
+ _merge! (+ , d, get_dict (x) , filter = _iszero)
602
606
else
603
607
v = 1 + get (d, x, 0 )
604
608
if _iszero (v)
@@ -1223,10 +1227,10 @@ function +(a::SN, b::SN)
1223
1227
! issafecanon (+ , a, b) && return term (+ , a, b) # Don't flatten if args have metadata
1224
1228
if isadd (a) && isadd (b)
1225
1229
return _Add (
1226
- add_t (a, b), get_coeff (a) + get_coeff (b), _merge (+ , a . impl . dict, b . impl . dict , filter = _iszero))
1230
+ add_t (a, b), get_coeff (a) + get_coeff (b), _merge (+ , get_dict (a), get_dict (b) , filter = _iszero))
1227
1231
elseif isadd (a)
1228
1232
coeff, dict = makeadd (1 , 0 , b)
1229
- return _Add (add_t (a, b), get_coeff (a) + coeff, _merge (+ , a . impl . dict , dict, filter = _iszero))
1233
+ return _Add (add_t (a, b), get_coeff (a) + coeff, _merge (+ , get_dict (a) , dict, filter = _iszero))
1230
1234
elseif isadd (b)
1231
1235
return b + a
1232
1236
end
@@ -1240,7 +1244,7 @@ function +(a::Number, b::SN)
1240
1244
! issafecanon (+ , b) && return term (+ , a, b) # Don't flatten if args have metadata
1241
1245
iszero (a) && return b
1242
1246
if isadd (b)
1243
- _Add (add_t (a, b), a + get_coeff (b), b . impl . dict )
1247
+ _Add (add_t (a, b), a + get_coeff (b), get_dict (b) )
1244
1248
else
1245
1249
_Add (add_t (a, b), makeadd (1 , a, b)... )
1246
1250
end
@@ -1258,15 +1262,15 @@ function -(a::SN)
1258
1262
return term (- , a)
1259
1263
end
1260
1264
if isadd (a)
1261
- _Add (sub_t (a), - get_coeff (a), mapvalues ((_, v) -> - v, a . impl . dict ))
1265
+ _Add (sub_t (a), - get_coeff (a), mapvalues ((_, v) -> - v, get_dict (a) ))
1262
1266
else
1263
1267
_Add (sub_t (a), makeadd (- 1 , 0 , a)... )
1264
1268
end
1265
1269
end
1266
1270
function - (a:: SN , b:: SN )
1267
1271
(! issafecanon (+ , a) || ! issafecanon (* , b)) && return term (- , a, b)
1268
1272
if isadd (a) && isadd (b)
1269
- _Add (sub_t (a, b), get_coeff (a) - get_coeff (b), _merge (- , a . impl . dict, b . impl . dict , filter = _iszero))
1273
+ _Add (sub_t (a, b), get_coeff (a) - get_coeff (b), _merge (- , get_dict (a), get_dict (b) , filter = _iszero))
1270
1274
else
1271
1275
a + (- b)
1272
1276
end
@@ -1294,16 +1298,16 @@ function *(a::SN, b::SN)
1294
1298
_Div (a * b. impl. num, b. impl. den)
1295
1299
elseif ismul (a) && ismul (b)
1296
1300
_Mul (mul_t (a, b), get_coeff (a) * get_coeff (b),
1297
- _merge (+ , a . impl . dict, b . impl . dict , filter = _iszero))
1301
+ _merge (+ , get_dict (a), get_dict (b) , filter = _iszero))
1298
1302
elseif ismul (a) && ispow (b)
1299
1303
if b. impl. exp isa Number
1300
1304
_Mul (mul_t (a, b),
1301
1305
get_coeff (a),
1302
- _merge (+ , a . impl . dict , Base. ImmutableDict (b. impl. base => b. impl. exp),
1306
+ _merge (+ , get_dict (a) , Base. ImmutableDict (b. impl. base => b. impl. exp),
1303
1307
filter = _iszero))
1304
1308
else
1305
1309
_Mul (mul_t (a, b), get_coeff (a),
1306
- _merge (+ , a . impl . dict , Base. ImmutableDict (b => 1 ), filter = _iszero))
1310
+ _merge (+ , get_dict (a) , Base. ImmutableDict (b => 1 ), filter = _iszero))
1307
1311
end
1308
1312
elseif ispow (a) && ismul (b)
1309
1313
b * a
@@ -1326,7 +1330,7 @@ function *(a::Number, b::SN)
1326
1330
# -1(a+b) -> -a - b
1327
1331
T = promote_symtype (+ , typeof (a), symtype (b))
1328
1332
_Add (T, get_coeff (b) * a,
1329
- Dict {BasicSymbolic, Any} (k => v * a for (k, v) in b . impl . dict ))
1333
+ Dict {BasicSymbolic, Any} (k => v * a for (k, v) in get_dict (b) ))
1330
1334
else
1331
1335
_Mul (mul_t (a, b), makemul (a, b)... )
1332
1336
end
@@ -1352,7 +1356,7 @@ function ^(a::SN, b)
1352
1356
elseif ismul (a) && b isa Number
1353
1357
coeff = unstable_pow (get_coeff (a), b)
1354
1358
_Mul (promote_symtype (^ , symtype (a), symtype (b)),
1355
- coeff, mapvalues ((k, v) -> b * v, a . impl . dict ))
1359
+ coeff, mapvalues ((k, v) -> b * v, get_dict (a) ))
1356
1360
else
1357
1361
_Pow (a, b)
1358
1362
end
0 commit comments