@@ -17,15 +17,15 @@ quadgl(f,a,b;x=xg32,w=wg32) = (b-a)/2*quadgl(t->f((b+a)/2+t*(b-a)/2);x,w)
1717"""
1818 complex_path(g,dg,rngs;atol=1e-3,γ=one,f=Im(γ*exp(im*g)))
1919
20- Estimate the integral `∫f(t)dt` from `t=[-∞,∞]` using a complex path, see Gibbs 2024. The
21- finite phase ranges `rngs` are integrated along the real line with QuadGK. The range end
20+ Estimate the integral `∫f(t)dt` from `t=[-∞,∞]` using a complex path, see Gibbs 2024. The
21+ finite phase ranges `rngs` are integrated along the real line with QuadGK. The range end
2222points where `flag=true` are integrated to ±∞ in the complex-plane using `±nsp(t₀,g,dg,γ)`.
2323"""
2424@inline function complex_path(g,dg,rngs;γ= one,
2525 f = t-> ((u,v)= reim(g(t)); @fastmath γ(t)* exp(- v)* sin(u)))
2626
2727 # Sum the flagged endpoints and interval contributions
28- val = zero(rngs[1 ][1 ])
28+ val = zero(f( rngs[1 ][1 ]) )
2929 for i in 1 : 2 : length(rngs)
3030 (t₁,∞₁),(t₂,∞₂) = rngs[i],rngs[i+ 1 ]
3131 ∞₁ && (val -= nsp(t₁,g,dg,γ))
@@ -62,15 +62,14 @@ such that `|g(a)-g(aᵢ)|≈Δg`. Ranges do no overlap and limited to `±R`. "Un
6262`fᵢ=false` if `aᵢ=±R`.
6363"""
6464function finite_ranges(S:: NTuple{N} , g, Δg, R; atol= Δg/ 10 ) where N
65- Sv, Rv, gv = map(value,S), value(R), t-> value(g(t)) # no Duals
6665 # helper functions to offset the phase and flag if there's no root
67- dg(a) = t-> abs(gv (a)- gv (t))- Δg
68- no(a,b) = abs(gv (a)- gv (b)) ≤ Δg+ atol
66+ dg(a) = t-> abs(g (a)- g (t))- Δg
67+ no(a,b) = abs(g (a)- g (b)) ≤ Δg+ atol
6968 # find roots of dg using brackets (Order0) or secant method (Order1)
7069 fz0(a,b) = no(a,b) ? (return b, false ) : (find_zero(dg(a), (a,b), Order0()), true )
71- fz1(a,b) = (isfinite(b) && no(a,b)) ? (return b, false ) : (find_zero(dg(a), (a,a+ copysign(1 ,b)), Order1(); atol), true )
70+ fz1(a,b) = (isfinite(b) && no(a,b)) ? (return b, false ) : (find_zero(dg(a), (a,a+ copysign(1 ,b)), Order1(); atol), true )
7271 # return flagged sub-range
73- (fz1(first(Sv ), - Rv ), mid_ranges(Val(N), Sv , fz0). .. , fz1(last(Sv ), Rv ))
72+ (fz1(first(S ), - R ), mid_ranges(Val(N), S , fz0). .. , fz1(last(S ), R ))
7473end
7574using TupleTools
7675mid_ranges(:: Val{N} , S, fz) where N = TupleTools. vcat(ntuple(N- 1 ) do i
0 commit comments