Average Error: 13.2 → 2.1
Time: 18.5s
Precision: 64
Internal Precision: 128
\[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
\[(wj \cdot \left((x \cdot -2 + wj)_*\right) + x)_*\]

Error

Bits error versus wj

Bits error versus x

Target

Original13.2
Target12.7
Herbie2.1
\[wj - \left(\frac{wj}{wj + 1} - \frac{x}{e^{wj} + wj \cdot e^{wj}}\right)\]

Derivation

  1. Initial program 13.2

    \[wj - \frac{wj \cdot e^{wj} - x}{e^{wj} + wj \cdot e^{wj}}\]
  2. Simplified13.2

    \[\leadsto \color{blue}{\frac{(\left(-wj\right) \cdot \left(e^{wj}\right) + x)_*}{(\left(e^{wj}\right) \cdot wj + \left(e^{wj}\right))_*} + wj}\]
  3. Taylor expanded around 0 2.0

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

    \[\leadsto \color{blue}{(wj \cdot \left((x \cdot -2 + wj)_*\right) + x)_*}\]
  5. Final simplification2.1

    \[\leadsto (wj \cdot \left((x \cdot -2 + wj)_*\right) + x)_*\]

Reproduce

herbie shell --seed 2019022 +o rules:numerics
(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: 17.7s)Debug log

sample196.0ms

Algorithm
intervals
Results
151.0ms270×body10240exit
16.0ms205×body80valid
7.0ms19×body640valid
5.0ms21×body320valid
2.0ms15×body160valid

simplify157.0ms

Counts
1 → 1
Calls
1 calls:
Slowest
157.0ms
(- wj (/ (- (* wj (exp wj)) x) (+ (exp wj) (* wj (exp wj)))))

prune18.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 13.4b

localize36.0ms

Local error

Found 4 expressions with local error:

4.4b
(+ (/ (fma (- wj) (exp wj) x) (fma (exp wj) wj (exp wj))) wj)
0.5b
(/ (fma (- wj) (exp wj) x) (fma (exp wj) wj (exp wj)))
0.0b
(fma (exp wj) wj (exp wj))
0.0b
(fma (- wj) (exp wj) x)

rewrite18.0ms

Algorithm
rewrite-expression-head
Rules
19×add-cube-cbrt
19×*-un-lft-identity
19×add-sqr-sqrt
18×times-frac
13×fma-def
add-exp-log
add-cbrt-cube
add-log-exp
log1p-expm1-u
pow1
expm1-log1p-u
associate-/l*
associate-/r*
div-inv
fma-udef
flip-+
div-exp
flip3-+
frac-2neg
clear-num
+-commutative
cbrt-undiv
Counts
4 → 74
Calls
4 calls:
Slowest
13.0ms
(+ (/ (fma (- wj) (exp wj) x) (fma (exp wj) wj (exp wj))) wj)
4.0ms
(/ (fma (- wj) (exp wj) x) (fma (exp wj) wj (exp wj)))
0.0ms
(fma (exp wj) wj (exp wj))
0.0ms
(fma (- wj) (exp wj) x)

series149.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
48.0ms
(+ (/ (fma (- wj) (exp wj) x) (fma (exp wj) wj (exp wj))) wj)
47.0ms
(/ (fma (- wj) (exp wj) x) (fma (exp wj) wj (exp wj)))
28.0ms
(fma (exp wj) wj (exp wj))
26.0ms
(fma (- wj) (exp wj) x)

simplify1.7s

Counts
49 → 86
Calls
49 calls:
Slowest
388.0ms
(* (cbrt (/ (fma (- wj) (exp wj) x) (fma (exp wj) wj (exp wj)))) (cbrt (/ (fma (- wj) (exp wj) x) (fma (exp wj) wj (exp wj)))))
206.0ms
(/ (* (* (fma (- wj) (exp wj) x) (fma (- wj) (exp wj) x)) (fma (- wj) (exp wj) x)) (* (* (fma (exp wj) wj (exp wj)) (fma (exp wj) wj (exp wj))) (fma (exp wj) wj (exp wj))))
124.0ms
(- (+ (pow wj 2) x) (* 2 (* x wj)))
59.0ms
(/ (* (cbrt (fma (- wj) (exp wj) x)) (cbrt (fma (- wj) (exp wj) x))) (* (cbrt (fma (exp wj) wj (exp wj))) (cbrt (fma (exp wj) wj (exp wj)))))
54.0ms
(- (/ x (* (exp wj) wj)) (+ (/ x (* (exp wj) (pow wj 2))) 1))

prune951.0ms

Pruning

5 alts after pruning (5 fresh and 0 done)

Merged error: 0.5b

localize16.0ms

Local error

Found 0 expressions with local error:

rewrite0.0ms

Algorithm
rewrite-expression-head
Rules
Counts
0 → 0
Calls
0 calls:
Slowest

series0.0ms

Counts
0 → 0
Calls
0 calls:
Slowest

simplify0.0ms

Counts
0 → 0
Calls
0 calls:
Slowest

prune13.0ms

Pruning

5 alts after pruning (4 fresh and 1 done)

Merged error: 0.5b

localize8.0ms

Local error

Found 4 expressions with local error:

6.6b
(+ (/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x))) wj)
0.5b
(/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x))
0.2b
(/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x)))
0.0b
(fma (exp wj) wj (exp wj))

