Skip to content

Commit 5c11dfb

Browse files
committed
more code to do less
1 parent 4e35bae commit 5c11dfb

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/polyform.jl

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ function simplify_div(d::Div)
251251
if all(_isone, ds)
252252
return isempty(ns) ? 1 : simplify_fractions(_mul(ns))
253253
else
254-
return Div(simplify_fractions(_mul(ns)), simplify_fractions(_mul(ds)), true)
254+
Div(simplify_fractions(_mul(ns)), simplify_fractions(_mul(ds)), true)
255255
end
256256
end
257257

@@ -269,19 +269,24 @@ Find `Div` nodes and simplify them by cancelling a set of factors of numerators
269269
and denominators. It may leave some expressions in `PolyForm` format.
270270
"""
271271
function simplify_fractions(x)
272-
x = quick_cancel(x)
272+
x = Postwalk(quick_cancel)(x)
273273

274-
!has_div(x) && return x
274+
!needs_div_rules(x) && return x
275275

276276
isdiv(x) = x isa Div
277277

278-
rules = [@rule ~x::isdiv => quick_cancel(~x)
279-
@rule ~x::isdiv => simplify_div(~x)
278+
rules = [@rule ~x::isdiv => simplify_div(~x)
280279
@acrule ~a::isdiv + ~b::isdiv => add_divs(~a,~b)]
281280

282281
Fixpoint(Postwalk(Chain(rules)))(x)
283282
end
284283

284+
function needs_div_rules(x)
285+
(x isa Div && !(x.num isa Number) && !(x.den isa Number)) ||
286+
(istree(x) && operation(x) === (+) && count(has_div, unsorted_arguments(x)) > 1) ||
287+
(istree(x) && any(needs_div_rules, unsorted_arguments(x)))
288+
end
289+
285290
function has_div(x)
286291
return x isa Div || (istree(x) && any(has_div, unsorted_arguments(x)))
287292
end

0 commit comments

Comments
 (0)