Average Error: 0.4 → 0.4
Time: 36.8s
Precision: 64
Internal Precision: 128
\[\log \left(1 + e^{x}\right) - x \cdot y\]
\[\log_* (1 + e^{x}) - y \cdot x\]

Error

Bits error versus x

Bits error versus y

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original0.4
Target0.0
Herbie0.4
\[\begin{array}{l} \mathbf{if}\;x \le 0:\\ \;\;\;\;\log \left(1 + e^{x}\right) - x \cdot y\\ \mathbf{else}:\\ \;\;\;\;\log \left(1 + e^{-x}\right) - \left(-x\right) \cdot \left(1 - y\right)\\ \end{array}\]

Derivation

  1. Initial program 0.4

    \[\log \left(1 + e^{x}\right) - x \cdot y\]
  2. Simplified0.4

    \[\leadsto \color{blue}{\log_* (1 + e^{x}) - y \cdot x}\]
  3. Final simplification0.4

    \[\leadsto \log_* (1 + e^{x}) - y \cdot x\]

Reproduce

herbie shell --seed 2019022 +o rules:numerics
(FPCore (x y)
  :name "Logistic regression 2"

  :herbie-target
  (if (<= x 0) (- (log (+ 1 (exp x))) (* x y)) (- (log (+ 1 (exp (- x)))) (* (- x) (- 1 y))))

  (- (log (+ 1 (exp x))) (* x y)))

Details

Time bar (total: 36.3s)Debug log

sample131.0ms

Algorithm
intervals
Results
80.0ms82×body10240exit
24.0ms259×body80valid
6.0ms10×body640valid
5.0msbody1280valid
2.0msbody320valid
1.0msbody160valid

simplify18.0ms

Counts
1 → 1
Calls
1 calls:
Slowest
18.0ms
(- (log (+ 1 (exp x))) (* x y))

prune15.0ms

Pruning

1 alts after pruning (1 fresh and 0 done)

Merged error: 0.5b

localize12.0ms

Local error

Found 2 expressions with local error:

0.5b
(log1p (exp x))
0.0b
(- (log1p (exp x)) (* y x))

rewrite4.0ms

Algorithm
rewrite-expression-head
Rules
add-log-exp
add-cube-cbrt
*-un-lft-identity
add-sqr-sqrt
prod-diff
fma-neg
expm1-log1p-u
log1p-expm1-u
add-exp-log
diff-log
add-cbrt-cube
log1p-udef
pow1
flip--
log1p-expm1
flip3--
sub-neg
Counts
2 → 32
Calls
2 calls:
Slowest
4.0ms
(- (log1p (exp x)) (* y x))
0.0ms
(log1p (exp x))

series119.0ms

Counts
2 → 6
Calls
2 calls:
Slowest
68.0ms
(log1p (exp x))
51.0ms
(- (log1p (exp x)) (* y x))

simplify272.0ms

Counts
17 → 38
Calls
17 calls:
Slowest
63.0ms
(+ (log 2) (+ (* 1/2 x) (* 1/8 (pow x 2))))
38.0ms
(+ (log 2) (+ (* 1/2 x) (* 1/8 (pow x 2))))
26.0ms
(/ (exp (log1p (exp x))) (exp (* y x)))
22.0ms
(fma 1 (log1p (exp x)) (- (* x y)))
20.0ms
(fma (* (cbrt (log1p (exp x))) (cbrt (log1p (exp x)))) (cbrt (log1p (exp x))) (- (* x y)))

prune336.0ms

Pruning

3 alts after pruning (2 fresh and 1 done)

Merged error: 0.4b

localize41.0ms

Local error

Found 4 expressions with local error:

15.6b
(/ (- (pow (log1p (exp x)) 3) (pow (* y x) 3)) (+ (* (log1p (exp x)) (log1p (exp x))) (+ (* (* y x) (* y x)) (* (log1p (exp x)) (* y x)))))
0.7b
(pow (log1p (exp x)) 3)
0.7b
(* (log1p (exp x)) (log1p (exp x)))
0.5b
(log1p (exp x))

rewrite36.0ms

