Skip to content

Commit 4afd0a7

Browse files
fix: handle bug in remove_denominators
1 parent 19d9652 commit 4afd0a7

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

ext/CatalystHomotopyContinuationExtension.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import DynamicPolynomials
66
import ModelingToolkit as MT
77
import HomotopyContinuation as HC
88
import Setfield: @set
9-
import Symbolics: unwrap, wrap, Rewriters, symtype, issym
9+
import Symbolics: unwrap, wrap, Rewriters, symtype, issym, maketerm, BasicSymbolic, metadata
1010
using Symbolics: iscall
1111

1212
# Creates and exports hc_steady_states function.

ext/CatalystHomotopyContinuationExtension/homotopy_continuation_extension.jl

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function steady_state_polynomial(rs::ReactionSystem, ps, u0)
5959
eqs_pars_funcs = vcat(equations(ns), conservedequations(rs))
6060
eqs = map(eq -> substitute(eq.rhs - eq.lhs, p_dict), eqs_pars_funcs)
6161
eqs_intexp = make_int_exps.(eqs)
62-
ss_poly = Catalyst.to_multivariate_poly(remove_denominators.(eqs_intexp))
62+
ss_poly = Catalyst.to_multivariate_poly(remove_denominators.(common_denominator.(eqs_intexp)))
6363
return poly_type_convert(ss_poly)
6464
end
6565

@@ -78,6 +78,45 @@ function ___make_int_exps(expr)
7878
end
7979
end
8080

81+
function common_denominator(expr)
82+
iscall(expr) || return expr
83+
if operation(expr) == /
84+
num, den = arguments(expr)
85+
num = common_denominator(num)
86+
den = common_denominator(den)
87+
return num / den
88+
end
89+
if operation(expr) == +
90+
num = 0
91+
den = 1
92+
for arg in arguments(expr)
93+
arg = common_denominator(arg)
94+
if iscall(arg) && operation(arg) == /
95+
n, d = arguments(arg)
96+
else
97+
n = arg
98+
d = 1
99+
end
100+
num = num * d + den * n
101+
den *= d
102+
end
103+
return num / den
104+
end
105+
if operation(expr) == ^
106+
base, pow = arguments(expr)
107+
base = common_denominator(base)
108+
if iscall(base) && operation(base) == /
109+
num, den = arguments(base)
110+
else
111+
num, den = base, 1
112+
end
113+
num ^= pow
114+
den ^= pow
115+
return num / den
116+
end
117+
return maketerm(BasicSymbolic, operation(expr), map(common_denominator, arguments(expr)), metadata(expr))
118+
end
119+
81120
# If the input is a fraction, removes the denominator.
82121
function remove_denominators(expr)
83122
s_expr = simplify_fractions(expr)

0 commit comments

Comments
 (0)