|
belated feedback
Alex Shinn
(16 Apr 2021 15:00 UTC)
|
|
Re: belated feedback
Bradley Lucier
(16 Apr 2021 17:08 UTC)
|
|
Re: belated feedback
John Cowan
(16 Apr 2021 18:25 UTC)
|
|
Re: belated feedback
Bradley Lucier
(17 Apr 2021 21:48 UTC)
|
|
Re: belated feedback
Alex Shinn
(18 Apr 2021 23:45 UTC)
|
|
Re: belated feedback Bradley Lucier (16 Apr 2021 23:46 UTC)
|
|
Re: belated feedback
Alex Shinn
(17 Apr 2021 00:03 UTC)
|
|
Re: belated feedback
Bradley Lucier
(17 Apr 2021 01:10 UTC)
|
|
Re: belated feedback
Alex Shinn
(17 Apr 2021 01:22 UTC)
|
|
Re: belated feedback
Alex Shinn
(30 Apr 2021 05:41 UTC)
|
|
Re: belated feedback
Bradley Lucier
(30 Apr 2021 14:17 UTC)
|
|
Re: belated feedback
John Cowan
(30 Apr 2021 15:04 UTC)
|
|
Re: belated feedback
Bradley Lucier
(30 Apr 2021 16:42 UTC)
|
|
Re: belated feedback
Alex Shinn
(01 May 2021 09:27 UTC)
|
|
array-elements-in-order? (Was: belated feedback)
Bradley Lucier
(16 Jan 2022 19:08 UTC)
|
Dear Alex:
Your routine
(define (specialized-array-share array new-domain project)
(assert (specialized-array? array) (interval? new-domain))
(let ((body (array-body array))
(indexer (lambda multi-index
(call-with-values
(lambda () (apply project multi-index))
(array-indexer array))))
(storage (array-storage-class array)))
(%make-array
new-domain
(specialized-getter body indexer (storage-class-getter storage))
(specialized-setter body indexer (storage-class-setter storage))
storage
body
indexer
(array-safe? array))))
does not take into account the affine structure of either project or
(array-indexer array) to simplify the indexer of the result array as in
the procedure (array/optimize-linear-function f d) in Bawden's original
newsgroup post
https://groups.google.com/g/comp.lang.scheme/c/7nkx58Kv6RI/m/a5hdsduFL2wJ
I thought to look more carefully after I installed the git version of
chibi myself to try the example in my previous email and everything worked:
=========================================================
heine:~/programs/chibi-scheme> /usr/local/chibi/bin/chibi-scheme
> (import (srfi 179))
> (define A (array-copy (make-array (make-interval '#(3 4)) list)))
> (define B (array-sample A '#(2 1))) >
> (define (array-display A)
(define (display-item x)
(display x) (display "\t"))
(newline)
(case (array-dimension A)
((1) (array-for-each display-item A) (newline))
((2) (array-for-each (lambda (row)
(array-for-each display-item row)
(newline))
(array-curry A 1)))
(else
(error "array-display can't handle > 2 dimensions: " A))))
> (array-display (specialized-array-reshape B (make-interval '#(8))))
(0 0) (0 1) (0 2) (0 3) (0 0) (0 1) (0 2) (0 3)
> (array-sample (specialized-array-reshape B (make-interval '#(8))) '#(3))
#<Array 139698477832576>
> (array-display (array-sample (specialized-array-reshape B
(make-interval '#(8))) '#(3)))
(0 0) (0 3) (0 2)
> (array-body B)
#((0 0) (0 1) (0 2) (0 3) (1 0) (1 1) (1 2) (1 3) (2 0) (2 1) (2 2) (2 3))
> (array-display A)
(0 0) (0 1) (0 2) (0 3)
(1 0) (1 1) (1 2) (1 3)
(2 0) (2 1) (2 2) (2 3)
> (array-display B)
(0 0) (0 1) (0 2) (0 3)
(2 0) (2 1) (2 2) (2 3)
> (specialized-array? (array-sample (specialized-array-reshape B
(make-interval '#(8))) '#(3)))
#t
=========================================================
I think implicit in the text of this SRFI is that the indexer of a
specialized array should take time bounded independent of the number of
Bawden-style transformations that have been applied to it. In the SRFI
document there are the following two statements:
=========================================================
Second, because the composition of any number of affine mappings is
again affine, accessing or changing the elements of a restricted,
translated, curried, permuted array is no slower than accessing or
changing the elements of the original array itself.
=========================================================
where those operations are applied in order to the same array, and
=========================================================
Note: It is assumed that the affine structure of the composition of
new-domain->old-domain and (array-indexer array) will be used to simplify:
(lambda multi-index
(call-with-values
(lambda ()
(apply new-domain->old-domain multi-index))
(array-indexer array)))
=========================================================
I think using your definition of specialized-array-reshape in the sample
implementation, while leaving everything else the same, would cause
=========================================================
> (array-display (array-sample (specialized-array-reshape B
(make-interval '#(8))) '#(3)))
(0 0) (0 3) (0 2) =========================================================
from the above example to fail.
I don't know whether more explicit language is needed in the SRFI
document to guide implementors.
Brad