/*
 * Matrix implementation
 */

#include <vector>
#include <iostream.h>
using namespace std;

typedef vector<vector<double> > vecrep;

double inner_product(const Row& r, const Column& c) {
  double result = 0;
  for (int i = 0; i < r.length(); ++i)
    result += r[i] * c[i];
  return result;
}

class Matrix_impl : virtual public _sk_Matrix {
    rep mr;
    int _calls;
public:
    Matrix_impl (const vecrep& m0)
    {
        _calls = 0;
        mr.length(m0.size());
        for (int i = 0; i < m0.size(); ++i) {
	  mr[i].length(m0[i].size());
	  for (int j = 0; j < m0[i].size(); ++j)
	    mr[i][j] = m0[i][j];
	}
    }
    Column* block_product( CORBA::ULong first, 
                           CORBA::ULong last, const Column& c )
    {
      cout << "block_product(" << first << ", " << last << ", c) start" 
           << endl;
      Column* z = new Column;
      z->length(last - first);
      int k = 0;
      for (int i = first; i != last; ++i, ++k) 
	(*z)[k] = inner_product(mr[i], c);
      cout << "block_product(" << first << ", " << last << ", c) end" 
           << endl;
      return z;
    }

};


