digitalmars.D - Built-in array ops
- bearophile (78/78) Jul 25 2012 This is useful Mathlab code (from Expokit, it's part of code to
This is useful Mathlab code (from Expokit, it's part of code to 
compute exponents of sparse matrices coming from Markov chains):
http://www.maths.uq.edu.au/expokit/matlab/mexpv.m
It's related to this Fortran code:
http://www.maths.uq.edu.au/expokit/fortran/dmexpv.f
If I have to write minimally serious D code to implement 
something similar to that Mathlab or Fortran code, like this:
while t_now < t_out
   istep = istep + 1;
   t_step = min( t_out-t_now,t_new );
   V = zeros(n,m+1);
   H = zeros(m+2,m+2);
   V(:,1) = (1/beta)*w;
   for j = 1:m
      p = A*V(:,j);
      for i = 1:j
         H(i,j) = V(:,i)'*p;
         p = p-H(i,j)*V(:,i);
      end;
      s = norm(p);
      if s < btol,
         k1 = 0;
         mb = j;
         t_step = t_out-t_now;
         break;
      end;
      H(j+1,j) = s;
      V(:,j+1) = (1/s)*p;
   end;
   if k1 ~= 0,
      H(m+2,m+1) = 1;
      avnorm = norm(A*V(:,m+1));
   end;
I use a library that implements efficient rectangular and sparse 
matrices and some useful functions like zeros() and more, so the 
Mathlab code like this:
p = p-H(i,j)*V(:,i);
becomes (assuming Don's proposal to introduce multiple 
user-defined dollars):
p -= H(i, j) * V(0..$, i);
replacing ":" with "0..$" introduces more noise but it's probably 
acceptable. In such code I use only such library-defined data 
structures, so built-in array ops are never used.
Maybe you want to use built-in array ops in casual D code, that 
doesn't want to import a whole good matrix library, but in 
practice so far in my D2 code I have needed vector ops only quite 
rarely (while I have several time desired a sparse matrix 
library, for simulations and more).
In well known C++ libraries templates are used in complex ways to 
remove the creation of intermediate arrays in long vectorized 
expressions. D built-in vector ops are able to do that, but when 
performance is important I am probably already using a 
matrix/vector library (also for flexibility, because it supports 
sparse arrays, disk-mapped very large tensors, and so on). I 
don't remember people using those template metaprogramming tricks 
in D.
While I like built-in array ops, what are their use cases to 
justify their presence in the language? Has someone used them a 
lot so far? Is deprecating them going to damage future D in some 
way?
Isn't it better to introduce in D syntax (like the multiple $ 
from Don) that allows future D programmers to implement highly 
efficient matrix libraries with a clean syntax for the final 
user? "Highly efficient" may mean offer built-in ways to avoid 
the creation of intermediate library-defined arrays in complex 
expressions, and maybe it also means offering built-in ways to 
help the management of the hierarchical nature of the memory of 
future computing systems, as done in Chapel language.
This is one case where I agree with Andrei that giving language 
tools to build good libraries is probably better than putting 
things in the language itself. As example I think that built-in 
tuples are 200 times more useful/handy than built-in vector ops, 
despite I write mixed scientific D2 code that is using arrays a 
lot. Also, currently D vector ops are in many cases less 
efficient than normal loops, for all but the largest 1D dense 
arrays.
Bye,
bearophile
 Jul 25 2012








 
  
  
  "bearophile" <bearophileHUGS lycos.com>
 "bearophile" <bearophileHUGS lycos.com>