Skip to content

Commit 39713cb

Browse files
authored
Merge pull request #1302 from herbie-fp/platforms-refactoring
Platforms refactoring
2 parents 522875a + 506891a commit 39713cb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+2703
-2037
lines changed

.github/workflows/plugins.yml

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@ jobs:
2424
- uses: actions/checkout@master
2525
- name: "Install dependencies"
2626
run: make install
27-
- name: "Check out softposit-herbie master"
28-
uses: actions/checkout@master
29-
with:
30-
repository: herbie-fp/softposit-herbie
31-
path: plugin
3227
- name: "Install SoftPosit support"
33-
run: raco pkg install --no-cache --auto --name softposit-herbie plugin/
28+
run: raco pkg install softposit-rkt
3429
- name: "Run posit benchmarks"
35-
run: racket infra/ci.rkt --plugin "infra/plugins-ci.rkt" --platform softposit --precision posit16 --seed 0 plugin/bench/posits.fpcore
30+
run: racket infra/ci.rkt --platform infra/softposit.rkt --precision posit16 --seed 0 infra/bench/posits.fpcore

.github/workflows/unit-test.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ jobs:
2424
- uses: actions/checkout@master
2525
- name: "Install dependencies"
2626
run: make install
27+
# SoftPosit is required to test the softposit platform we use for testing
28+
- name: "Install SoftPosit support"
29+
run: raco pkg install softposit-rkt
2730

2831
- name: "Test raco fmt compliance"
2932
run: make fmt && git diff --exit-code

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ start-server:
5858
--log infra/server.log --quiet 2>&1
5959

6060
fmt:
61-
@raco fmt -i $(shell find egg-herbie/ src/ infra/ -name '*.rkt')
61+
@raco fmt -i $(shell find egg-herbie/ src/ infra/ -name '*.rkt' -not -path 'src/platforms/*.rkt' -not -path "infra/softposit.rkt")
6262

6363
herbie.zip herbie.zip.CHECKSUM:
6464
raco pkg create src/

