@@ -25,6 +25,7 @@ const ENABLE_HASHCONSING = Ref(true)
25
25
@compactify show_methods= false begin
26
26
@abstract struct BasicSymbolic{T} <: Symbolic{T}
27
27
metadata:: Metadata = NO_METADATA
28
+ id:: RefValue{UInt64} = Ref {UInt64} (0 )
28
29
end
29
30
struct Sym{T} <: BasicSymbolic{T}
30
31
name:: Symbol = :OOF
@@ -114,11 +115,11 @@ function ConstructionBase.setproperties(obj::BasicSymbolic{T}, patch::NamedTuple
114
115
# Call outer constructor because hash consing cannot be applied in inner constructor
115
116
@compactified obj:: BasicSymbolic begin
116
117
Sym => Sym {T} (nt_new. name; nt_new... )
117
- Term => Term {T} (nt_new. f, nt_new. arguments; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )))
118
- Add => Add (T, nt_new. coeff, nt_new. dict; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )))
119
- Mul => Mul (T, nt_new. coeff, nt_new. dict; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )))
120
- Div => Div {T} (nt_new. num, nt_new. den, nt_new. simplified; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )))
121
- Pow => Pow {T} (nt_new. base, nt_new. exp; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )))
118
+ Term => Term {T} (nt_new. f, nt_new. arguments; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )), id = Ref {UInt64} ( 0 ) )
119
+ Add => Add (T, nt_new. coeff, nt_new. dict; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )), id = Ref {UInt64} ( 0 ) )
120
+ Mul => Mul (T, nt_new. coeff, nt_new. dict; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )), id = Ref {UInt64} ( 0 ) )
121
+ Div => Div {T} (nt_new. num, nt_new. den, nt_new. simplified; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )), id = Ref {UInt64} ( 0 ) )
122
+ Pow => Pow {T} (nt_new. base, nt_new. exp; nt_new... , hash = RefValue (UInt (0 )), hash2 = RefValue (UInt (0 )), id = Ref {UInt64} ( 0 ) )
122
123
_ => Unityper. rt_constructor (obj){T}(;nt_new... )
123
124
end
124
125
end
262
263
263
264
function Base. isequal (a:: BasicSymbolic{T} , b:: BasicSymbolic{S} ) where {T,S}
264
265
a === b && return true
266
+ a. id == b. id && a. id != 0 && return true
265
267
266
268
E = exprtype (a)
267
269
E === exprtype (b) || return false
@@ -305,6 +307,7 @@ function.
305
307
"""
306
308
function isequal_with_metadata (a:: BasicSymbolic{T} , b:: BasicSymbolic{S} ):: Bool where {T, S}
307
309
a === b && return true
310
+ a. id == b. id && a. id != 0 && return true
308
311
309
312
E = exprtype (a)
310
313
E === exprtype (b) || return false
523
526
# ## Constructors
524
527
# ##
525
528
529
+ mutable struct AtomicIDCounter
530
+ @atomic x:: UInt64
531
+ end
532
+
533
+ const ID_COUNTER = AtomicIDCounter (0 )
534
+
526
535
"""
527
536
$(TYPEDSIGNATURES)
528
537
@@ -552,6 +561,7 @@ function BasicSymbolic(s::BasicSymbolic)::BasicSymbolic
552
561
hcw = HashConsingWrapper (s)
553
562
k = getkey (cache, hcw, nothing )
554
563
if isnothing (k)
564
+ hcw. bs. id[] = @atomic ID_COUNTER. x += 1
555
565
cache[hcw] = nothing
556
566
return s
557
567
else
@@ -560,7 +570,7 @@ function BasicSymbolic(s::BasicSymbolic)::BasicSymbolic
560
570
end
561
571
562
572
function Sym {T} (name:: Symbol ; kw... ) where {T}
563
- s = Sym {T} (; name, kw... )
573
+ s = Sym {T} (; name, kw... , id = Ref {UInt} ( 0 ) )
564
574
BasicSymbolic (s)
565
575
end
566
576
@@ -576,7 +586,7 @@ function Term{T}(f, args; kw...) where T
576
586
end
577
587
unwrap_arr! (args)
578
588
579
- s = Term {T} (;f= f, arguments= args, hash= Ref (UInt (0 )), hash2= Ref (UInt (0 )), kw... )
589
+ s = Term {T} (;f= f, arguments= args, hash= Ref (UInt (0 )), hash2= Ref (UInt (0 )), kw... , id = Ref {UInt64} ( 0 ) )
580
590
BasicSymbolic (s)
581
591
end
582
592
@@ -606,7 +616,7 @@ function Add(::Type{T}, coeff, dict; metadata=NO_METADATA, kw...) where T
606
616
end
607
617
end
608
618
609
- s = Add {T} (; coeff, dict, hash= Ref (UInt (0 )), hash2= Ref (UInt (0 )), metadata, arguments= [], kw... )
619
+ s = Add {T} (; coeff, dict, hash= Ref (UInt (0 )), hash2= Ref (UInt (0 )), metadata, arguments= [], kw... , id = Ref {UInt64} ( 0 ) )
610
620
BasicSymbolic (s)
611
621
end
612
622
@@ -624,7 +634,7 @@ function Mul(T, a, b; metadata=NO_METADATA, kw...)
624
634
else
625
635
coeff = a
626
636
dict = b
627
- s = Mul {T} (; coeff, dict, hash= Ref (UInt (0 )), hash2= Ref (UInt (0 )), metadata, arguments= [], kw... )
637
+ s = Mul {T} (; coeff, dict, hash= Ref (UInt (0 )), hash2= Ref (UInt (0 )), metadata, arguments= [], kw... , id = Ref {UInt64} ( 0 ) )
628
638
BasicSymbolic (s)
629
639
end
630
640
end
@@ -692,7 +702,7 @@ function Div{T}(n, d, simplified=false; metadata=nothing, kwargs...) where {T}
692
702
end
693
703
end
694
704
695
- s = Div {T} (; num= n, den= d, simplified, arguments= [], metadata)
705
+ s = Div {T} (; num= n, den= d, simplified, arguments= [], metadata, id = Ref {UInt64} ( 0 ) )
696
706
BasicSymbolic (s)
697
707
end
698
708
@@ -712,7 +722,7 @@ function Pow{T}(a, b; metadata=NO_METADATA, kwargs...) where {T}
712
722
b = unwrap (b)
713
723
_iszero (b) && return 1
714
724
_isone (b) && return a
715
- s = Pow {T} (; base= a, exp= b, arguments= [], metadata)
725
+ s = Pow {T} (; base= a, exp= b, arguments= [], metadata, id = Ref {UInt64} ( 0 ) )
716
726
BasicSymbolic (s)
717
727
end
718
728
0 commit comments