1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2011 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2012 Desire NUENTSA WAKAM <desire.nuentsa_wakam@inria.fr> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_SPARSE_MARKET_IO_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_SPARSE_MARKET_IO_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <iostream> 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template <typename Scalar> 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool GetMarketLine (std::stringstream& line, int& M, int& N, int& i, int& j, Scalar& value) 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath line >> i >> j >> value; 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath i--; 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath j--; 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(i>=0 && j>=0 && i<M && j<N) 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template <typename Scalar> 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline bool GetMarketLine (std::stringstream& line, int& M, int& N, int& i, int& j, std::complex<Scalar>& value) 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar valR, valI; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath line >> i >> j >> valR >> valI; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath i--; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath j--; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(i>=0 && j>=0 && i<M && j<N) 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath value = std::complex<Scalar>(valR, valI); 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template <typename RealScalar> 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void GetVectorElt (const std::string& line, RealScalar& val) 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::istringstream newline(line); 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath newline >> val; 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template <typename RealScalar> 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void GetVectorElt (const std::string& line, std::complex<RealScalar>& val) 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RealScalar valR, valI; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::istringstream newline(line); 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath newline >> valR >> valI; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath val = std::complex<RealScalar>(valR, valI); 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Scalar> 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void putMarketHeader(std::string& header,int sym) 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath header= "%%MatrixMarket matrix coordinate "; 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value) 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath header += " complex"; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(sym == Symmetric) header += " symmetric"; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (sym == SelfAdjoint) header += " Hermitian"; 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else header += " general"; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath header += " real"; 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(sym == Symmetric) header += " symmetric"; 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else header += " general"; 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Scalar> 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void PutMatrixElt(Scalar value, int row, int col, std::ofstream& out) 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << row << " "<< col << " " << value << "\n"; 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Scalar> 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void PutMatrixElt(std::complex<Scalar> value, int row, int col, std::ofstream& out) 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << row << " " << col << " " << value.real() << " " << value.imag() << "\n"; 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Scalar> 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void putVectorElt(Scalar value, std::ofstream& out) 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << value << "\n"; 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Scalar> 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void putVectorElt(std::complex<Scalar> value, std::ofstream& out) 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << value.real << " " << value.imag()<< "\n"; 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namepsace internal 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline bool getMarketHeader(const std::string& filename, int& sym, bool& iscomplex, bool& isvector) 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath sym = 0; 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath isvector = false; 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::ifstream in(filename.c_str(),std::ios::in); 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!in) 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string line; 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // The matrix header is always the first line in the file 1197faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez std::getline(in, line); eigen_assert(in.good()); 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::stringstream fmtline(line); 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string substr[5]; 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath fmtline>> substr[0] >> substr[1] >> substr[2] >> substr[3] >> substr[4]; 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(substr[2].compare("array") == 0) isvector = true; 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(substr[3].compare("complex") == 0) iscomplex = true; 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(substr[4].compare("symmetric") == 0) sym = Symmetric; 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (substr[4].compare("Hermitian") == 0) sym = SelfAdjoint; 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename SparseMatrixType> 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool loadMarket(SparseMatrixType& mat, const std::string& filename) 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename SparseMatrixType::Scalar Scalar; 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::ifstream input(filename.c_str(),std::ios::in); 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!input) 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const int maxBuffersize = 2048; 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath char buffer[maxBuffersize]; 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool readsizes = false; 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Triplet<Scalar,int> T; 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::vector<T> elements; 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int M(-1), N(-1), NNZ(-1); 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int count = 0; 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while(input.getline(buffer, maxBuffersize)) 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // skip comments 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath //NOTE An appropriate test should be done on the header to get the symmetry 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(buffer[0]=='%') 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath continue; 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::stringstream line(buffer); 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!readsizes) 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath line >> M >> N >> NNZ; 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(M > 0 && N > 0 && NNZ > 0) 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath readsizes = true; 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cout << "sizes: " << M << "," << N << "," << NNZ << "\n"; 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.resize(M,N); 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.reserve(NNZ); 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int i(-1), j(-1); 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar value; 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if( internal::GetMarketLine(line, M, N, i, j, value) ) 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ++ count; 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath elements.push_back(T(i,j,value)); 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << "Invalid read: " << i << "," << j << "\n"; 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath mat.setFromTriplets(elements.begin(), elements.end()); 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(count!=NNZ) 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr << count << "!=" << NNZ << "\n"; 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath input.close(); 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename VectorType> 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool loadMarketVector(VectorType& vec, const std::string& filename) 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename VectorType::Scalar Scalar; 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::ifstream in(filename.c_str(), std::ios::in); 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!in) 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string line; 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int n(0), col(0); 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath do 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { // Skip comments 2037faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez std::getline(in, line); eigen_assert(in.good()); 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } while (line[0] == '%'); 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::istringstream newline(line); 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath newline >> n >> col; 2077faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez eigen_assert(n>0 && col>0); 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vec.resize(n); 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int i = 0; 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar value; 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath while ( std::getline(in, line) && (i < n) ){ 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::GetVectorElt(line, value); 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vec(i++) = value; 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath in.close(); 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (i!=n){ 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::cerr<< "Unable to read all elements from file " << filename << "\n"; 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename SparseMatrixType> 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool saveMarket(const SparseMatrixType& mat, const std::string& filename, int sym = 0) 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename SparseMatrixType::Scalar Scalar; 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::ofstream out(filename.c_str(),std::ios::out); 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!out) 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out.flags(std::ios_base::scientific); 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out.precision(64); 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::string header; 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::putMarketHeader<Scalar>(header, sym); 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << header << std::endl; 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << mat.rows() << " " << mat.cols() << " " << mat.nonZeros() << "\n"; 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int count = 0; 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(int j=0; j<mat.outerSize(); ++j) 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for(typename SparseMatrixType::InnerIterator it(mat,j); it; ++it) 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ++ count; 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::PutMatrixElt(it.value(), it.row()+1, it.col()+1, out); 243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // out << it.row()+1 << " " << it.col()+1 << " " << it.value() << "\n"; 244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out.close(); 246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename VectorType> 250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool saveMarketVector (const VectorType& vec, const std::string& filename) 251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename VectorType::Scalar Scalar; 253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath std::ofstream out(filename.c_str(),std::ios::out); 254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(!out) 255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return false; 256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out.flags(std::ios_base::scientific); 258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out.precision(64); 259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if(internal::is_same<Scalar, std::complex<float> >::value || internal::is_same<Scalar, std::complex<double> >::value) 260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << "%%MatrixMarket matrix array complex general\n"; 261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << "%%MatrixMarket matrix array real general\n"; 263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out << vec.size() << " "<< 1 << "\n"; 264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath for (int i=0; i < vec.size(); i++){ 265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::putVectorElt(vec(i), out); 266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath out.close(); 268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return true; 269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_SPARSE_MARKET_IO_H 274