infra/bench/posits.fpcore

Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
; -*- mode: scheme -*-
2+
3+
; Herbie cannot properly sample points for this FPCore
4+
;
5+
; (FPCore (a b c)
6+
; :pre (and (< 0 a) (< 0 b) (< 0 c))
7+
; :name "Area of a triangle"
8+
; :precision posit16
9+
; :herbie-expected 16
10+
; (let ([s (/ (+ (+ a b) c) 2)])
11+
; (sqrt (* s (- s a) (- s b) (- s c)))))
12+
13+
(FPCore (a b c)
14+
:name "quadp (p42, positive)"
15+
:precision posit16
16+
:herbie-expected 16
17+
(let ([d (sqrt (- (* b b) (* 4 (* a c))))])
18+
(/ (+ (- b) d) (* 2 a))))
19+
20+
(FPCore (a b c)
21+
:name "quadm (p42, negative)"
22+
:precision posit16
23+
:herbie-expected 16
24+
(let ([d (sqrt (- (* b b) (* 4 (* a c))))])
25+
(/ (- (- b) d) (* 2 a))))
26+
27+
(FPCore (a b_2 c)
28+
:name "quad2m (problem 3.2.1, negative)"
29+
:precision posit16
30+
:herbie-expected 16
31+
(let ([d (sqrt (- (* b_2 b_2) (* a c)))])
32+
(/ (- (- b_2) d) a)))
33+
34+
(FPCore (a b_2 c)
35+
:name "quad2p (problem 3.2.1, positive)"
36+
:precision posit16
37+
:herbie-expected 16
38+
(let ([d (sqrt (- (* b_2 b_2) (* a c)))])
39+
(/ (+ (- b_2) d) a)))
40+
41+
(FPCore (x)
42+
:name "2sqrt (example 3.1)"
43+
:precision posit16
44+
:herbie-expected 16
45+
(- (sqrt (+ x 1)) (sqrt x)))
46+
47+
(FPCore (x)
48+
:name "2isqrt (example 3.6)"
49+
:precision posit16
50+
:herbie-expected 16
51+
(- (/ 1 (sqrt x)) (/ 1 (sqrt (+ x 1)))))
52+
53+
(FPCore (x)
54+
:name "2frac (problem 3.3.1)"
55+
:precision posit16
56+
:herbie-expected 16
57+
(- (/ 1 (+ x 1)) (/ 1 x)))
58+
59+
(FPCore (x)
60+
:name "3frac (problem 3.3.3)"
61+
:precision posit16
62+
:herbie-expected 16
63+
(+ (- (/ 1 (+ x 1)) (/ 2 x)) (/ 1 (- x 1))))
64+
65+
(FPCore (re im)
66+
:name "math.abs on complex"
67+
:precision posit16
68+
:herbie-expected 16
69+
(sqrt (+ (* re re) (* im im))))
70+
71+
(FPCore (x.re x.im)
72+
:name "math.cube on complex, real part"
73+
:precision posit16
74+
:herbie-expected 16
75+
(-
76+
(* (- (* x.re x.re) (* x.im x.im)) x.re)
77+
(* (+ (* x.re x.im) (* x.im x.re)) x.im)))
78+
79+
(FPCore (x.re x.im)
80+
:name "math.cube on complex, imaginary part"
81+
:precision posit16
82+
:herbie-expected 16
83+
(+
84+
(* (- (* x.re x.re) (* x.im x.im)) x.im)
85+
(* (+ (* x.re x.im) (* x.im x.re)) x.re)))
86+
87+
(FPCore (x.re x.im y.re y.im)
88+
:name "_divideComplex, real part"
89+
:precision posit16
90+
:herbie-expected 16
91+
(/ (+ (* x.re y.re) (* x.im y.im)) (+ (* y.re y.re) (* y.im y.im))))
92+
93+
(FPCore (x.re x.im y.re y.im)
94+
:name "_divideComplex, imaginary part"
95+
:precision posit16
96+
:herbie-expected 16
97+
(/ (- (* x.im y.re) (* x.re y.im)) (+ (* y.re y.re) (* y.im y.im))))
98+
99+
(FPCore (x.re x.im y.re y.im)
100+
:name "_multiplyComplex, real part"
101+
:precision posit16
102+
:herbie-expected 16
103+
(- (* x.re y.re) (* x.im y.im)))
104+
105+
(FPCore (x.re x.im y.re y.im)
106+
:name "_multiplyComplex, imaginary part"
107+
:precision posit16
108+
:herbie-expected 16
109+
(+ (* x.re y.im) (* x.im y.re)))
110+
111+
(FPCore (re im)
112+
:name "math.sqrt on complex, real part"
113+
:precision posit16
114+
:herbie-expected 16
115+
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
116+
117+
(FPCore (re im)
118+
:name "math.sqrt on complex, imaginary part, im greater than 0 branch"
119+
:precision posit16
120+
:herbie-expected 16
121+
(* 0.5 (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))))
122+
123+
(FPCore (re im)
124+
:name "math.square on complex, real part"
125+
:precision posit16
126+
:herbie-expected 16
127+
(- (* re re) (* im im)))
128+
129+
(FPCore (re im)
130+
:name "math.square on complex, imaginary part"
131+
:precision posit16
132+
:herbie-expected 16
133+
(+ (* re im) (* im re)))
134+
135+
(FPCore (alpha beta)
136+
:pre (and (> alpha -1) (> beta -1))
137+
:name "Octave 3.8, jcobi/1"
138+
:precision posit16
139+
:herbie-expected 16
140+
(let ((ab (+ alpha beta)) (ad (- beta alpha)) (ap (* beta alpha)))
141+
(/ (+ (/ ad (+ ab 2.0)) 1.0) 2.0)))
142+
143+
(FPCore (alpha beta i)
144+
:pre (and (> alpha -1) (> beta -1) (> i 0))
145+
:name "Octave 3.8, jcobi/2"
146+
:precision posit16
147+
:herbie-expected 16
148+
(let ((ab (+ alpha beta)) (ad (- beta alpha)) (ap (* beta alpha)))
149+
(let ((z (+ ab (* 2 i))))
150+
(/ (+ (/ (* ab ad) z (+ z 2.0)) 1.0) 2.0))))
151+
152+
(FPCore (alpha beta)
153+
:pre (and (> alpha -1) (> beta -1))
154+
:name "Octave 3.8, jcobi/3"
155+
:precision posit16
156+
:herbie-expected 16
157+
(let ((i 1) (ab (+ alpha beta)) (ad (- beta alpha)) (ap (* beta alpha)))
158+
(let ((z1 i))
159+
(let ((z (+ ab (* 2 z1))))
160+
(/ (+ ab ap 1.0) z z (+ z 1.0))))))
161+
162+
(FPCore (alpha beta i) ; TODO: i should be an integer
163+
:pre (and (> alpha -1) (> beta -1) (> i 1))
164+
:name "Octave 3.8, jcobi/4"
165+
:precision posit16
166+
:herbie-expected 16
167+
(let ((ab (+ alpha beta)) (ad (- beta alpha)) (ap (* beta alpha)))
168+
(let ((z (+ ab (* 2 i))))
169+
(let ((z* (* z z)) (y (* i (+ ab i))))
170+
(let ((y* (* y (+ ap y))))
171+
(/ y* z* (- z* 1.0)))))))
172+
173+
(FPCore (i)
174+
:pre (and (> i 0))
175+
:name "Octave 3.8, jcobi/4, as called"
176+
:precision posit16
177+
:herbie-expected 16
178+
(let ((z (* 2 i)))
179+
(let ((z* (* z z)) (y (* i i)))
180+
(let ((y* (* y y))) (/ y* z* (- z* 1.0))))))
181+
182+
(FPCore (a rand)
183+
:name "Octave 3.8, oct_fill_randg"
184+
:precision posit16
185+
:herbie-expected 16
186+
(let ((d (- a (/ 1.0 3.0))))
187+
(let ((c (/ 1 (sqrt (* 9 d)))) (x rand))
188+
(let ((v (+ 1 (* c x))))
189+
(let ((v* (* v (* v v))) (xsq (* x x)))
190+
(* d v))))))
191+
192+
(FPCore (d1 d2 d3)
193+
:name "FastMath dist"
194+
:precision posit16
195+
:herbie-expected 16
196+
(+ (* d1 d2) (* d1 d3)))
197+
198+
(FPCore (d)
199+
:name "FastMath test1"
200+
:precision posit16
201+
:herbie-expected 16
202+
(+ (* d 10) (* d 20)))
203+
204+
(FPCore (d1 d2)
205+
:name "FastMath test2"
206+
:precision posit16
207+
:herbie-expected 16
208+
(+ (* d1 10) (* d1 d2) (* d1 20)))
209+
210+
(FPCore (d1 d2 d3)
211+
:name "FastMath dist3"
212+
:precision posit16
213+
:herbie-expected 16
214+
(+ (* d1 d2) (* (+ d3 5) d1) (* d1 32)))
215+
216+
(FPCore (d1 d2 d3 d4)
217+
:name "FastMath dist4"
218+
:precision posit16
219+
:herbie-expected 16
220+
(- (+ (- (* d1 d2) (* d1 d3)) (* d4 d1)) (* d1 d1)))
221+
222+
(FPCore (d1 d2 d3)
223+
:name "FastMath test3"
224+
:precision posit16
225+
:herbie-expected 16
226+
(+ (* d1 3) (* d1 d2) (* d1 d3)))
227+
228+
(FPCore (d1)
229+
:name "FastMath repmul"
230+
:precision posit16
231+
:herbie-expected 16
232+
(* d1 d1 d1 d1))
233+
234+
(FPCore (x)
235+
:name "Jmat.Real.dawson"
236+
:precision posit16
237+
:herbie-expected 16
238+
(let ((p1 0.1049934947) (p2 0.0424060604) (p3 0.0072644182)
239+
(p4 0.0005064034) (p5 0.0001789971) (q1 0.7715471019)
240+
(q2 0.2909738639) (q3 0.0694555761) (q4 0.0140005442)
241+
(q5 0.0008327945))
242+
(let ((x2 (* x x)))
243+
(let ((x4 (* x2 x2)))
244+
(let ((x6 (* x4 x2)))
245+
(let ((x8 (* x6 x2)))
246+
(let ((x10 (* x8 x2)))
247+
(let ((x12 (* x10 x2)))
248+
(*
249+
(/ (+ 1 (* p1 x2) (* p2 x4) (* p3 x6) (* p4 x8) (* p5 x10))
250+
(+ 1 (* q1 x2) (* q2 x4) (* q3 x6) (* q4 x8) (* q5 x10) (* 2 p5 x12)))
251+
x)))))))))

