Skip to content

Commit 0852828

Browse files
authored
Merge pull request #1394 from herbie-fp/codex/refactor-taylor-add-for-binary-inputs
Refine binary Taylor addition
2 parents d80575b + d3bbff7 commit 0852828

File tree

1 file changed

+18
-22
lines changed

1 file changed

+18
-22
lines changed

src/core/taylor.rkt

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@
158158
[(? number?) (taylor-exact brf)]
159159
[(? symbol?) (taylor-exact brf)]
160160
[`(,const) (taylor-exact brf)]
161-
[`(+ ,args ...) (apply taylor-add (map recurse args))]
161+
[`(+ ,arg1 ,arg2) (taylor-add (recurse arg1) (recurse arg2))]
162162
[`(neg ,arg) (taylor-negate (recurse arg))]
163163
[`(* ,left ,right) (taylor-mult (recurse left) (recurse right))]
164164
[`(/ ,num ,den)
@@ -228,20 +228,6 @@
228228
(loop (+ n 1))
229229
n)))
230230

231-
(define (align-series . serieses)
232-
;(->* () #:rest (listof term?) (listof term?))
233-
(cond
234-
[(or (<= (length serieses) 1) (apply = (map car serieses))) serieses]
235-
[else
236-
(define offset* (car (argmax car serieses)))
237-
(for/list ([series serieses])
238-
(define offset (car series))
239-
(cons offset*
240-
(λ (n)
241-
(if (negative? (+ n (- offset offset*)))
242-
(adder 0)
243-
((cdr series) (+ n (- offset offset*)))))))]))
244-
245231
(define (make-series offset builder)
246232
(define cache (make-dvector 10))
247233
(define fetch (curry dvector-ref cache))
@@ -253,13 +239,23 @@
253239
(dvector-ref cache n))
254240
(cons offset lookup))
255241

256-
(define (taylor-add . terms)
257-
;(->* () #:rest (listof term?) term?)
258-
(match-define `((,offset . ,serieses) ...) (apply align-series terms))
259-
(make-series (car offset)
260-
(λ (f n)
261-
(make-sum (for/list ([series serieses])
262-
(series n))))))
242+
(define (taylor-add left right)
243+
;(-> term? term? term?)
244+
(match-define (cons left-offset left-series) left)
245+
(match-define (cons right-offset right-series) right)
246+
(define target-offset (max left-offset right-offset))
247+
(define (align offset series)
248+
(define shift (- offset target-offset))
249+
(cond
250+
[(zero? shift) series]
251+
[else
252+
(λ (n)
253+
(if (negative? (+ n shift))
254+
(adder 0)
255+
(series (+ n shift))))]))
256+
(define left* (align left-offset left-series))
257+
(define right* (align right-offset right-series))
258+
(make-series target-offset (λ (f n) (make-sum (list (left* n) (right* n))))))
263259

264260
(define (taylor-negate term)
265261
;(-> term? term?)

0 commit comments

Comments
 (0)