template <typename scalar_t>
Status fromFile(
slate::Matrix<scalar_t> A,
const std::string filename,
const char delimiter)
{
std::ifstream file(filename);
if (!file.is_open())
throw std::runtime_error("Failed to open the 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++) {
std::getline(file, line);
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++)
std::getline(ss, element, delimiter);
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++) {
std::getline(ss, element, delimiter);
tiledata[jj + ii * tile.stride()] = stod(element); // string-to-double
}
} else { skip_counter += nb; }
}
ss.str("");
ss.clear();
}
}
file.close();
return Status::Success;
MPI_Barrier(A.mpiComm()); // Ensure no MPI process darts ahead
A.tileUpdateAllOrigin();
}