                 const SpikeSolver& mySolver,
                 const SpmvFunctor& mySpmv);
 
+class OutputItem
+{
+public:
+	OutputItem(std::ostream &o): m_o(o) {}
+
+	template <typename T>
+	void operator() (T item) {
+		m_o << "<td style=\"border-style: inset;\">\n";
+		m_o << "<p>" << item << "</p>\n";
+		m_o << "</td>\n";
+	}
+private:
+	std::ostream &m_o;
+};
+
 
 // -----------------------------------------------------------------------------
 // MAIN

#include <algorithm>
#include <fstream>
#include <cmath>

#include <cusp/io/matrix_market.h>
#include <cusp/csr_matrix.h>

		int i;
		for (i = fileMat.size()-1; i>=0 && fileMat[i] != '/' && fileMat[i] != '\\'; i--);
		i++;

		OutputItem outputItem(cout);

		cout << "<tr valign=top>" << endl;
		// Name of matrix
		outputItem( fileMat.substr(i));
		// Dimension
		outputItem( A.num_rows);
		// No. of non-zeros
		outputItem( A.num_entries);
		// Half-bandwidth
		outputItem( stats.bandwidth);
		// Solve the problem successfully
		outputItem( success);
		
		if (success) {
			// Reason why cannot solve (for unsuccessful solving only)
			outputItem ("N/A");
			// Number of partitions
			outputItem( numPart);
			// Number of iterations to converge
			outputItem( stats.numIterations);
			// Time to reorder
			outputItem( stats.time_reorder);
			// Time to assemble banded and off-diagonal matrices on CPU
			outputItem( stats.time_cpu_assemble);
			// Time for data transferring
			outputItem( stats.time_transfer);
			// Time to extract all off-diagonal matrices on GPU
			outputItem( stats.time_offDiags);
			// Time to assemble off-diagonal matrics on GPU (including the solution of multi-RHS)
			outputItem( stats.time_assembly);
			// Time for banded LU and UL
			outputItem( stats.time_bandLU + stats.time_bandUL);
			// Time for full LU on reduced matrices
			outputItem( stats.time_fullLU);
			// Total time for setup
			outputItem( stats.timeSetup);
			// Total time for Krylov solve
			outputItem( stats.timeSolve);
			// Total amount of time
			outputItem( stats.timeSetup + stats.timeSolve);
		}
		else if (isnan(cusp::blas::nrm1(x_view)))
			outputItem ( "Zero pivoting");
		else
			outputItem ( "Not converged");

		cout << "</tr>" << endl;
	}

	return 0;
