8080
8181guard_zero (x) = isequal (x, 0 ) ? one (x) : x
8282
83+ # The core of ansatz generation.
84+ # The name is not accurate and should be changed (not really homotopy,
85+ # just inspired from!)
8386function generate_homotopy (eq, x)
8487 eq = value (eq)
8588 x = value (x)
@@ -95,7 +98,7 @@ function generate_homotopy(eq, x)
9598 for i in 1 : length (ks)
9699 μ = u[i]
97100 y, dy = apply_partial_int_rules (sub[μ], x)
98-
101+
99102 y = substitute (y, sub)
100103 ∂y = guard_zero (diff (dy, x))
101104
@@ -157,8 +160,9 @@ partial_int_rules = [
157160 @rule 𝛷 (~ x, asech (~ u)) => (asech (~ u), ~ u)
158161 @rule 𝛷 (~ x, acoth (~ u)) => (~ u * acot (~ u) + log (~ u + 1 ), ~ u)
159162# logarithmic and exponential functions
160- @rule 𝛷 (~ x, log (~ u)) => (~ u + ~ u * log (~ u) + sum (pow_minus_rule (~ u, ~ x, - 1 ); init = one (~ u)),
161- ~ u);
163+ @rule 𝛷 (~ x, log (~ u)) => (~ u + ~ u * log (~ u) +
164+ sum (pow_minus_rule (~ u, ~ x, - 1 ); init = one (~ u)),
165+ ~ u)
162166 @rule 𝛷 (~ x, 1 / log (~ u)) => (log (log (~ u)) + li (~ u), ~ u)
163167 @rule 𝛷 (~ x, exp (~ u)) => (exp (~ u) + ei (~ u) + erfi_ (~ x), ~ u)
164168 @rule 𝛷 (~ x, ^ (exp (~ u), ~ k:: is_neg )) => (^ (exp (- ~ u), - ~ k), ~ u)
@@ -167,10 +171,13 @@ partial_int_rules = [
167171 @rule 𝛷 (~ x, sqrt (~ u)) => (sum (sqrt_rule (~ u, ~ x, 0.5 ); init = one (~ u)), ~ u);
168172 @rule 𝛷 (~ x, 1 / sqrt (~ u)) => (sum (sqrt_rule (~ u, ~ x, - 0.5 ); init = one (~ u)), ~ u);
169173# rational functions
170- @rule 𝛷 (~ x, 1 / ^ (~ u:: is_univar_poly , ~ k:: is_pos_int )) => (sum (pow_minus_rule (~ u, ~ x, - ~ k);
174+ @rule 𝛷 (~ x, 1 / ^ (~ u:: is_univar_poly , ~ k:: is_pos_int )) => (sum (pow_minus_rule (~ u,
175+ ~ x,
176+ - ~ k);
171177 init = one (~ u)),
178+ ~ u)
179+ @rule 𝛷 (~ x, 1 / ~ u:: is_univar_poly ) => (sum (pow_minus_rule (~ u, ~ x, - 1 ); init = one (~ u)),
172180 ~ u);
173- @rule 𝛷 (~ x, 1 / ~ u:: is_univar_poly ) => (sum (pow_minus_rule (~ u, ~ x, - 1 ); init = one (~ u)), ~ u);
174181 @rule 𝛷 (~ x, ^ (~ u, - 1 )) => (log (~ u) + ~ u * log (~ u), ~ u)
175182 @rule 𝛷 (~ x, ^ (~ u, ~ k:: is_neg_int )) => (sum (^ (~ u, i) for i in (~ k + 1 ): - 1 ), ~ u)
176183 @rule 𝛷 (~ x, 1 / ~ u) => (log (~ u), ~ u)
187194
188195function pow_minus_rule (p, x, k; abstol = 1e-8 )
189196 if ! is_univar_poly (p)
190- return [p^ k, p^ (k + 1 ), log (p), p* log (p)]
197+ return [p^ k, p^ (k + 1 ), log (p), p * log (p)]
191198 end
192199
193200 # x = var(p)
@@ -203,7 +210,7 @@ function pow_minus_rule(p, x, k; abstol = 1e-8)
203210 r = nice_parameter .(r)
204211 s = nice_parameter .(s)
205212
206- # ∫ 1 / ((x-z₁)(x-z₂)) dx = ... + c₁ * log(x-z₁) + c₂ * log(x-z₂)
213+ # applying ∫ 1 / ((x-z₁)(x-z₂)) dx = ... + c₁ * log(x-z₁) + c₂ * log(x-z₂)
207214 q = Any[log (x - u) for u in r]
208215 for i in eachindex (s)
209216 β = s[i]
225232
226233function sqrt_rule (p, x, k)
227234 h = Any[p^ k, p^ (k + 1 )]
228-
235+
229236 Δ = diff (p, x)
230- push! (h, log (Δ/ 2 + sqrt (p)))
237+ push! (h, log (Δ / 2 + sqrt (p)))
231238
232239 if ! is_univar_poly (p)
233240 return h
@@ -254,4 +261,3 @@ function sqrt_rule(p, x, k)
254261
255262 return h
256263end
257-
0 commit comments