rewrite9.0ms

Algorithm
rewrite-expression-head
Rules
20×add-cube-cbrt
20×*-un-lft-identity
20×add-sqr-sqrt
18×times-frac
16×associate-/r*
add-exp-log
add-cbrt-cube
fma-def
pow1
add-log-exp
div-inv
log1p-expm1-u
expm1-log1p-u
associate-/l*
associate-/r/
div-exp
frac-2neg
clear-num
rec-exp
inv-pow
pow-flip
fma-udef
flip-+
flip3-+
+-commutative
cbrt-undiv
Counts
4 → 86
Calls
4 calls:
Slowest
3.0ms
(/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x))
3.0ms
(+ (/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x))) wj)
2.0ms
(/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x)))
0.0ms
(fma (exp wj) wj (exp wj))

series239.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
111.0ms
(/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x))
56.0ms
(+ (/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x))) wj)
42.0ms
(/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x)))
30.0ms
(fma (exp wj) wj (exp wj))

simplify1.7s

Counts
55 → 98
Calls
55 calls:
Slowest
274.0ms
(/ (* (* (fma (exp wj) wj (exp wj)) (fma (exp wj) wj (exp wj))) (fma (exp wj) wj (exp wj))) (* (* (fma (- wj) (exp wj) x) (fma (- wj) (exp wj) x)) (fma (- wj) (exp wj) x)))
121.0ms
(- (+ (pow wj 2) x) (* 2 (* x wj)))
119.0ms
(* (cbrt (/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x)))) (cbrt (/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x)))))
115.0ms
(sqrt (/ 1 (/ (fma (exp wj) wj (exp wj)) (fma (- wj) (exp wj) x))))
60.0ms
(/ (* (cbrt (fma (exp wj) wj (exp wj))) (cbrt (fma (exp wj) wj (exp wj)))) (* (cbrt (fma (- wj) (exp wj) x)) (cbrt (fma (- wj) (exp wj) x))))

prune924.0ms

Pruning

5 alts after pruning (3 fresh and 2 done)

Merged error: 0.5b

localize33.0ms

Local error

Found 4 expressions with local error:

13.0b
(fma (/ (* (cbrt (fma (- wj) (exp wj) x)) (cbrt (fma (- wj) (exp wj) x))) (sqrt (fma (exp wj) wj (exp wj)))) (/ (cbrt (fma (- wj) (exp wj) x)) (sqrt (fma (exp wj) wj (exp wj)))) wj)
0.8b
(cbrt (fma (- wj) (exp wj) x))
0.8b
(cbrt (fma (- wj) (exp wj) x))
0.8b
(cbrt (fma (- wj) (exp wj) x))

rewrite4.0ms

Algorithm
rewrite-expression-head
Rules
cbrt-prod
add-cube-cbrt
*-un-lft-identity
add-sqr-sqrt
add-log-exp
log1p-expm1-u
add-exp-log
add-cbrt-cube
pow1
expm1-log1p-u
pow1/3
fma-udef
Counts
4 → 49
Calls
4 calls:
Slowest
1.0ms
(cbrt (fma (- wj) (exp wj) x))
1.0ms
(cbrt (fma (- wj) (exp wj) x))
1.0ms
(cbrt (fma (- wj) (exp wj) x))
0.0ms
(fma (/ (* (cbrt (fma (- wj) (exp wj) x)) (cbrt (fma (- wj) (exp wj) x))) (sqrt (fma (exp wj) wj (exp wj)))) (/ (cbrt (fma (- wj) (exp wj) x)) (sqrt (fma (exp wj) wj (exp wj)))) wj)

series1.1s

Counts
4 → 12
Calls
4 calls:
Slowest
362.0ms
(fma (/ (* (cbrt (fma (- wj) (exp wj) x)) (cbrt (fma (- wj) (exp wj) x))) (sqrt (fma (exp wj) wj (exp wj)))) (/ (cbrt (fma (- wj) (exp wj) x)) (sqrt (fma (exp wj) wj (exp wj)))) wj)
264.0ms
(cbrt (fma (- wj) (exp wj) x))
244.0ms
(cbrt (fma (- wj) (exp wj) x))
239.0ms
(cbrt (fma (- wj) (exp wj) x))

simplify953.0ms

Counts
21 → 61
Calls
21 calls:
Slowest
164.0ms
(exp (* -1/3 (- (log (/ -1 wj)) wj)))
156.0ms
(exp (* -1/3 (- (log (/ -1 wj)) wj)))
137.0ms
(exp (* -1/3 (- (log (/ -1 wj)) wj)))
83.0ms
(- (+ (pow wj 2) x) (* 2 (* x wj)))
78.0ms
(exp (* 1/3 (- (log (- (exp wj))) (log (/ 1 wj)))))

prune645.0ms

Pruning

6 alts after pruning (3 fresh and 3 done)

Merged error: 0.5b

regimes108.0ms

Accuracy

0% (1.6b remaining)

Error of 2.1b against oracle of 0.4b and baseline of 2.1b

bsearch1.0ms

end0.0ms

sample8.6s

Algorithm
intervals
Results
7.0s7607×body10240exit
641.0ms6359×body80valid
287.0ms444×body640valid
255.0ms772×body320valid
99.0ms513×body160valid