Skip to content

Commit

Permalink
Fix nested diff2term edge case (#1166)
Browse files Browse the repository at this point in the history
* Fix nested diff2term edge case

* only fallback to function
  • Loading branch information
ChrisRackauckas committed Jun 9, 2024
1 parent df25344 commit ad00b58
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 5 deletions.
12 changes: 7 additions & 5 deletions src/utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -111,23 +111,25 @@ function diff2term(O, O_metadata::Union{Dict, Nothing, Base.ImmutableDict}=nothi
ds = nothing
end
d_separator = 'ˍ'
local opname

if ds === nothing
return maketerm(typeof(O), head(O), map(diff2term, children(O)),
symtype(O), O_metadata isa Nothing ?
metadata(O) : Base.ImmutableDict(metadata(O)..., O_metadata...))
else
oldop = operation(O)
if issym(oldop)
opname = string(nameof(oldop))
opname = if issym(oldop)
string(nameof(oldop))
elseif iscall(oldop) && operation(oldop) === getindex
opname = string(nameof(arguments(oldop)[1]))
args = arguments(O)
string(nameof(arguments(oldop)[1]))
elseif oldop == getindex
args = arguments(O)
opname = string(tosymbol(args[1]), "[", map(tosymbol, args[2:end])..., "]")
return Sym{symtype(O)}(Symbol(opname, d_separator, ds))
elseif oldop isa Function
return nothing
else
error("diff2term case not handled: $oldop")
end
newname = occursin(d_separator, opname) ? Symbol(opname, ds) : Symbol(opname, d_separator, ds)
return setname(maketerm(typeof(O), rename(oldop, newname), children(O), symtype(O), O_metadata isa Nothing ?
Expand Down
6 changes: 6 additions & 0 deletions test/downstream/modeling_toolkit_utils.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,9 @@ D = Differential(t)
)
)
)

@variables x y t
D = Differential(t)
Symbolics.diff2term(D(x))
Symbolics.diff2term(D(sqrt(sqrt(sqrt(+(x,y))))))
Symbolics.diff2term(D(x+y))

0 comments on commit ad00b58

Please sign in to comment.