infra/ci.rkt

Lines changed: 19 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
(require "../src/utils/common.rkt"
44
"../src/core/points.rkt"
5-
"../src/syntax/load-plugin.rkt"
65
"../src/utils/alternative.rkt"
76
"../src/api/sandbox.rkt"
87
"../src/syntax/read.rkt"
@@ -27,12 +26,9 @@
2726
(cons var (representation-name repr)))]))
2827

2928
(define (run-tests . bench-dirs)
30-
(define default-precision
31-
(if (*precision*)
32-
(representation-name (*precision*))
33-
(*default-precision*)))
29+
(activate-platform! (*platform-name*))
3430
(define tests
35-
(parameterize ([*default-precision* default-precision])
31+
(parameterize ([*default-precision* (*precision*)])
3632
(append-map load-tests bench-dirs)))
3733
(define seed (pseudo-random-generator->vector (current-pseudo-random-generator)))
3834
(printf "Running Herbie on ~a tests, seed: ~a\n" (length tests) seed)
@@ -41,7 +37,7 @@
4137
(printf "~a/~a\t" (~a (+ 1 i) #:width 3 #:align 'right) (length tests))
4238
(define the-test*
4339
(if (*precision*)
44-
(override-test-precision the-test (*precision*))
40+
(override-test-precision the-test (get-representation (*precision*)))
4541
the-test))
4642
(define result (run-herbie 'improve the-test* #:seed seed))
4743
(match-define (job-result _ test status time timeline profile warnings backend) result)
@@ -93,35 +89,22 @@
9389

9490
(module+ main
9591
;; Load all the plugins
96-
(load-herbie-plugins)
97-
9892
(define seed (random 1 (expt 2 31)))
9993
(set-seed! seed)
10094

101-
(command-line #:program "ci.rkt"
102-
#:multi [("--plugin")
103-
path
104-
"Which additional Herbie plugins to use"
105-
(dynamic-require path #f)
106-
(*loose-plugins* (cons path (*loose-plugins*)))]
107-
#:once-each
108-
[("--seed")
109-
rs
110-
"The random seed to use in point generation. If false (#f), a random seed is used'"
111-
(define given-seed (read (open-input-string rs)))
112-
(when given-seed
113-
(set-seed! given-seed))]
114-
[("--platform")
115-
platform
116-
"Which platform to use for tests"
117-
(activate-platform! (string->symbol platform))]
118-
[("--precision")
119-
prec
120-
"Which precision to use for tests"
121-
(*precision* (get-representation (string->symbol prec)))]
122-
[("--num-iters")
123-
num
124-
"The number of iterations to use for the main loop"
125-
(*num-iterations* (string->number num))]
126-
#:args bench-dir
127-
(exit (if (apply run-tests bench-dir) 0 1))))
95+
(command-line
96+
#:program "ci.rkt"
97+
#:once-each [("--seed")
98+
rs
99+
"The random seed to use in point generation. If false (#f), a random seed is used'"
100+
(define given-seed (read (open-input-string rs)))
101+
(when given-seed
102+
(set-seed! given-seed))]
103+
[("--platform") platform "Which platform to use for tests" (*platform-name* platform)]
104+
[("--precision") prec "Which precision to use for tests" (*precision* (string->symbol prec))]
105+
[("--num-iters")
106+
num
107+
"The number of iterations to use for the main loop"
108+
(*num-iterations* (string->number num))]
109+
#:args bench-dir
110+
(exit (if (apply run-tests bench-dir) 0 1))))

infra/merge.rkt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"../src/utils/profile.rkt"
66
"../src/api/datafile.rkt"
77
"../src/reports/timeline.rkt"
8-
"../src/syntax/load-plugin.rkt"
9-
"../src/reports/common.rkt")
8+
"../src/reports/common.rkt"
9+
"../src/syntax/platform.rkt")
1010

1111
(define (merge-timelines outdir . dirs)
1212
(define tls
@@ -36,7 +36,6 @@
3636
(curry write-json (profile->json joint-pf))))
3737

3838
(define (merge-reports outdir . dirs)
39-
(load-herbie-builtins)
4039
(define rss
4140
(filter (conjoin (negate eof-object?) identity)
4241
(for/list ([dir (in-list dirs)])
@@ -53,6 +52,7 @@
5352

5453
(module+ main
5554
(command-line #:args (outdir . dirs)
55+
(activate-platform! (*platform-name*))
5656
(apply merge-reports outdir dirs)
5757
(apply merge-timelines outdir dirs)
5858
(apply merge-profiles outdir dirs)

0 commit comments

Comments
 (0)