// Small bench routine for Eigen available in Eigen
// (C) Desire NUENTSA WAKAM, INRIA

#include <iostream>
#include <fstream>
#include <iomanip>
#include <unsupported/Eigen/SparseExtra>
#include <Eigen/SparseLU>
#include <bench/BenchTimer.h>

using namespace std;
using namespace Eigen;

int main(int argc, char **args)
{
//   typedef complex<double> scalar; 
  typedef double scalar; 
  SparseMatrix<scalar, ColMajor> A; 
  typedef SparseMatrix<scalar, ColMajor>::Index Index;
  typedef Matrix<scalar, Dynamic, Dynamic> DenseMatrix;
  typedef Matrix<scalar, Dynamic, 1> DenseRhs;
  Matrix<scalar, Dynamic, 1> b, x, tmp;
//   SparseLU<SparseMatrix<scalar, ColMajor>, AMDOrdering<int> >   solver;
  SparseLU<SparseMatrix<scalar, ColMajor>, COLAMDOrdering<int> >   solver;
  ifstream matrix_file; 
  string line;
  int  n;
  BenchTimer timer; 
  
  // Set parameters
  /* Fill the matrix with sparse matrix stored in Matrix-Market coordinate column-oriented format */
  if (argc < 2) assert(false && "please, give the matrix market file ");
  loadMarket(A, args[1]);
  cout << "End charging matrix " << endl;
  bool iscomplex=false, isvector=false;
  int sym;
  getMarketHeader(args[1], sym, iscomplex, isvector);
//   if (iscomplex) { cout<< " Not for complex matrices \n"; return -1; }
  if (isvector) { cout << "The provided file is not a matrix file\n"; return -1;}
  if (sym != 0) { // symmetric matrices, only the lower part is stored
    SparseMatrix<scalar, ColMajor> temp; 
    temp = A;
    A = temp.selfadjointView<Lower>();
  }
  n = A.cols();
  /* Fill the right hand side */

  if (argc > 2)
    loadMarketVector(b, args[2]);
  else 
  {
    b.resize(n);
    tmp.resize(n);
//       tmp.setRandom();
    for (int i = 0; i < n; i++) tmp(i) = i; 
    b = A * tmp ;
  }

  /* Compute the factorization */
//   solver.isSymmetric(true);
  timer.start(); 
//   solver.compute(A);
  solver.analyzePattern(A); 
  timer.stop(); 
  cout << "Time to analyze " << timer.value() << std::endl;
  timer.reset(); 
  timer.start(); 
  solver.factorize(A); 
  timer.stop(); 
  cout << "Factorize Time " << timer.value() << std::endl;
  timer.reset(); 
  timer.start(); 
  solver._solve(b, x);
  timer.stop();
  cout << "solve time " << timer.value() << std::endl; 
  /* Check the accuracy */
  Matrix<scalar, Dynamic, 1> tmp2 = b - A*x;
  scalar tempNorm = tmp2.norm()/b.norm();
  cout << "Relative norm of the computed solution : " << tempNorm <<"\n";
  cout << "Number of nonzeros in the factor : " << solver.nnzL() + solver.nnzU() << std::endl; 
  
  return 0;
}