Average Error: 13.8 → 1.0
Time: 18.8s
Precision: 64
Internal Precision: 128
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[\begin{array}{l} \mathbf{if}\;wj \le 7.274594866092093 \cdot 10^{-10}:\\ \;\;\;\;\left(x + {wj}^{2}\right) - 2 \cdot \left(x \cdot wj\right)\\ \mathbf{else}:\\ \;\;\;\;wj - \left(\frac{1}{wj + 1} \cdot wj - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\\ \end{array}\]

Error

Bits error versus wj

Bits error versus x

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original13.8
Target13.2
Herbie1.0
\[wj - \left(\frac{wj}{wj + 1} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\]

Derivation

  1. Split input into 2 regimes
  2. if wj < 7.274594866092093e-10

    1. Initial program 13.5

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Taylor expanded around 0 1.0

      \[\leadsto \color{blue}{\left({wj}^{2} + x\right) - 2 \cdot \left(x \cdot wj\right)}\]

    if 7.274594866092093e-10 < wj

    1. Initial program 21.3

      \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
    2. Using strategy rm
    3. Applied div-sub21.3

      \[\leadsto wj - \color{blue}{\left(\frac{wj \cdot e^{wj}}{e^{wj} + wj \cdot e^{wj}} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)}\]
    4. Simplified3.2

      \[\leadsto wj - \left(\color{blue}{\frac{wj}{1 + wj}} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\]
    5. Using strategy rm
    6. Applied div-inv3.1

      \[\leadsto wj - \left(\color{blue}{wj \cdot \frac{1}{1 + wj}} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\]
  3. Recombined 2 regimes into one program.
  4. Final simplification1.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;wj \le 7.274594866092093 \cdot 10^{-10}:\\ \;\;\;\;\left(x + {wj}^{2}\right) - 2 \cdot \left(x \cdot wj\right)\\ \mathbf{else}:\\ \;\;\;\;wj - \left(\frac{1}{wj + 1} \cdot wj - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019008 
(FPCore (wj x)
  :name "Jmat.Real.lambertw, newton loop step"

  :herbie-target
  (- wj (- (/ wj (+ wj 1)) (/ x (+ (exp wj) (* wj (exp wj))))))

  (- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))))

Details

Time bar (total: 18.2s)Debug log

sample252.0ms

Algorithm
intervals

simplify167.0ms

Counts
1 → 1
Calls

1 calls. Slowest were:

167.0ms
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj)))))

prune10.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 16.3b

localize33.0ms

Local error

Found 4 expressions with local error:

6.0b
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj)))))
1.5b
(/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))
0.0b
(* wj (exp wj))
0.0b
(* wj (exp wj))

rewrite23.0ms

Algorithm
rewrite-expression-head
Counts
4 → 74
Calls

4 calls. Slowest were:

16.0ms
(/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))
2.0ms
(* wj (exp wj))
2.0ms
(* wj (exp wj))

series175.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

60.0ms
(/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))
60.0ms
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj)))))
28.0ms
(* wj (exp wj))
27.0ms
(* wj (exp wj))

simplify3.3s

Counts
63 → 86
Calls

63 calls. Slowest were:

785.0ms
(/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj))))
759.0ms
(/ (* wj (exp wj)) (+ (exp wj) (* wj (exp wj))))
146.0ms
(+ (* (exp wj) (exp wj)) (- (* (* wj (exp wj)) (* wj (exp wj))) (* (exp wj) (* wj (exp wj)))))

prune730.0ms

Pruning

4 alts after pruning (4 fresh and 0 done)

Merged error: 0.4b

localize13.0ms

Local error

Found 3 expressions with local error:

0.0b
(+ (pow wj 2) x)
0.0b
(- (+ (pow wj 2) x) (* 2 (* x wj)))
0.0b
(* 2 (* x wj))

rewrite36.0ms

Algorithm
rewrite-expression-head
Counts
3 → 32
Calls

3 calls. Slowest were:

31.0ms
(- (+ (pow wj 2) x) (* 2 (* x wj)))
2.0ms
(+ (pow wj 2) x)
2.0ms
(* 2 (* x wj))

series54.0ms

Counts
3 → 9
Calls

3 calls. Slowest were:

24.0ms
(- (+ (pow wj 2) x) (* 2 (* x wj)))
19.0ms
(+ (pow wj 2) x)
11.0ms
(* 2 (* x wj))

