Skip to content

Commit d3bbff7

Browse files
committed
Refine binary Taylor handling
1 parent bf9f88a commit d3bbff7

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)
@@ -227,20 +227,6 @@
227227
(loop (+ n 1))
228228
n)))
229229

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

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

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

0 commit comments

Comments
 (0)