[Shootout-list] Numerical medium-sized benchmarks

Sebastien Loisel Sebastien Loisel <sloisel@gmail.com>
Fri, 25 Mar 2005 02:08:05 -0800


------=_Part_454_31391994.1111745285716
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

The included ASCII source got munged by either gmail or the web
archive of the mailing list, so I'm resending with attachments
instead.

------=_Part_454_31391994.1111745285716
Content-Type: text/plain; name=numbench-matrix-norm.c; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="numbench-matrix-norm.c"

#include <stdio.h>
#include <math.h>

double eval_A(int i, int j) { return 1.0/((i+j)*(i+j+1)/2+i+1); }

void eval_A_times_u(int N, const double u[], double Au[])
{
  int i,j;
  for(i=0;i<N;i++)
    {
      Au[i]=0;
      for(j=0;j<N;j++) Au[i]+=eval_A(i,j)*u[j];
    }
}

void eval_At_times_u(int N, const double u[], double Au[])
{
  int i,j;
  for(i=0;i<N;i++)
    {
      Au[i]=0;
      for(j=0;j<N;j++) Au[i]+=eval_A(j,i)*u[j];
    }
}

void eval_AtA_times_u(int N, const double u[], double AtAu[])
{ double v[N]; eval_A_times_u(N,u,v); eval_At_times_u(N,v,AtAu); }

int main()
{
  int N=2000,i;
  double u[N],v[N],vBv,vv;
  for(i=0;i<N;i++) u[i]=1;
  for(i=0;i<10;i++)
    {
      eval_AtA_times_u(N,u,v);
      eval_AtA_times_u(N,v,u);
    }
  vBv=vv=0;
  for(i=0;i<N;i++) { vBv+=u[i]*v[i]; vv+=v[i]*v[i]; }
  printf("%0.20f\n",sqrt(vBv/vv));
  return 0;
}


------=_Part_454_31391994.1111745285716
Content-Type: application/octet-stream; name=numbench-matrix-norm.ml
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="numbench-matrix-norm.ml"

let eval_A i j = 1.0 /. (float_of_int ((i+j)*(i+j+1)/2+i+1))
let eval_A_times_u u v =
  for i = 0 to (Array.length v) - 1 do
    v.(i) <- 0.0 ;
    for j = 0 to (Array.length u) - 1 do
      v.(i) <- v.(i) +. (eval_A i j) *. u.(j)
    done
  done
let eval_At_times_u u v =
  for i = 0 to (Array.length v)-1 do
    v.(i)<-0.0 ;
    for j = 0 to (Array.length u)-1 do
      v.(i)<-v.(i) +. (eval_A j i) *. u.(j)
    done
  done
let print_array u =
  for i = 0 to (Array.length u)-1 do
    Printf.printf " %f" u.(i)
  done;
  Printf.printf "\n"

let eval_AtA_times_u u v =
  let w = Array.create (Array.length u) 0.0 in
  eval_A_times_u u w; eval_At_times_u w v

let n=2000
let u = Array.create n 1.0
let v = Array.create n 0.0 ;;

for i = 0 to 9 do
  eval_AtA_times_u u v; eval_AtA_times_u v u
done;;

let vv = ref 0.0
let vBv = ref 0.0 ;;

for i=0 to n-1 do
  vv := !vv +. v.(i) *. v.(i);
  vBv := !vBv +. u.(i) *. v.(i)
done;;

Printf.printf "%.20f\n" (sqrt (!vBv /. !vv));;

------=_Part_454_31391994.1111745285716
Content-Type: text/plain; name=numbench-matrix-norm.py; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="numbench-matrix-norm.py"

#!/usr/bin/python
#numarray version left as an exercise

from math import sqrt
def eval_A(i,j):
	return 1.0/((i+j)*(i+j+1)/2+i+1)

def eval_A_times_u(u):
	v=[0]*len(u)
	for i in range(len(u)):
		for j in range(len(u)):
			v[i]=v[i]+eval_A(i,j)*u[j]
	return v

def eval_At_times_u(u):
	v=[0]*len(u)
	for i in range(len(u)):
		for j in range(len(u)):
			v[i]=v[i]+eval_A(j,i)*u[j]
	return v

def eval_AtA_times_u(u):
	return eval_At_times_u(eval_A_times_u(u))

n=2000
u=[1]*n
for i in range(10):
	v=eval_AtA_times_u(u)
	u=eval_AtA_times_u(v)
vBv=0
vv=0
for i in range(n):
	vBv=vBv+u[i]*v[i]
	vv=vv+v[i]*v[i]
print sqrt(vBv/vv)


------=_Part_454_31391994.1111745285716--