@@ -56,20 +56,20 @@ Returns a tuple of (solved, unsolved, err) if `detailed == true`, where
5656Returns the resulting integral or nothing if `detailed == false`
5757"""
5858function integrate (eq, x = nothing ;
59- abstol = 1e-6 ,
60- num_steps = 2 ,
61- num_trials = 10 ,
62- radius = 5.0 ,
63- show_basis = false ,
64- opt = STLSQ (exp .(- 10 : 1 : 0 )),
65- bypass = false ,
66- symbolic = false ,
67- max_basis = 100 ,
68- verbose = false ,
69- complex_plane = true ,
70- homotopy = true ,
71- use_optim = false ,
72- detailed = true )
59+ abstol = 1e-6 ,
60+ num_steps = 2 ,
61+ num_trials = 10 ,
62+ radius = 5.0 ,
63+ show_basis = false ,
64+ opt = STLSQ (exp .(- 10 : 1 : 0 )),
65+ bypass = false ,
66+ symbolic = false ,
67+ max_basis = 100 ,
68+ verbose = false ,
69+ complex_plane = true ,
70+ homotopy = true ,
71+ use_optim = false ,
72+ detailed = true )
7373 deprecation_warnings (; homotopy, use_optim)
7474
7575 eq = expand (eq)
@@ -130,6 +130,32 @@ function integrate(eq, xx::Tuple; kwargs...)
130130 return nothing
131131end
132132
133+ function get_solved (p, sol)
134+ if sol isa Tuple
135+ s = sol[1 ]
136+ return s == nothing ? 0 : s
137+ else
138+ return sol == nothing ? 0 : sol
139+ end
140+ end
141+
142+ function get_unsolved (p, sol)
143+ if sol isa Tuple
144+ u = sol[2 ]
145+ return u == nothing ? 0 : u
146+ else
147+ return sol == 0 || sol == nothing ? p : 0
148+ end
149+ end
150+
151+ function get_err (p, sol)
152+ if sol isa Tuple
153+ return sol[3 ]
154+ else
155+ return sol == 0 || sol == nothing ? Inf : 0
156+ end
157+ end
158+
133159# integrate_sum applies the integral summation rule ∫ Σᵢ fᵢ(x) dx = Σᵢ ∫ fᵢ(x) dx
134160function integrate_sum (eq, x; bypass = false , kwargs... )
135161 solved = 0
@@ -138,10 +164,10 @@ function integrate_sum(eq, x; bypass = false, kwargs...)
138164 ts = bypass ? [eq] : terms (eq)
139165
140166 for p in ts
141- s, u, ε = integrate_term (p, x; kwargs... )
142- solved += s
143- unsolved += u
144- ε₀ = max (ε₀, ε )
167+ sol = integrate_term (p, x; kwargs... )
168+ solved += get_solved (p, sol)
169+ unsolved += get_unsolved (p, sol)
170+ ε₀ = max (ε₀, get_err (p, sol) )
145171 end
146172
147173 if ! isequal (unsolved, 0 ) && isempty (sym_consts (unsolved, x))
@@ -154,10 +180,10 @@ function integrate_sum(eq, x; bypass = false, kwargs...)
154180 ts = bypass ? [eq] : terms (eq)
155181
156182 for p in ts
157- s, u, ε = integrate_term (p, x; kwargs... )
158- solved += s
159- unsolved += u
160- ε₀ = max (ε₀, ε )
183+ sol = integrate_term (p, x; kwargs... )
184+ solved += get_solved (p, sol)
185+ unsolved += get_unsolved (p, sol)
186+ ε₀ = max (ε₀, get_err (p, sol) )
161187
162188 if ! isequal (u, 0 ) # premature termination on the first failure
163189 return 0 , eq, ε₀
0 commit comments