simplify418.0ms

Counts
11 → 41
Calls

11 calls. Slowest were:

161.0ms
(/ (exp (+ (pow wj 2) x)) (exp (* 2 (* x wj))))
81.0ms
(- (+ (pow wj 2) x) (* 2 (* x wj)))
80.0ms
(- (+ x (pow wj 2)) (* 2 (* x wj)))

prune316.0ms

Pruning

5 alts after pruning (4 fresh and 1 done)

Merged error: 0.4b

localize18.0ms

Local error

Found 4 expressions with local error:

6.0b
(- wj (- (/ wj (+ 1 wj)) (/ x (+ (exp wj) (* wj (exp wj))))))
0.0b
(/ wj (+ 1 wj))
0.0b
(/ x (+ (exp wj) (* wj (exp wj))))
0.0b
(* wj (exp wj))

rewrite8.0ms

Algorithm
rewrite-expression-head
Counts
4 → 57
Calls

4 calls. Slowest were:

3.0ms
(/ x (+ (exp wj) (* wj (exp wj))))
1.0ms
(- wj (- (/ wj (+ 1 wj)) (/ x (+ (exp wj) (* wj (exp wj))))))
1.0ms
(/ wj (+ 1 wj))

series172.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

80.0ms
(/ x (+ (exp wj) (* wj (exp wj))))
47.0ms
(- wj (- (/ wj (+ 1 wj)) (/ x (+ (exp wj) (* wj (exp wj))))))
28.0ms
(* wj (exp wj))
16.0ms
(/ wj (+ 1 wj))

simplify1.1s

Counts
30 → 69
Calls

30 calls. Slowest were:

153.0ms
(+ (* (exp wj) (exp wj)) (- (* (* wj (exp wj)) (* wj (exp wj))) (* (exp wj) (* wj (exp wj)))))
150.0ms
(- (+ x (* 5/2 (* x (pow wj 2)))) (* 2 (* x wj)))
84.0ms
(- (+ (/ x (* (exp wj) wj)) (/ x (* (exp wj) (pow wj 3)))) (/ x (* (exp wj) (pow wj 2))))

prune649.0ms

Pruning

4 alts after pruning (3 fresh and 1 done)

Merged error: 0.4b

localize10.0ms

Local error

Found 4 expressions with local error:

6.0b
(- wj (- (* wj (/ 1 (+ 1 wj))) (/ x (+ (exp wj) (* wj (exp wj))))))
0.0b
(* wj (/ 1 (+ 1 wj)))
0.0b
(/ 1 (+ 1 wj))
0.0b
(/ x (+ (exp wj) (* wj (exp wj))))

rewrite5.0ms

Algorithm
rewrite-expression-head
Counts
4 → 65
Calls

4 calls. Slowest were:

2.0ms
(/ x (+ (exp wj) (* wj (exp wj))))
1.0ms
(* wj (/ 1 (+ 1 wj)))
1.0ms
(- wj (- (* wj (/ 1 (+ 1 wj))) (/ x (+ (exp wj) (* wj (exp wj))))))

series130.0ms

Counts
4 → 12
Calls

4 calls. Slowest were:

67.0ms
(/ x (+ (exp wj) (* wj (exp wj))))
37.0ms
(- wj (- (* wj (/ 1 (+ 1 wj))) (/ x (+ (exp wj) (* wj (exp wj))))))
16.0ms
(* wj (/ 1 (+ 1 wj)))
10.0ms
(/ 1 (+ 1 wj))

simplify1.1s

Counts
36 → 77
Calls

36 calls. Slowest were:

226.0ms
(- (+ x (* 5/2 (* x (pow wj 2)))) (* 2 (* x wj)))
165.0ms
(+ (* (exp wj) (exp wj)) (- (* (* wj (exp wj)) (* wj (exp wj))) (* (exp wj) (* wj (exp wj)))))
72.0ms
(- (+ (pow wj 2) x) (* 2 (* x wj)))

prune885.0ms

Pruning

5 alts after pruning (3 fresh and 2 done)

Merged error: 0.4b

regimes81.0ms

Accuracy

64.2% (0.7b remaining)

Error of 1.0b against oracle of 0.3b and baseline of 2.4b

bsearch32.0ms

end0.0ms

sample8.5s

Algorithm
intervals