1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@inria.fr>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <iostream>
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <fstream>
137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <Eigen/SparseCore>
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <bench/BenchTimer.h>
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <cstdlib>
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <string>
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Cholesky>
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Jacobi>
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Householder>
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/IterativeLinearSolvers>
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <unsupported/Eigen/IterativeSolvers>
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/LU>
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <unsupported/Eigen/SparseExtra>
247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <Eigen/SparseLU>
257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include "spbenchstyle.h"
277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#ifdef EIGEN_METIS_SUPPORT
297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include <Eigen/MetisSupport>
307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_CHOLMOD_SUPPORT
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/CholmodSupport>
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_UMFPACK_SUPPORT
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/UmfPackSupport>
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_PARDISO_SUPPORT
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/PardisoSupport>
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_SUPERLU_SUPPORT
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/SuperLUSupport>
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_PASTIX_SUPPORT
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/PaStiXSupport>
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// CONSTANTS
537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_UMFPACK  10
547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_SUPERLU  20
557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_PASTIX  30
567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_PARDISO  40
577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_SPARSELU_COLAMD 50
587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_SPARSELU_METIS 51
597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_BICGSTAB  60
607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_BICGSTAB_ILUT  61
617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_GMRES 70
627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_GMRES_ILUT 71
637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_SIMPLICIAL_LDLT  80
647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_CHOLMOD_LDLT  90
657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_PASTIX_LDLT  100
667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_PARDISO_LDLT  110
677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_SIMPLICIAL_LLT  120
687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_CHOLMOD_SUPERNODAL_LLT  130
697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_CHOLMOD_SIMPLICIAL_LLT  140
707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_PASTIX_LLT  150
717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_PARDISO_LLT  160
727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_CG  170
737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#define EIGEN_CG_PRECOND  180
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing namespace Eigen;
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing namespace std;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Global variables for input parameters
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathint MaximumIters; // Maximum number of iterations
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdouble RelErr; // Relative error of the computed solution
827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezdouble best_time_val; // Current best time overall solvers
837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezint best_time_id; //  id of the best solver for the current system
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> inline typename NumTraits<T>::Real test_precision() { return NumTraits<T>::dummy_precision(); }
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> inline float test_precision<float>() { return 1e-3f; }
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> inline double test_precision<double>() { return 1e-6; }
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> inline float test_precision<std::complex<float> >() { return test_precision<float>(); }
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<> inline double test_precision<std::complex<double> >() { return test_precision<double>(); }
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid printStatheader(std::ofstream& out)
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // Print XML header
947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // NOTE It would have been much easier to write these XML documents using external libraries like tinyXML or Xerces-C++.
957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "<?xml version='1.0' encoding='UTF-8'?> \n";
977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "<?xml-stylesheet type='text/xsl' href='#stylesheet' ?> \n";
987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "<!DOCTYPE BENCH  [\n<!ATTLIST xsl:stylesheet\n id\t ID  #REQUIRED>\n]>";
997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "\n\n<!-- Generated by the Eigen library -->\n";
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "\n<BENCH> \n" ; //root XML element
1027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // Print the xsl style section
1037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  printBenchStyle(out);
1047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // List all available solvers
1057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << " <AVAILSOLVER> \n";
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_UMFPACK_SUPPORT
1077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_UMFPACK << "'>\n";
1087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LU </TYPE> \n";
1097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> UMFPACK </PACKAGE> \n";
1107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_SUPERLU_SUPPORT
1137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_SUPERLU << "'>\n";
1147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LU </TYPE> \n";
1157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> SUPERLU </PACKAGE> \n";
1167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_CHOLMOD_SUPPORT
1197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_CHOLMOD_SIMPLICIAL_LLT << "'>\n";
1207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LLT SP</TYPE> \n";
1217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> CHOLMOD </PACKAGE> \n";
1227faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1237faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_CHOLMOD_SUPERNODAL_LLT << "'>\n";
1257faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LLT</TYPE> \n";
1267faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> CHOLMOD </PACKAGE> \n";
1277faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1287faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_CHOLMOD_LDLT << "'>\n";
1307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LDLT </TYPE> \n";
1317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> CHOLMOD </PACKAGE> \n";
1327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_PARDISO_SUPPORT
1357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_PARDISO << "'>\n";
1367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LU </TYPE> \n";
1377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> PARDISO </PACKAGE> \n";
1387faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1397faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1407faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_PARDISO_LLT << "'>\n";
1417faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LLT </TYPE> \n";
1427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> PARDISO </PACKAGE> \n";
1437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_PARDISO_LDLT << "'>\n";
1467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LDLT </TYPE> \n";
1477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> PARDISO </PACKAGE> \n";
1487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_PASTIX_SUPPORT
1517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_PASTIX << "'>\n";
1527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LU </TYPE> \n";
1537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> PASTIX </PACKAGE> \n";
1547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_PASTIX_LLT << "'>\n";
1577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LLT </TYPE> \n";
1587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> PASTIX </PACKAGE> \n";
1597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_PASTIX_LDLT << "'>\n";
1627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LDLT </TYPE> \n";
1637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> PASTIX </PACKAGE> \n";
1647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
1667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_BICGSTAB << "'>\n";
1687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> BICGSTAB </TYPE> \n";
1697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> EIGEN </PACKAGE> \n";
1707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_BICGSTAB_ILUT << "'>\n";
1737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> BICGSTAB_ILUT </TYPE> \n";
1747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> EIGEN </PACKAGE> \n";
1757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1767faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_GMRES_ILUT << "'>\n";
1787faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> GMRES_ILUT </TYPE> \n";
1797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> EIGEN </PACKAGE> \n";
1807faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_SIMPLICIAL_LDLT << "'>\n";
1837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LDLT </TYPE> \n";
1847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> EIGEN </PACKAGE> \n";
1857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1877faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_SIMPLICIAL_LLT << "'>\n";
1887faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LLT </TYPE> \n";
1897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> EIGEN </PACKAGE> \n";
1907faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1917faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1927faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_CG << "'>\n";
1937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> CG </TYPE> \n";
1947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> EIGEN </PACKAGE> \n";
1957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
1967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
1977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_SPARSELU_COLAMD << "'>\n";
1987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LU_COLAMD </TYPE> \n";
1997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> EIGEN </PACKAGE> \n";
2007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
2017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#ifdef EIGEN_METIS_SUPPORT
2037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out <<"  <SOLVER ID='" << EIGEN_SPARSELU_METIS << "'>\n";
2047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <TYPE> LU_METIS </TYPE> \n";
2057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "   <PACKAGE> EIGEN </PACKAGE> \n";
2067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << "  </SOLVER> \n";
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
2087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  out << " </AVAILSOLVER> \n";
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Solver, typename Scalar>
2147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezvoid call_solver(Solver &solver, const int solver_id, const typename Solver::MatrixType& A, const Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX,std::ofstream& statbuf)
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  double total_time;
2187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  double compute_time;
2197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  double solve_time;
2207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  double rel_error;
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Matrix<Scalar, Dynamic, 1> x;
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  BenchTimer timer;
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  timer.reset();
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  timer.start();
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  solver.compute(A);
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (solver.info() != Success)
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    std::cerr << "Solver failed ... \n";
2297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return;
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
2317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  timer.stop();
2327faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  compute_time = timer.value();
2337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << "    <TIME>\n";
2347faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << "     <COMPUTE> " << timer.value() << "</COMPUTE>\n";
2357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<< "COMPUTE TIME : " << timer.value() <<std::endl;
2367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  timer.reset();
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  timer.start();
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  x = solver.solve(b);
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (solver.info() == NumericalIssue)
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    std::cerr << "Solver failed ... \n";
2437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    return;
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  timer.stop();
2467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  solve_time = timer.value();
2477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << "     <SOLVE> " << timer.value() << "</SOLVE>\n";
2487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<< "SOLVE TIME : " << timer.value() <<std::endl;
2497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
2507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  total_time = solve_time + compute_time;
2517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << "     <TOTAL> " << total_time << "</TOTAL>\n";
2527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<< "TOTAL TIME : " << total_time <<std::endl;
2537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << "    </TIME>\n";
2547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // Verify the relative error
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if(refX.size() != 0)
2577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    rel_error = (refX - x).norm()/refX.norm();
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  else
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // Compute the relative residual norm
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Matrix<Scalar, Dynamic, 1> temp;
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    temp = A * x;
2637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    rel_error = (b-temp).norm()/b.norm();
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
2657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << "    <ERROR> " << rel_error << "</ERROR>\n";
2667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout<< "REL. ERROR : " << rel_error << "\n\n" ;
2677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  if ( rel_error <= RelErr )
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
2697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // check the best time if convergence
2707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(!best_time_val || (best_time_val > total_time))
2717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    {
2727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      best_time_val = total_time;
2737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      best_time_id = solver_id;
2747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    }
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Solver, typename Scalar>
2797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezvoid call_directsolver(Solver& solver, const int solver_id, const typename Solver::MatrixType& A, const Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX, std::string& statFile)
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
2817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    std::ofstream statbuf(statFile.c_str(), std::ios::app);
2827faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    statbuf << "   <SOLVER_STAT ID='" << solver_id <<"'>\n";
2837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_solver(solver, solver_id, A, b, refX,statbuf);
2847faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    statbuf << "   </SOLVER_STAT>\n";
2857faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    statbuf.close();
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Solver, typename Scalar>
2897faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezvoid call_itersolver(Solver &solver, const int solver_id, const typename Solver::MatrixType& A, const Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX, std::string& statFile)
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  solver.setTolerance(RelErr);
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  solver.setMaxIterations(MaximumIters);
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
2947faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::ofstream statbuf(statFile.c_str(), std::ios::app);
2957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << " <SOLVER_STAT ID='" << solver_id <<"'>\n";
2967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  call_solver(solver, solver_id, A, b, refX,statbuf);
2977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << "   <ITER> "<< solver.iterations() << "</ITER>\n";
2987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  statbuf << " </SOLVER_STAT>\n";
2997faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  std::cout << "ITERATIONS : " << solver.iterations() <<"\n\n\n";
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar>
3057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandezvoid SelectSolvers(const SparseMatrix<Scalar>&A, unsigned int sym, Matrix<Scalar, Dynamic, 1>& b, const Matrix<Scalar, Dynamic, 1>& refX, std::string& statFile)
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef SparseMatrix<Scalar, ColMajor> SpMat;
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // First, deal with Nonsymmetric and symmetric matrices
3097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  best_time_id = 0;
3107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  best_time_val = 0.0;
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  //UMFPACK
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #ifdef EIGEN_UMFPACK_SUPPORT
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout << "Solving with UMFPACK LU ... \n";
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    UmfPackLU<SpMat> solver;
3167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_directsolver(solver, EIGEN_UMFPACK, A, b, refX,statFile);
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //SuperLU
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #ifdef EIGEN_SUPERLU_SUPPORT
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout << "\nSolving with SUPERLU ... \n";
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    SuperLU<SpMat> solver;
3247faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_directsolver(solver, EIGEN_SUPERLU, A, b, refX,statFile);
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // PaStix LU
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #ifdef EIGEN_PASTIX_SUPPORT
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout << "\nSolving with PASTIX LU ... \n";
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    PastixLU<SpMat> solver;
3337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_directsolver(solver, EIGEN_PASTIX, A, b, refX,statFile) ;
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   //PARDISO LU
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #ifdef EIGEN_PARDISO_SUPPORT
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout << "\nSolving with PARDISO LU ... \n";
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    PardisoLU<SpMat>  solver;
3427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_directsolver(solver, EIGEN_PARDISO, A, b, refX,statFile);
3437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  }
3447faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  #endif
3457faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
3467faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // Eigen SparseLU METIS
3477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  cout << "\n Solving with Sparse LU AND COLAMD ... \n";
3487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  SparseLU<SpMat, COLAMDOrdering<int> >   solver;
3497faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  call_directsolver(solver, EIGEN_SPARSELU_COLAMD, A, b, refX, statFile);
3507faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  // Eigen SparseLU METIS
3517faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  #ifdef EIGEN_METIS_SUPPORT
3527faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
3537faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    cout << "\n Solving with Sparse LU AND METIS ... \n";
3547faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    SparseLU<SpMat, MetisOrdering<int> >   solver;
3557faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_directsolver(solver, EIGEN_SPARSELU_METIS, A, b, refX, statFile);
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  //BiCGSTAB
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout << "\nSolving with BiCGSTAB ... \n";
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BiCGSTAB<SpMat> solver;
3637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_itersolver(solver, EIGEN_BICGSTAB, A, b, refX,statFile);
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  //BiCGSTAB+ILUT
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout << "\nSolving with BiCGSTAB and ILUT ... \n";
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    BiCGSTAB<SpMat, IncompleteLUT<Scalar> > solver;
3697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_itersolver(solver, EIGEN_BICGSTAB_ILUT, A, b, refX,statFile);
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  //GMRES
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//   {
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     cout << "\nSolving with GMRES ... \n";
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     GMRES<SpMat> solver;
3777faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//     call_itersolver(solver, EIGEN_GMRES, A, b, refX,statFile);
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//   }
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  //GMRES+ILUT
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout << "\nSolving with GMRES and ILUT ... \n";
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    GMRES<SpMat, IncompleteLUT<Scalar> > solver;
3837faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    call_itersolver(solver, EIGEN_GMRES_ILUT, A, b, refX,statFile);
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // Hermitian and not necessarily positive-definites
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (sym != NonSymmetric)
388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // Internal Cholesky
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with Simplicial LDLT ... \n";
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      SimplicialLDLT<SpMat, Lower> solver;
3937faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      call_directsolver(solver, EIGEN_SIMPLICIAL_LDLT, A, b, refX,statFile);
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // CHOLMOD
397c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN_CHOLMOD_SUPPORT
398c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
399c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with CHOLMOD LDLT ... \n";
400c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      CholmodDecomposition<SpMat, Lower> solver;
401c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      solver.setMode(CholmodLDLt);
4027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez       call_directsolver(solver,EIGEN_CHOLMOD_LDLT, A, b, refX,statFile);
403c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
404c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
405c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
406c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //PASTIX LLT
407c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN_PASTIX_SUPPORT
408c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
409c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with PASTIX LDLT ... \n";
410c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      PastixLDLT<SpMat, Lower> solver;
4117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      call_directsolver(solver,EIGEN_PASTIX_LDLT, A, b, refX,statFile);
412c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
413c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
414c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
415c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //PARDISO LLT
416c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN_PARDISO_SUPPORT
417c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
418c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with PARDISO LDLT ... \n";
419c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      PardisoLDLT<SpMat, Lower> solver;
4207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      call_directsolver(solver,EIGEN_PARDISO_LDLT, A, b, refX,statFile);
421c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
422c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
423c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
424c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
425c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // Now, symmetric POSITIVE DEFINITE matrices
426c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if (sym == SPD)
427c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
428c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
429c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //Internal Sparse Cholesky
430c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
431c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with SIMPLICIAL LLT ... \n";
432c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      SimplicialLLT<SpMat, Lower> solver;
4337faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      call_directsolver(solver,EIGEN_SIMPLICIAL_LLT, A, b, refX,statFile);
434c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
435c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
436c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // CHOLMOD
437c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN_CHOLMOD_SUPPORT
438c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
439c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      // CholMOD SuperNodal LLT
440c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with CHOLMOD LLT (Supernodal)... \n";
441c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      CholmodDecomposition<SpMat, Lower> solver;
442c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      solver.setMode(CholmodSupernodalLLt);
4437faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez       call_directsolver(solver,EIGEN_CHOLMOD_SUPERNODAL_LLT, A, b, refX,statFile);
444c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      // CholMod Simplicial LLT
445c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with CHOLMOD LLT (Simplicial) ... \n";
446c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      solver.setMode(CholmodSimplicialLLt);
4477faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      call_directsolver(solver,EIGEN_CHOLMOD_SIMPLICIAL_LLT, A, b, refX,statFile);
448c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
449c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
450c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
451c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //PASTIX LLT
452c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN_PASTIX_SUPPORT
453c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
454c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with PASTIX LLT ... \n";
455c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      PastixLLT<SpMat, Lower> solver;
4567faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      call_directsolver(solver,EIGEN_PASTIX_LLT, A, b, refX,statFile);
457c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
458c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
459c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
460c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //PARDISO LLT
461c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #ifdef EIGEN_PARDISO_SUPPORT
462c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
463c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with PARDISO LLT ... \n";
464c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      PardisoLLT<SpMat, Lower> solver;
4657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      call_directsolver(solver,EIGEN_PARDISO_LLT, A, b, refX,statFile);
466c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
467c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #endif
468c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
469c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // Internal CG
470c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
471c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      cout << "\nSolving with CG ... \n";
472c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      ConjugateGradient<SpMat, Lower> solver;
4737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      call_itersolver(solver,EIGEN_CG, A, b, refX,statFile);
474c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
475c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //CG+IdentityPreconditioner
476c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     {
477c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       cout << "\nSolving with CG and IdentityPreconditioner ... \n";
478c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//       ConjugateGradient<SpMat, Lower, IdentityPreconditioner> solver;
4797faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez//       call_itersolver(solver,EIGEN_CG_PRECOND, A, b, refX,statFile);
480c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//     }
481c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  } // End SPD matrices
482c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
483c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
484c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/* Browse all the matrices available in the specified folder
485c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * and solve the associated linear system.
486c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * The results of each solve are printed in the standard output
487c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * and optionally in the provided html file
488c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */
489c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar>
490c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid Browse_Matrices(const string folder, bool statFileExists, std::string& statFile, int maxiters, double tol)
491c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
492c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MaximumIters = maxiters; // Maximum number of iterations, global variable
493c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  RelErr = tol;  //Relative residual error  as stopping criterion for iterative solvers
494c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixMarketIterator<Scalar> it(folder);
495c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for ( ; it; ++it)
4967faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  {
4977faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    //print the infos for this linear system
4987faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    if(statFileExists)
499c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
5007faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      std::ofstream statbuf(statFile.c_str(), std::ios::app);
5017faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf << "<LINEARSYSTEM> \n";
5027faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf << "   <MATRIX> \n";
5037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf << "     <NAME> " << it.matname() << " </NAME>\n";
5047faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf << "     <SIZE> " << it.matrix().rows() << " </SIZE>\n";
5057faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf << "     <ENTRIES> " << it.matrix().nonZeros() << "</ENTRIES>\n";
5067faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      if (it.sym()!=NonSymmetric)
5077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      {
5087faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        statbuf << "     <SYMMETRY> Symmetric </SYMMETRY>\n" ;
5097faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        if (it.sym() == SPD)
5107faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez          statbuf << "     <POSDEF> YES </POSDEF>\n";
5117faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        else
5127faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez          statbuf << "     <POSDEF> NO </POSDEF>\n";
5137faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez
5147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      }
5157faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      else
5167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      {
5177faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        statbuf << "     <SYMMETRY> NonSymmetric </SYMMETRY>\n" ;
5187faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez        statbuf << "     <POSDEF> NO </POSDEF>\n";
5197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      }
5207faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf << "   </MATRIX> \n";
5217faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf.close();
522c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
523c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
524c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout<< "\n\n===================================================== \n";
525c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout<< " ======  SOLVING WITH MATRIX " << it.matname() << " ====\n";
526c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cout<< " =================================================== \n\n";
527c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Matrix<Scalar, Dynamic, 1> refX;
528c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if(it.hasrefX()) refX = it.refX();
5297faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    // Call all suitable solvers for this linear system
5307faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    SelectSolvers<Scalar>(it.matrix(), it.sym(), it.rhs(), refX, statFile);
531c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
532c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if(statFileExists)
533c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
534c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      std::ofstream statbuf(statFile.c_str(), std::ios::app);
5357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf << "  <BEST_SOLVER ID='"<< best_time_id
5367faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez              << "'></BEST_SOLVER>\n";
5377faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      statbuf << " </LINEARSYSTEM> \n";
538c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      statbuf.close();
539c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
540c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
541c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
542c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
543c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool get_options(int argc, char **args, string option, string* value=0)
544c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
545c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  int idx = 1, found=false;
546c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  while (idx<argc && !found){
547c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if (option.compare(args[idx]) == 0){
548c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      found = true;
549c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      if(value) *value = args[idx+1];
550c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
551c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    idx+=2;
552c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
553c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return found;
554c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
555