@@ -36,78 +36,59 @@ function SciMLBase.solve(prob::IntervalNonlinearProblem{IP, Tuple{T, T}}, alg::I
3636    ϵ =  eps (T)
3737    if  iszero (fl)
3838        return  SciMLBase. build_solution (prob, alg, left, fl;
39-             retcode =  ReturnCode. ExactSolutionLeft, left =  left,
40-             right =  right)
39+             retcode =  ReturnCode. ExactSolutionLeft, left, right)
4140    elseif  iszero (fr)
4241        return  SciMLBase. build_solution (prob, alg, right, fr;
43-             retcode =  ReturnCode. ExactSolutionRight, left =  left,
44-             right =  right)
42+             retcode =  ReturnCode. ExactSolutionRight, left, right)
4543    end 
46-     # defining variables/cache
47-     k1 =  T (alg. k1)
4844    k2 =  T (alg. k2)
45+     span =  abs (right -  left)
46+     k1 =  T (alg. alg_k1)
4947    n0 =  T (alg. n0)
50-     n_h =  ceil (log2 (abs (right -  left) /  (2  *  ϵ)))
51-     mid =  (left +  right) /  2 
52-     x_f =  (fr *  left -  fl *  right) /  (fr -  fl)
53-     xt =  left
54-     xp =  left
55-     r =  zero (left) # minmax radius
56-     δ =  zero (left) #  truncation error
57-     σ =  1.0 
58-     ϵ_s =  ϵ *  2 ^ (n_h +  n0)
59-     i =  0  # iteration
60-     while  i <=  maxiters
61-         # mid = (left + right) / 2
48+     n_h =  exponent (span /  (2  *  ϵ))
49+     ϵ_s =  ϵ *  exp2 (n_h +  n0)
50+     T0 =  zero (fl)
51+ 
52+     i =  1 
53+     while  i ≤  maxiters
54+         stats. nsteps +=  1 
6255        span =  abs (right -  left)
56+         mid =  (left +  right) /  2 
6357        r =  ϵ_s -  (span /  2 )
64-         δ =  k1 *  (span^ k2)
6558
66-         # # Interpolation step ##
67-         x_f =  left +  (right -  left) *  (fl /  (fl -  fr))
59+         x_f =  left +  span *  (fl /  (fl -  fr))  #  Interpolation Step
6860
69-         # # Truncation step ##
70-         σ =  sign (mid -  x_f)
71-         if  δ <=  abs (mid -  x_f)
72-             xt =  x_f +  (σ *  δ)
73-         else 
74-             xt =  mid
75-         end 
61+         δ =  max (k1 *  span^ k2, eps (x_f))
62+         diff =  mid -  x_f
7663
77-         # # Projection step ##
78-         if  abs (xt -  mid) <=  r
79-             xp =  xt
80-         else 
81-             xp =  mid -  (σ *  r)
82-         end 
64+         xt =  ifelse (δ ≤  abs (diff), x_f +  copysign (δ, diff), mid)  #  Truncation Step
8365
84-         # # Update ##
85-         tmin, tmax =  minmax (left, right)
86-         xp >=  tmax &&  (xp =  prevfloat (tmax))
87-         xp <=  tmin &&  (xp =  nextfloat (tmin))
66+         xp =  ifelse (abs (xt -  mid) ≤  r, xt, mid -  copysign (r, diff))  #  Projection Step
67+         if  span <  2 ϵ
68+             return  SciMLBase. build_solution (
69+                 prob, alg, xt, f (xt); retcode =  ReturnCode. Success, left, right
70+             )
71+         end 
8872        yp =  f (xp)
73+         stats. nf +=  1 
8974        yps =  yp *  sign (fr)
90-         if  yps >  0 
91-             right =  xp
92-             fr =  yp
93-         elseif  yps <  0 
94-             left =  xp
95-             fl =  yp
75+         if  yps >  T0
76+             right, fr =  xp, yp
77+         elseif  yps <  T0
78+             left, fl =  xp, yp
9679        else 
97-             left =  prevfloat_tdir (xp, prob. tspan... )
98-             right =  xp
99-             return  SciMLBase. build_solution (prob, alg, left, f (left);
100-                 retcode =  ReturnCode. Success, left =  left,
101-                 right =  right)
80+             return  SciMLBase. build_solution (
81+                 prob, alg, xp, yps; retcode =  ReturnCode. Success, left, right
82+             )
10283        end 
84+ 
10385        i +=  1 
104-         mid =  (left +  right) /  2 
10586        ϵ_s /=  2 
10687
107-         if  nextfloat_tdir (left, prob . tspan ... ) ==  right
108-             return  SciMLBase. build_solution (prob, alg, left, fl; 
109-                 retcode =  ReturnCode. FloatingPointLimit, left  =  left, 
110-                 right  =  right )
88+         if  nextfloat_tdir (left, left, right ) ==  right
89+             return  SciMLBase. build_solution (
90+                 prob, alg, right, fr;  retcode =  ReturnCode. FloatingPointLimit, left, right 
91+             )
11192        end 
11293    end 
11394    return  SciMLBase. build_solution (prob, alg, left, fl; retcode =  ReturnCode. MaxIters,
0 commit comments