6 #include <Eigen/Sparse> 7 #include <gsl/gsl_vector.h> 8 #include <gsl/gsl_matrix.h> 25 typedef Eigen::SparseMatrix<double, Eigen::RowMajor>
SpMatCSR;
27 typedef Eigen::SparseMatrix<double, Eigen::ColMajor>
SpMatCSC;
29 typedef Eigen::Triplet<double>
Tri;
33 void Eigen2Pajek(FILE *,
const SpMatCSR *,
const char *);
44 void fprintfEigen(FILE *,
const SpMatCSR *,
const char *);
58 Eigen2Pajek(FILE *fp,
const SpMatCSR *P,
const char *dataFormat=
"%lf"){
60 int E = P->nonZeros();
63 fprintf(fp,
"*Vertices %d\n", N);
64 for (
int k = 0; k < N; k++)
65 fprintf(fp,
"%d \"%d\"\n", k, k);
68 fprintf(fp,
"Edges %d\n", E);
69 for (
int i = 0; i < P->rows(); i++){
70 for (SpMatCSR::InnerIterator it(*P, i); it; ++it){
71 fprintf(fp,
"%d %d ", i, it.col());
72 fprintf(fp, dataFormat, it.value());
96 std::vector<Tri> tripletList;
99 fscanf(fp,
"%s %d", label, &N);
105 fscanf(fp,
"%d %s", &i0, label);
106 for (
int k = 1; k < N; k++){
107 fscanf(fp,
"%d %s", &i, label);
111 fscanf(fp,
"%s %d", label, &E);
114 tripletList.reserve(E);
116 for (
int k = 0; k < E; k++){
117 fscanf(fp,
"%d %d", &i, &j);
118 fscanf(fp, dataFormat, &x);
119 tripletList.push_back(
Tri(i - i0, j - i0, x));
123 T->setFromTriplets(tripletList.begin(), tripletList.end());
138 char sparseType[] =
"CSC";
141 fprintf(fp,
"%s %d %d %d\n", sparseType, P->innerSize(), P->outerSize(), P->nonZeros());
144 for (
int nz = 0; nz < P->nonZeros(); nz++){
145 fprintf(fp, dataFormat, (P->valuePtr())[nz]);
151 for (
int nz = 0; nz < P->nonZeros(); nz++)
152 fprintf(fp,
"%d ", (P->innerIndexPtr())[nz]);
156 for (
int outer = 0; outer < P->outerSize()+1; outer++)
157 fprintf(fp,
"%d ", (P->outerIndexPtr())[outer]);
173 char sparseType[] =
"CSR";
176 fprintf(fp,
"%s %d %d %d\n", sparseType, P->innerSize(), P->outerSize(), P->nonZeros());
179 for (
int nz = 0; nz < P->nonZeros(); nz++){
180 fprintf(fp, dataFormat, (P->valuePtr())[nz]);
186 for (
int nz = 0; nz < P->nonZeros(); nz++)
187 fprintf(fp,
"%d ", (P->innerIndexPtr())[nz]);
191 for (
int outer = 0; outer < P->outerSize()+1; outer++)
192 fprintf(fp,
"%d ", (P->outerIndexPtr())[outer]);
209 int innerSize, outerSize, nnz;
212 int *innerIndexPtr, *outerIndexPtr;
214 std::vector<Tri> tripletList;
217 fscanf(fp,
"%s %d %d %d", sparseType, &outerSize, &innerSize, &nnz);
218 nzval =
new double [nnz];
219 innerIndexPtr =
new int [nnz];
220 outerIndexPtr =
new int[outerSize+1];
221 T =
new SpMatCSR(outerSize, innerSize);
222 Eigen::VectorXf innerNNZ(outerSize);
225 for (
int nz = 0; nz < nnz; nz++)
226 fscanf(fp, dataFormat, &nzval[nz]);
229 for (
int nz = 0; nz < nnz; nz++)
230 fscanf(fp,
"%d ", &innerIndexPtr[nz]);
233 fscanf(fp,
"%d ", &outerIndexPtr[0]);
234 for (
int outer = 1; outer < outerSize+1; outer++){
235 fscanf(fp,
"%d ", &outerIndexPtr[outer]);
236 innerNNZ(outer-1) = outerIndexPtr[outer] - outerIndexPtr[outer-1];
238 T->reserve(innerNNZ);
241 for (
int outer = 0; outer < outerSize; outer++)
242 for (
int nzInner = outerIndexPtr[outer]; nzInner < outerIndexPtr[outer+1]; nzInner++)
243 T->insertBackUncompressed(outer, innerIndexPtr[nzInner]) = nzval[nzInner];
247 delete innerIndexPtr;
248 delete outerIndexPtr;
265 int innerSize, outerSize, nnz;
269 gsl_matrix *EdgeList;
273 fscanf(fp,
"%s %d %d %d", sparseType, &innerSize, &outerSize, &nnz);
274 nzval =
new double [nnz];
276 ptr =
new int[outerSize+1];
277 EdgeList = gsl_matrix_alloc(nnz, 3);
278 if (strcmp(sparseType,
"CSR") == 0)
280 else if (strcmp(sparseType,
"CSR") == 0)
283 std::cerr <<
"Invalid sparse matrix type." << std::endl;
286 iInner = (iOuter + 1)%2;
289 for (
int nz = 0; nz < nnz; nz++)
290 fscanf(fp, dataFormat, &nzval[nz]);
293 for (
int nz = 0; nz < nnz; nz++)
294 fscanf(fp,
"%d ", &idx[nz]);
297 for (
int outer = 0; outer < outerSize+1; outer++)
298 fscanf(fp,
"%d ", &ptr[outer]);
301 for (
int outer = 0; outer < outerSize; outer++){
302 for (
int inner = ptr[outer]; inner < ptr[outer+1]; inner++){
303 gsl_matrix_set(EdgeList, nz, iOuter, outer);
304 gsl_matrix_set(EdgeList, nz, iInner, idx[inner]);
305 gsl_matrix_set(EdgeList, nz, 2, nzval[inner]);
328 size_t nnz = EdgeList->size1;
330 for (
size_t nz = 0; nz < nnz; nz++){
331 fprintf(dst,
"%d\t%d\t", (
int) gsl_matrix_get(EdgeList, nz, 0),
332 (
int) gsl_matrix_get(EdgeList, nz, 1));
333 fprintf(dst, dataFormat, gsl_matrix_get(EdgeList, nz, 2));
337 gsl_matrix_free(EdgeList);
353 SpMatCSR *TCSR =
new SpMatCSR(N, N);
359 TCSR->setFromTriplets(tripletList.begin(), tripletList.end());
382 TCSC->setFromTriplets(tripletList.begin(), tripletList.end());
398 int nnz = T->nonZeros();
399 std::vector<Tri> tripletList;
400 tripletList.reserve(nnz);
402 for (
int beta = 0; beta < T->outerSize(); ++beta)
403 for (SpMatCSC::InnerIterator it(*T, beta); it; ++it)
404 tripletList.push_back(Tri(it.row(), it.col(), it.value()));
420 int nnz = T->nonZeros();
421 std::vector<Tri> tripletList;
422 tripletList.reserve(nnz);
424 for (
int beta = 0; beta < T->outerSize(); ++beta)
425 for (SpMatCSR::InnerIterator it(*T, beta); it; ++it)
426 tripletList.push_back(Tri(it.row(), it.col(), it.value()));
443 for (
int irow = 0; irow < T->outerSize(); ++irow){
445 for (SpMatCSR::InnerIterator it(*T, irow); it; ++it){
446 while (count < it.col()){
447 fprintf(fp,
"---\t");
450 fprintf(fp, dataFormat, it.value());
454 while (count < T->innerSize()){
455 fprintf(fp,
"---\t");
SpMatCSR * Compressed2Eigen(FILE *, const char *)
Scan an Eigen CSR matrix from a file in compressed format.
SpMatCSC * pajek2Eigen(FILE *, const char *)
Scans an Eigen CSC matrix from a Pajek file.
Eigen::Triplet< double > Tri
Eigen triplet of double.
SpMatCSR * CSC2CSR(const SpMatCSC *T)
Convert an Eigen CSC matrix to an Eigen CSR matrix.
SpMatCSC * CSR2CSC(const SpMatCSR *T)
Convert an Eigen CSR matrix to an Eigen CSC matrix.
Eigen::SparseMatrix< double, Eigen::RowMajor > SpMatCSR
Eigen sparse CSR matrix of double type.
size_t lineCount(FILE *)
Count the number of lines in a file.
void Eigen2Compressed(FILE *, const SpMatCSC *, const char *)
Print an Eigen CSC matrix to file in compressed format.
std::vector< Tri > Eigen2Triplet(const SpMatCSC *)
Convert an Eigen CSC matrix to a vector of Eigen triplet.
void Eigen2Pajek(FILE *, const SpMatCSR *, const char *)
Print an Eigen CSR matrix in Pajek format.
void fprintfEigen(FILE *, const SpMatCSR *, const char *)
Print an Eigen CSR matrix as a dense matrix.
gsl_matrix * Compressed2EdgeList(FILE *, const char *)
Scan an edge list from a file in compressed format.
Eigen::SparseMatrix< double, Eigen::ColMajor > SpMatCSC
Eigen sparse CSC matrix of double type.