#include "libscl.h"
using namespace scl;
using namespace std;

int main(int argc, char** argp, char** envp)
{
  INT_32BIT seed = 12345;

  typedef vector<REAL>::size_type rv_int;

  const INTEGER n = 100000;

  REAL sum;

  realmat arm(n,1);
  realmat brm(n,1);
  vector<REAL> arv(n);
  vector<REAL> brv(n);
  REAL a[n];
  REAL b[n];

  for (INTEGER i=1; i<=n; ++i) {
    arm[i] = unsk(seed);
    brm[i] = unsk(seed);
    rv_int j = i-1;
    arv[j] = arm[i];
    brv[j] = brm[i];
    int k = i-1;
    a[k] = arm[i];
    b[k] = brm[i];
  }

  cout << starbox("/Inner products//") << '\n';
  sum = (T(arm)*brm)[1];
  cout << "     1 of 6  " << sum <<  '\n';

  sum = 0.0;
  for (INTEGER i=1; i<=n; ++i) {
    sum += arm[i]*brm[i];
  }
  cout << "     2 of 6  " << sum <<  '\n';

  sum = 0.0;
  for (INTEGER i=0; i<n; ++i) {
    sum += arv[i]*brv[i];
  }
  cout << "     3 of 6  " << sum <<  '\n';

  sum = 0.0;
  for (INTEGER i=0; i<n; ++i) {
    sum += a[i]*b[i];
  }
  cout << "     4 of 6  " << sum <<  '\n';

  REAL* a_iter = a;
  REAL* b_iter = b;
  REAL* a_end = a + n;
  sum = 0.0;
  while(a_iter<a_end) {
   sum += (*a_iter++)*(*b_iter++);
  }
  cout << "     5 of 6  " << sum <<  '\n';
  
  vector<REAL>::const_iterator arv_iter = arv.begin();
  vector<REAL>::const_iterator brv_iter = brv.begin();
  vector<REAL>::const_iterator arv_end = arv.end();  
  sum = 0.0;
  while(arv_iter<arv_end) {
   sum += (*arv_iter++)*(*brv_iter++);
  }
  cout << "     6 of 6  " << sum <<  '\n';

  cout << starbox("/first 10 elements after sort//") << '\n';

  sort(a,a_end);
  a_iter = a;
  REAL* a_10 = a+10;
  while (a_iter<a_10) {
    cout << "     " << *a_iter++ << '\n';
  }

  vector<realmat> v;
  for(INTEGER i=1; i<=5; i++) {
    realmat x(1,5);
    for (INTEGER j=1; j<=5; j++) {
      x[j] = unsk(seed);
    }
    v.push_back(x);
  }

  vector<realmat>::const_iterator v_iter;

  cout << starbox("/before sort//");

  for (v_iter = v.begin(); v_iter < v.end(); ++v_iter) {
    cout << *v_iter;
  }

  sort(v.begin(),v.end(),realmat_cmp());

  cout << starbox("/after sort//");

  for (v_iter = v.begin(); v_iter < v.end(); ++v_iter) {
    cout << *v_iter;
  }
   
  return 0;
}
