On Sat, Sep 2, 2023 at 11:51 PM Lucier, Bradley J <xxxxxx@purdue.edu> wrote:

I’m sorry, but I don’t totally understand your comment "231 doesn't directly support arbitrary affine transforms”.  SRFI 231 has specialized-array-share, which does allow arbitrary (one-to-one) affine transforms on array domains, new-domain -> old-domain.

Specialized-array-share returns a specialized-array, so if you convert an array into a one-dimensional array it gets copied, which is no better than invoking array->vector.  For the special case of row-major-aref you need to do flooring division to figure out how to convert the single index to the multi-index (which then gets converted back to the single-index internally to array-ref).  You can also pull out the data with `storage-class-data->body` and then use that to construct a one-dimensional array from it, though I don't quite see how.



What is needed is a mapping taking

[0, (interval-volume (array-domain A))

to valid consecutive multi-indices in (array-domain A).  One can compute this with a series of quotient and remainders of n with partial products of the widths of the interval, which are then added to the lower bounds of the interval.

Of course, having done that you then need to convert the interval back the other way inside array-ref.   Perhaps you can do something with `storage-class-data->body, but then you have to index into the body, and I'm not sure how you do that.  Do storage-class-ref and storage-class-set! have the right behaviors?