Artifact
b101d550f6d9d4afc20f2226c49fff13373e3f28:
- File
srfi/s25/test.scm
— part of check-in
[80c8c83034]
at
2016-07-07 18:11:39
on branch trunk
— initial import
(user:
ovenpasta@pizzahack.eu
size: 17028)
;;; array test
;;; 2001 Jussi Piitulainen
(define past
(let ((stones '()))
(lambda stone
(if (null? stone)
(reverse stones)
(set! stones (cons (apply (lambda (stone) stone) stone) stones))))))
(define (tail n)
(if (< n (length (past)))
(list-tail (past) (- (length (past)) n))
(past)))
;;; Simple tests
(or (and (shape)
(shape -1 -1)
(shape -1 0)
(shape -1 1)
(shape 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8))
(error "(shape ...) failed"))
(past "shape")
(or (and (make-array (shape))
(make-array (shape) *)
(make-array (shape -1 -1))
(make-array (shape -1 -1) *)
(make-array (shape -1 1))
(make-array (shape 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4) *))
(error "(make-array (shape ...) [o]) failed"))
(past "make-array")
(or (and (array (shape) *)
(array (shape -1 -1))
(array (shape -1 1) * *)
(array (shape 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8) *))
(error "(array (shape ...) ...) failed"))
(past "array")
(or (and (= (array-rank (shape)) 2)
(= (array-rank (shape -1 -1)) 2)
(= (array-rank (shape -1 1)) 2)
(= (array-rank (shape 1 2 3 4 5 6 7 8)) 2))
(error "(array-rank (shape ...)) failed"))
(past "array-rank of shape")
(or (and (= (array-rank (make-array (shape))) 0)
(= (array-rank (make-array (shape -1 -1))) 1)
(= (array-rank (make-array (shape -1 1))) 1)
(= (array-rank (make-array (shape 1 2 3 4 5 6 7 8))) 4))
(error "(array-rank (make-array ...)) failed"))
(past "array-rank of make-array")
(or (and (= (array-rank (array (shape) *)) 0)
(= (array-rank (array (shape -1 -1))) 1)
(= (array-rank (array (shape -1 1) * *)) 1)
(= (array-rank (array (shape 1 2 3 4 5 6 7 8) *)) 4))
(error "(array-rank (array ...)) failed"))
(past "array-rank of array")
(or (and (= (array-start (shape -1 -1) 0) 0)
(= (array-start (shape -1 -1) 1) 0)
(= (array-start (shape -1 1) 0) 0)
(= (array-start (shape -1 1) 1) 0)
(= (array-start (shape 1 2 3 4 5 6 7 8) 0) 0)
(= (array-start (shape 1 2 3 4 5 6 7 8) 1) 0))
(error "(array-start (shape ...)) failed"))
(past "array-start of shape")
(or (and (= (array-end (shape -1 -1) 0) 1)
(= (array-end (shape -1 -1) 1) 2)
(= (array-end (shape -1 1) 0) 1)
(= (array-end (shape -1 1) 1) 2)
(= (array-end (shape 1 2 3 4 5 6 7 8) 0) 4)
(= (array-end (shape 1 2 3 4 5 6 7 8) 1) 2))
(error "(array-end (shape ...)) failed"))
(past "array-end of shape")
(or (and (= (array-start (make-array (shape -1 -1)) 0) -1)
(= (array-start (make-array (shape -1 1)) 0) -1)
(= (array-start (make-array (shape 1 2 3 4 5 6 7 8)) 0) 1)
(= (array-start (make-array (shape 1 2 3 4 5 6 7 8)) 1) 3)
(= (array-start (make-array (shape 1 2 3 4 5 6 7 8)) 2) 5)
(= (array-start (make-array (shape 1 2 3 4 5 6 7 8)) 3) 7))
(error "(array-start (make-array ...)) failed"))
(past "array-start of make-array")
(or (and (= (array-end (make-array (shape -1 -1)) 0) -1)
(= (array-end (make-array (shape -1 1)) 0) 1)
(= (array-end (make-array (shape 1 2 3 4 5 6 7 8)) 0) 2)
(= (array-end (make-array (shape 1 2 3 4 5 6 7 8)) 1) 4)
(= (array-end (make-array (shape 1 2 3 4 5 6 7 8)) 2) 6)
(= (array-end (make-array (shape 1 2 3 4 5 6 7 8)) 3) 8))
(error "(array-end (make-array ...)) failed"))
(past "array-end of make-array")
(or (and (= (array-start (array (shape -1 -1)) 0) -1)
(= (array-start (array (shape -1 1) * *) 0) -1)
(= (array-start (array (shape 1 2 3 4 5 6 7 8) *) 0) 1)
(= (array-start (array (shape 1 2 3 4 5 6 7 8) *) 1) 3)
(= (array-start (array (shape 1 2 3 4 5 6 7 8) *) 2) 5)
(= (array-start (array (shape 1 2 3 4 5 6 7 8) *) 3) 7))
(error "(array-start (array ...)) failed"))
(past "array-start of array")
(or (and (= (array-end (array (shape -1 -1)) 0) -1)
(= (array-end (array (shape -1 1) * *) 0) 1)
(= (array-end (array (shape 1 2 3 4 5 6 7 8) *) 0) 2)
(= (array-end (array (shape 1 2 3 4 5 6 7 8) *) 1) 4)
(= (array-end (array (shape 1 2 3 4 5 6 7 8) *) 2) 6)
(= (array-end (array (shape 1 2 3 4 5 6 7 8) *) 3) 8))
(error "(array-end (array ...)) failed"))
(past "array-end of array")
(or (and (eq? (array-ref (make-array (shape) 'a)) 'a)
(eq? (array-ref (make-array (shape -1 1) 'b) -1) 'b)
(eq? (array-ref (make-array (shape -1 1) 'c) 0) 'c)
(eq? (array-ref (make-array (shape 1 2 3 4 5 6 7 8) 'd) 1 3 5 7) 'd))
(error "array-ref of make-array with arguments failed"))
(past "array-ref of make-array with arguments")
(or (and (eq? (array-ref (make-array (shape) 'a) '#()) 'a)
(eq? (array-ref (make-array (shape -1 1) 'b) '#(-1)) 'b)
(eq? (array-ref (make-array (shape -1 1) 'c) '#(0)) 'c)
(eq? (array-ref (make-array (shape 1 2 3 4 5 6 7 8) 'd)
'#(1 3 5 7))
'd))
(error "array-ref of make-array with vector failed"))
(past "array-ref of make-array with vector")
(or (and (eq? (array-ref (make-array (shape) 'a)
(array (shape 0 0)))
'a)
(eq? (array-ref (make-array (shape -1 1) 'b)
(array (shape 0 1) -1))
'b)
(eq? (array-ref (make-array (shape -1 1) 'c)
(array (shape 0 1) 0))
'c)
(eq? (array-ref (make-array (shape 1 2 3 4 5 6 7 8) 'd)
(array (shape 0 4) 1 3 5 7))
'd))
(error "(array-ref of make-array with array failed"))
(past "array-ref of make-array with array")
(or (and (let ((arr (make-array (shape) 'o)))
(array-set! arr 'a)
(eq? (array-ref arr) 'a))
(let ((arr (make-array (shape -1 1) 'o)))
(array-set! arr -1 'b)
(array-set! arr 0 'c)
(and (eq? (array-ref arr -1) 'b)
(eq? (array-ref arr 0) 'c)))
(let ((arr (make-array (shape 1 2 3 4 5 6 7 8) 'o)))
(array-set! arr 1 3 5 7 'd)
(eq? (array-ref arr 1 3 5 7) 'd)))
(error "array-set! with arguments failed"))
(past "array-set! of make-array with arguments")
(or (and (let ((arr (make-array (shape) 'o)))
(array-set! arr '#() 'a)
(eq? (array-ref arr) 'a))
(let ((arr (make-array (shape -1 1) 'o)))
(array-set! arr '#(-1) 'b)
(array-set! arr '#(0) 'c)
(and (eq? (array-ref arr -1) 'b)
(eq? (array-ref arr 0) 'c)))
(let ((arr (make-array (shape 1 2 3 4 5 6 7 8) 'o)))
(array-set! arr '#(1 3 5 7) 'd)
(eq? (array-ref arr 1 3 5 7) 'd)))
(error "array-set! with vector failed"))
(past "array-set! of make-array with vector")
(or (and (let ((arr (make-array (shape) 'o)))
(array-set! arr 'a)
(eq? (array-ref arr) 'a))
(let ((arr (make-array (shape -1 1) 'o)))
(array-set! arr (array (shape 0 1) -1) 'b)
(array-set! arr (array (shape 0 1) 0) 'c)
(and (eq? (array-ref arr -1) 'b)
(eq? (array-ref arr 0) 'c)))
(let ((arr (make-array (shape 1 2 3 4 5 6 7 8) 'o)))
(array-set! arr (array (shape 0 4) 1 3 5 7) 'd)
(eq? (array-ref arr 1 3 5 7) 'd)))
(error "array-set! with arguments failed"))
(past "array-set! of make-array with array")
;;; Share and change:
;;;
;;; org brk swp box
;;;
;;; 0 1 1 2 5 6
;;; 6 a b 2 a b 3 d c 0 2 4 6 8: e
;;; 7 c d 3 e f 4 f e
;;; 8 e f
(or (let* ((org (array (shape 6 9 0 2) 'a 'b 'c 'd 'e 'f))
(brk (share-array
org
(shape 2 4 1 3)
(lambda (r k)
(values
(+ 6 (* 2 (- r 2)))
(- k 1)))))
(swp (share-array
org
(shape 3 5 5 7)
(lambda (r k)
(values
(+ 7 (- r 3))
(- 1 (- k 5))))))
(box (share-array
swp
(shape 0 1 2 3 4 5 6 7 8 9)
(lambda _ (values 4 6))))
(org-contents (lambda ()
(list (array-ref org 6 0) (array-ref org 6 1)
(array-ref org 7 0) (array-ref org 7 1)
(array-ref org 8 0) (array-ref org 8 1))))
(brk-contents (lambda ()
(list (array-ref brk 2 1) (array-ref brk 2 2)
(array-ref brk 3 1) (array-ref brk 3 2))))
(swp-contents (lambda ()
(list (array-ref swp 3 5) (array-ref swp 3 6)
(array-ref swp 4 5) (array-ref swp 4 6))))
(box-contents (lambda ()
(list (array-ref box 0 2 4 6 8)))))
(and (equal? (org-contents) '(a b c d e f))
(equal? (brk-contents) '(a b e f))
(equal? (swp-contents) '(d c f e))
(equal? (box-contents) '(e))
(begin (array-set! org 6 0 'x) #t)
(equal? (org-contents) '(x b c d e f))
(equal? (brk-contents) '(x b e f))
(equal? (swp-contents) '(d c f e))
(equal? (box-contents) '(e))
(begin (array-set! brk 3 1 'y) #t)
(equal? (org-contents) '(x b c d y f))
(equal? (brk-contents) '(x b y f))
(equal? (swp-contents) '(d c f y))
(equal? (box-contents) '(y))
(begin (array-set! swp 4 5 'z) #t)
(equal? (org-contents) '(x b c d y z))
(equal? (brk-contents) '(x b y z))
(equal? (swp-contents) '(d c z y))
(equal? (box-contents) '(y))
(begin (array-set! box 0 2 4 6 8 'e) #t)
(equal? (org-contents) '(x b c d e z))
(equal? (brk-contents) '(x b e z))
(equal? (swp-contents) '(d c z e))
(equal? (box-contents) '(e))))
(error "shared change failed"))
(past "shared change")
;;; Check that arrays copy the shape specification
(or (let ((shp (shape 10 12)))
(let ((arr (make-array shp))
(ars (array shp * *))
(art (share-array (make-array shp) shp (lambda (k) k))))
(array-set! shp 0 0 '?)
(array-set! shp 0 1 '!)
(and (= (array-rank shp) 2)
(= (array-start shp 0) 0)
(= (array-end shp 0) 1)
(= (array-start shp 1) 0)
(= (array-end shp 1) 2)
(eq? (array-ref shp 0 0) '?)
(eq? (array-ref shp 0 1) '!)
(= (array-rank arr) 1)
(= (array-start arr 0) 10)
(= (array-end arr 0) 12)
(= (array-rank ars) 1)
(= (array-start ars 0) 10)
(= (array-end ars 0) 12)
(= (array-rank art) 1)
(= (array-start art 0) 10)
(= (array-end art 0) 12))))
(error "array-set! of shape failed"))
(past "array-set! of shape")
;;; Check that index arrays work even when they share
;;;
;;; arr ixn
;;; 5 6 0 1
;;; 4 nw ne 0 4 6
;;; 5 sw se 1 5 4
(or (let ((arr (array (shape 4 6 5 7) 'nw 'ne 'sw 'se))
(ixn (array (shape 0 2 0 2) 4 6 5 4)))
(let ((col0 (share-array
ixn
(shape 0 2)
(lambda (k)
(values k 0))))
(row0 (share-array
ixn
(shape 0 2)
(lambda (k)
(values 0 k))))
(wor1 (share-array
ixn
(shape 0 2)
(lambda (k)
(values 1 (- 1 k)))))
(cod (share-array
ixn
(shape 0 2)
(lambda (k)
(case k
((0) (values 1 0))
((1) (values 0 1))))))
(box (share-array
ixn
(shape 0 2)
(lambda (k)
(values 1 0)))))
(and (eq? (array-ref arr col0) 'nw)
(eq? (array-ref arr row0) 'ne)
(eq? (array-ref arr wor1) 'nw)
(eq? (array-ref arr cod) 'se)
(eq? (array-ref arr box) 'sw)
(begin
(array-set! arr col0 'ul)
(array-set! arr row0 'ur)
(array-set! arr cod 'lr)
(array-set! arr box 'll)
#t)
(eq? (array-ref arr 4 5) 'ul)
(eq? (array-ref arr 4 6) 'ur)
(eq? (array-ref arr 5 5) 'll)
(eq? (array-ref arr 5 6) 'lr)
(begin
(array-set! arr wor1 'xx)
(eq? (array-ref arr 4 5) 'xx)))))
(error "array access with sharing index array failed"))
(past "array access with sharing index array")
;;; Check that shape arrays work even when they share
;;;
;;; arr shp shq shr shs
;;; 1 2 3 4 0 1 0 1 0 1 0 1
;;; 1 10 12 16 20 0 10 12 0 12 20 0 10 10 0 12 12
;;; 2 10 11 12 13 1 10 11 1 11 13 1 11 12 1 12 12
;;; 2 12 16
;;; 3 13 20
(or (let ((arr (array (shape 1 3 1 5) 10 12 16 20 10 11 12 13)))
(let ((shp (share-array
arr
(shape 0 2 0 2)
(lambda (r k)
(values (+ r 1) (+ k 1)))))
(shq (share-array
arr
(shape 0 2 0 2)
(lambda (r k)
(values (+ r 1) (* 2 (+ 1 k))))))
(shr (share-array
arr
(shape 0 4 0 2)
(lambda (r k)
(values (- 2 k) (+ r 1)))))
(shs (share-array
arr
(shape 0 2 0 2)
(lambda (r k)
(values 2 3)))))
(and (let ((arr-p (make-array shp)))
(and (= (array-rank arr-p) 2)
(= (array-start arr-p 0) 10)
(= (array-end arr-p 0) 12)
(= (array-start arr-p 1) 10)
(= (array-end arr-p 1) 11)))
(let ((arr-q (array shq * * * * * * * * * * * * * * * *)))
(and (= (array-rank arr-q) 2)
(= (array-start arr-q 0) 12)
(= (array-end arr-q 0) 20)
(= (array-start arr-q 1) 11)
(= (array-end arr-q 1) 13)))
(let ((arr-r (share-array
(array (shape) *)
shr
(lambda _ (values)))))
(and (= (array-rank arr-r) 4)
(= (array-start arr-r 0) 10)
(= (array-end arr-r 0) 10)
(= (array-start arr-r 1) 11)
(= (array-end arr-r 1) 12)
(= (array-start arr-r 2) 12)
(= (array-end arr-r 2) 16)
(= (array-start arr-r 3) 13)
(= (array-end arr-r 3) 20)))
(let ((arr-s (make-array shs)))
(and (= (array-rank arr-s) 2)
(= (array-start arr-s 0) 12)
(= (array-end arr-s 0) 12)
(= (array-start arr-s 1) 12)
(= (array-end arr-s 1) 12))))))
(error "sharing shape array failed"))
(past "sharing shape array")
(let ((super (array (shape 4 7 4 7)
1 * *
* 2 *
* * 3))
(subshape (share-array
(array (shape 0 2 0 3)
* 4 *
* 7 *)
(shape 0 1 0 2)
(lambda (r k)
(values k 1)))))
(let ((sub (share-array super subshape (lambda (k) (values k k)))))
;(array-equal? subshape (shape 4 7))
(or (and (= (array-rank subshape) 2)
(= (array-start subshape 0) 0)
(= (array-end subshape 0) 1)
(= (array-start subshape 1) 0)
(= (array-end subshape 1) 2)
(= (array-ref subshape 0 0) 4)
(= (array-ref subshape 0 1) 7))
(error "sharing subshape failed"))
;(array-equal? sub (array (shape 4 7) 1 2 3))
(or (and (= (array-rank sub) 1)
(= (array-start sub 0) 4)
(= (array-end sub 0) 7)
(= (array-ref sub 4) 1)
(= (array-ref sub 5) 2)
(= (array-ref sub 6) 3))
(error "sharing with sharing subshape failed"))))
(past "sharing with sharing subshape")