/// header.hh
enum class Status : int {
Error = 0,
Success = 1,
};
template <typename scalar_t>
Status matrixFromFile(slate::Matrix<scalar_t> A,
const std::string filename, const char delimiter = ',');
/// code.cc
template <typename scalar_t>
Status matrixFromFile(
slate::Matrix<scalar_t> A,
const std::string filename,
const char delimiter)
{
std::ifstream file(filename);
std::stringstream ss("");
std::string line, element;
int64_t mt = A.mt();
int64_t nt = A.nt();
int64_t skips, skip_counter = 0;
int64_t mb, nb, i, j, ii, jj;
for (i = 0; i < mt; i++) {
mb = A.tileMb(i);
for (ii = 0; ii < mb; ii++) {
if (!std::getline(file, line))
return Status::Error;
ss << line;
skip_counter = 0;
for (j = 0; j < nt; j++) {
nb = A.tileNb(j);
if (A.tileIsLocal(i, j)) {
// Skip elements for non-local tiles.
for (skips = 0; skips < skip_counter; skips++)
if(!std::getline(ss, element, delimiter))
return Status::Error;
skip_counter = 0;
// First time accessing tile, getForWriting in RowMajor;
if (ii == 0) A.tileGetForWriting(i, j, slate::LayoutConvert::RowMajor);
// Get tile data
auto tile = A(i, j);
auto tiledata = tile.data();
// Insert line of elements
for (jj = 0; jj < nb; jj++) {
if (!std::getline(ss, element, delimiter))
return Status::Error;
tiledata[jj + ii * tile.stride()] = stod(element); // string-to-double
}
} else { skip_counter += nb; }
}
ss.str("");
ss.clear();
}
}
return Status::Success;
}