Algorithm
rewrite-expression-head
Rules
45×add-sqr-sqrt
29×*-un-lft-identity
24×times-frac
21×add-cube-cbrt
12×difference-of-squares
10×pow1
add-exp-log
add-cbrt-cube
associate-/l*
cube-prod
unpow-prod-down
expm1-log1p-u
add-log-exp
distribute-lft-out--
log1p-expm1-u
difference-cubes
associate-*l*
associate-*r*
associate-/r*
associate-/l/
associate-/r/
rem-cube-cbrt
flip--
div-inv
flip-+
cbrt-unprod
pow-prod-up
*-commutative
log1p-expm1
prod-exp
pow-exp
pow-prod-down
div-exp
div-sub
unpow3
flip3--
pow-plus
flip3-+
frac-2neg
pow-pow
clear-num
log1p-udef
cbrt-undiv
pow-to-exp
cube-mult
pow2
Counts
4 → 108
Calls
4 calls:
Slowest
30.0ms
(/ (- (pow (log1p (exp x)) 3) (pow (* y x) 3)) (+ (* (log1p (exp x)) (log1p (exp x))) (+ (* (* y x) (* y x)) (* (log1p (exp x)) (* y x)))))
4.0ms
(* (log1p (exp x)) (log1p (exp x)))
1.0ms
(pow (log1p (exp x)) 3)
0.0ms
(log1p (exp x))

series379.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
146.0ms
(/ (- (pow (log1p (exp x)) 3) (pow (* y x) 3)) (+ (* (log1p (exp x)) (log1p (exp x))) (+ (* (* y x) (* y x)) (* (log1p (exp x)) (* y x)))))
95.0ms
(pow (log1p (exp x)) 3)
70.0ms
(log1p (exp x))
68.0ms
(* (log1p (exp x)) (log1p (exp x)))

simplify12.5s

Counts
97 → 120
Calls
97 calls:
Slowest
401.0ms
(- (* (pow (log1p (exp x)) 3) (pow (log1p (exp x)) 3)) (* (pow (* y x) 3) (pow (* y x) 3)))
393.0ms
(/ (sqrt (- (pow (log1p (exp x)) 3) (pow (* y x) 3))) (cbrt (+ (* (log1p (exp x)) (log1p (exp x))) (+ (* (* y x) (* y x)) (* (log1p (exp x)) (* y x))))))
391.0ms
(/ (sqrt (- (pow (log1p (exp x)) 3) (pow (* y x) 3))) 1)
383.0ms
(/ (cbrt (- (pow (log1p (exp x)) 3) (pow (* y x) 3))) (sqrt (+ (* (log1p (exp x)) (log1p (exp x))) (+ (* (* y x) (* y x)) (* (log1p (exp x)) (* y x))))))
369.0ms
(/ (sqrt (- (pow (log1p (exp x)) 3) (pow (* y x) 3))) (sqrt (+ (* (log1p (exp x)) (log1p (exp x))) (+ (* (* y x) (* y x)) (* (log1p (exp x)) (* y x))))))

prune1.7s

Pruning

4 alts after pruning (3 fresh and 1 done)

Merged error: 0.4b

localize27.0ms

Local error

Found 4 expressions with local error:

