@@ -799,35 +799,51 @@ end
799799# Symbolics needs to call unwrap on the substitution rules, but most of the time
800800# we don't want to do that in MTK.
801801const Eq = Union{Equation, Inequality}
802- function fast_substitute (eq:: Eq , subs)
802+ function fast_substitute (eq:: Eq , subs; operator = Nothing )
803803 if eq isa Inequality
804- Inequality (fast_substitute (eq. lhs, subs), fast_substitute (eq. rhs, subs),
804+ Inequality (fast_substitute (eq. lhs, subs; operator),
805+ fast_substitute (eq. rhs, subs; operator),
805806 eq. relational_op)
806807 else
807- Equation (fast_substitute (eq. lhs, subs), fast_substitute (eq. rhs, subs))
808+ Equation (fast_substitute (eq. lhs, subs; operator),
809+ fast_substitute (eq. rhs, subs; operator))
808810 end
809811end
810- function fast_substitute (eq:: T , subs:: Pair ) where {T <: Eq }
811- T (fast_substitute (eq. lhs, subs), fast_substitute (eq. rhs, subs))
812+ function fast_substitute (eq:: T , subs:: Pair ; operator = Nothing ) where {T <: Eq }
813+ T (fast_substitute (eq. lhs, subs; operator ), fast_substitute (eq. rhs, subs; operator ))
812814end
813- fast_substitute (eqs:: AbstractArray , subs) = fast_substitute .(eqs, (subs,))
814- fast_substitute (a, b) = substitute (a, b)
815- function fast_substitute (expr, pair:: Pair )
815+ function fast_substitute (eqs:: AbstractArray , subs; operator = Nothing)
816+ fast_substitute .(eqs, (subs,); operator)
817+ end
818+ function fast_substitute (a, b; operator = Nothing)
819+ b = Dict (value (k) => value (v) for (k, v) in b)
820+ a = value (a)
821+ haskey (b, a) && return b[a]
822+ for _b in b
823+ a = fast_substitute (a, _b; operator)
824+ end
825+ a
826+ end
827+ function fast_substitute (expr, pair:: Pair ; operator = Nothing)
816828 a, b = pair
829+ a = value (a)
830+ b = value (b)
817831 isequal (expr, a) && return b
818832
819833 istree (expr) || return expr
820- op = fast_substitute (operation (expr), pair)
821- canfold = Ref (! (op isa Symbolic))
822- args = let canfold = canfold
823- map (SymbolicUtils. unsorted_arguments (expr)) do x
824- x′ = fast_substitute (x, pair)
825- canfold[] = canfold[] && ! (x′ isa Symbolic)
826- x′
834+ op = fast_substitute (operation (expr), pair; operator)
835+ args = SymbolicUtils. unsorted_arguments (expr)
836+ if ! (op isa operator)
837+ canfold = Ref (! (op isa Symbolic))
838+ args = let canfold = canfold
839+ map (args) do x
840+ x′ = fast_substitute (x, pair; operator)
841+ canfold[] = canfold[] && ! (x′ isa Symbolic)
842+ x′
843+ end
827844 end
845+ canfold[] && return op (args... )
828846 end
829- canfold[] && return op (args... )
830-
831847 similarterm (expr,
832848 op,
833849 args,
0 commit comments