ideas in blitz++ Sebastien.deMentendeHorne@xxxxxx 16 Nov 2001 15:18 UTC

Great SRFI!!

However, if I can suggest to have a look at the library blitz++ : this is a
template library in C++ (a bag of clever macros) which deals with arrays.
They have defined some basic operations and others not so basic to deal with
multi-dimensional arrays.
Some concepts from this library :
  - represent the data as a linear vector
  - store shape information in some "vectors":
      - base vector : store the lower index in each dimension
      - length vector : store number of indices in each dimension
      - step vector : store the step size for each dimension
      - stride vector : store the product of the length of the dimension g
      - permutation vector : store if any permutation
  - a different object to reprensent shapes

Hence, in order to acces the element (array-ref a 3 5 6), we compute :
   i = (3-base[permutation[0]])/step[permutation[0]]*stride[permutation[0]]
and give (vector-ref v i).

In the SRFI-25 way of thinking, the analogies are:
	(shape a) = (base[0] (+ base[0] length[0]) ... base[n] (+ base[n]
      permutation = (0 1 ... n) (no permutation of indices)
	step = (1 1 ... 1) (indices increase only by 1)
      stride = (lentgh[0]*...*length[n-1]*1 lentgh[1]*...*length[n-1]*1 ...
length[n-1]*1 1)

Some advantages of the representation are:
	- the possibility to transpose arrays with no cost by doing:
	     permutation = (1 0 2) instead of (0 1 2)
      - having steps (may be negative or positive)
	- representing slice (with affine maps) by playing only on
"base","step" and "permutation"
      - shapes are not arrays, indices are not arrays because they both need
more economic and efficient representations

Well, I think it is worth the look. Maybe those ideas are only ideas for
implementations but anyway, this is a srfI !
Moreover, this can be efficiently done (no vector nestings) and can be a
great tool for numeric calculus (speed AND high level language!!!)

Sebastien de Menten