9.8b
(/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))))
9.8b
(* (fma (fma x y (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))) (/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
0.7b
(* (log1p (exp x)) (log1p (exp x)))
0.7b
(* (log1p (exp x)) (log1p (exp x)))

rewrite32.0ms

Algorithm
rewrite-expression-head
Rules
24×add-cube-cbrt
24×*-un-lft-identity
24×add-sqr-sqrt
19×associate-*r*
18×times-frac
16×pow1
15×add-exp-log
15×add-cbrt-cube
associate-*l*
add-log-exp
log1p-expm1-u
cbrt-unprod
prod-exp
expm1-log1p-u
associate-/l*
*-commutative
pow-prod-down
associate-/r*
associate-/l/
div-inv
pow-prod-up
div-exp
pow-plus
cbrt-undiv
pow2
flip--
associate-*r/
div-sub
flip3--
frac-2neg
clear-num
Counts
4 → 108
Calls
4 calls:
Slowest
10.0ms
(/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))))
8.0ms
(* (fma (fma x y (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))) (/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
4.0ms
(* (log1p (exp x)) (log1p (exp x)))
4.0ms
(* (log1p (exp x)) (log1p (exp x)))

series561.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
198.0ms
(/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))))
194.0ms
(* (fma (fma x y (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))) (/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
92.0ms
(* (log1p (exp x)) (log1p (exp x)))
76.0ms
(* (log1p (exp x)) (log1p (exp x)))

simplify6.0s

Counts
83 → 120
Calls
83 calls:
Slowest
656.0ms
(+ (log (fma (fma x y (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))) (- (log (- (log1p (exp x)) (* y x))) (log (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))))))
416.0ms
(- (* (log1p (exp x)) (log1p (exp x))) (* (* y x) (* y x)))
359.0ms
(/ (* (* (- (log1p (exp x)) (* y x)) (- (log1p (exp x)) (* y x))) (- (log1p (exp x)) (* y x))) (* (* (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
264.0ms
(- (pow (log1p (exp x)) 3) (pow (* y x) 3))
235.0ms
(- (* 2 (/ (log (+ (exp x) 1)) (* (pow x 2) (pow y 2)))) (+ (/ 1 (* x y)) (/ (pow (log (+ (exp x) 1)) 2) (* (pow x 3) (pow y 3)))))

prune1.7s

Pruning

3 alts after pruning (2 fresh and 1 done)

Merged error: 0.4b

localize23.0ms

Local error

Found 4 expressions with local error:

9.8b
(/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))))
9.8b
(* (fma (fma x y (log1p (exp x))) (* y x) (cbrt (pow (log1p (exp x)) 6))) (/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
0.7b
(pow (log1p (exp x)) 6)
0.7b
(* (log1p (exp x)) (log1p (exp x)))

rewrite23.0ms

Algorithm
rewrite-expression-head
Rules
23×add-cube-cbrt
23×*-un-lft-identity
23×add-sqr-sqrt
18×times-frac
16×associate-*r*
14×add-exp-log
13×add-cbrt-cube
12×pow1
associate-*l*
add-log-exp
log1p-expm1-u
expm1-log1p-u
associate-/l*
cbrt-unprod
prod-exp
unpow-prod-down
associate-/r*
associate-/l/
div-inv
*-commutative
pow-prod-down
div-exp
cbrt-undiv
flip--
pow-prod-up
associate-*r/
pow-exp
div-sub
flip3--
pow-plus
frac-2neg
pow-pow
clear-num
pow-to-exp
pow2
Counts
4 → 101
Calls
4 calls:
Slowest
8.0ms
(/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))))
8.0ms
(* (fma (fma x y (log1p (exp x))) (* y x) (cbrt (pow (log1p (exp x)) 6))) (/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
4.0ms
(* (log1p (exp x)) (log1p (exp x)))
1.0ms
(pow (log1p (exp x)) 6)

series584.0ms

Counts
4 → 12
Calls
4 calls:
Slowest
228.0ms
(* (fma (fma x y (log1p (exp x))) (* y x) (cbrt (pow (log1p (exp x)) 6))) (/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
171.0ms
(/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))))
107.0ms
(pow (log1p (exp x)) 6)
78.0ms
(* (log1p (exp x)) (log1p (exp x)))

simplify5.9s

Counts
77 → 113
Calls
77 calls:
Slowest
602.0ms
(+ (* 1/4 (* (log 2) (pow x 2))) (+ (* (log 2) x) (+ (* 1/4 (pow x 2)) (pow (log 2) 2))))
445.0ms
(* (fma (fma x y (log1p (exp x))) (* y x) (cbrt (pow (log1p (exp x)) 6))) (/ (- (log1p (exp x)) (* y x)) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
374.0ms
(/ (* (* (- (log1p (exp x)) (* y x)) (- (log1p (exp x)) (* y x))) (- (log1p (exp x)) (* y x))) (* (* (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x)))) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))) (fma (fma y x (log1p (exp x))) (* y x) (* (log1p (exp x)) (log1p (exp x))))))
351.0ms
(- (* (log1p (exp x)) (log1p (exp x))) (* (* y x) (* y x)))
225.0ms
(- (+ (/ 1 (log 2)) (* 1/4 (/ (pow x 2) (pow (log 2) 3)))) (+ (* 1/8 (/ (pow x 2) (pow (log 2) 2))) (* 1/2 (/ x (pow (log 2) 2)))))

prune1.6s

Pruning

3 alts after pruning (1 fresh and 2 done)

Merged error: 0.4b

regimes106.0ms

Accuracy

0% (0.2b remaining)

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

bsearch1.0ms

end0.0ms

sample4.1s

Algorithm
intervals
Results
2.2s2449×body10240exit
1.3s8415×body80valid
143.0ms277×body640valid
99.0ms114×body1280valid
61.0ms187×body320valid
26.0ms113×body160valid