|
Packit Service |
c5cf8c |
/*
|
|
Packit Service |
c5cf8c |
* Copyright © 2016-2017 Inria. All rights reserved.
|
|
Packit Service |
c5cf8c |
*
|
|
Packit Service |
c5cf8c |
* $COPYRIGHT$
|
|
Packit Service |
c5cf8c |
*
|
|
Packit Service |
c5cf8c |
* Additional copyrights may follow
|
|
Packit Service |
c5cf8c |
* See COPYING in top-level directory.
|
|
Packit Service |
c5cf8c |
*
|
|
Packit Service |
c5cf8c |
* $HEADER$
|
|
Packit Service |
c5cf8c |
*/
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#define _GNU_SOURCE /* See feature_test_macros(7) */
|
|
Packit Service |
c5cf8c |
#include <stdio.h>
|
|
Packit Service |
c5cf8c |
#include <stdlib.h>
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
#include <netloc.h>
|
|
Packit Service |
c5cf8c |
#include <private/netloc.h>
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
int netloc_build_comm_mat(char *filename, int *pn, double ***pmat)
|
|
Packit Service |
c5cf8c |
{
|
|
Packit Service |
c5cf8c |
FILE *input = fopen(filename, "r");
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (!input ) {
|
|
Packit Service |
c5cf8c |
perror("fopen");
|
|
Packit Service |
c5cf8c |
return NETLOC_ERROR;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
char *line = NULL;
|
|
Packit Service |
c5cf8c |
size_t linesize = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
char *ptr= NULL;
|
|
Packit Service |
c5cf8c |
int i,j;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
j = -1;
|
|
Packit Service |
c5cf8c |
i = 0;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
/* Get the number of elements in a line to find the size of the matrix */
|
|
Packit Service |
c5cf8c |
netloc_line_get(&line, &linesize, input);
|
|
Packit Service |
c5cf8c |
int n = 0;
|
|
Packit Service |
c5cf8c |
char *remain_line = line;
|
|
Packit Service |
c5cf8c |
while ((ptr = netloc_line_get_next_token(&remain_line, ' '))) {
|
|
Packit Service |
c5cf8c |
if (!strlen(ptr))
|
|
Packit Service |
c5cf8c |
break;
|
|
Packit Service |
c5cf8c |
n++;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
rewind(input);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (!n) {
|
|
Packit Service |
c5cf8c |
goto error;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
double *mat_values = (double *)malloc(sizeof(double[n*n]));
|
|
Packit Service |
c5cf8c |
double **mat = (double **)malloc(sizeof(double *[n]));
|
|
Packit Service |
c5cf8c |
for (int i = 0; i < n; i++) {
|
|
Packit Service |
c5cf8c |
mat[i] = &mat_values[i*n];
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
while (netloc_line_get(&line, &linesize, input) != -1) {
|
|
Packit Service |
c5cf8c |
char *remain_line = line;
|
|
Packit Service |
c5cf8c |
j = 0;
|
|
Packit Service |
c5cf8c |
while ((ptr = netloc_line_get_next_token(&remain_line, ' '))){
|
|
Packit Service |
c5cf8c |
if (!strlen(ptr))
|
|
Packit Service |
c5cf8c |
break;
|
|
Packit Service |
c5cf8c |
mat[i][j] = atof(ptr);
|
|
Packit Service |
c5cf8c |
if (mat[i][j] < 0) {
|
|
Packit Service |
c5cf8c |
fprintf(stderr, "Warning: negative value in comm matrix "
|
|
Packit Service |
c5cf8c |
"(mat[%d][%d] = %f)\n", i, j, mat[i][j]);
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
j++;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
if (j != n) {
|
|
Packit Service |
c5cf8c |
fprintf(stderr, "Error at %d %d (%d!=%d). "
|
|
Packit Service |
c5cf8c |
"Too many columns for %s\n", i, j, j, n, filename);
|
|
Packit Service |
c5cf8c |
goto error;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
i++;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
if (i != n) {
|
|
Packit Service |
c5cf8c |
fprintf(stderr,"Error at %d %d. Too many rows for %s\n",
|
|
Packit Service |
c5cf8c |
i, j, filename);
|
|
Packit Service |
c5cf8c |
goto error;
|
|
Packit Service |
c5cf8c |
}
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
fclose (input);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
*pn = n;
|
|
Packit Service |
c5cf8c |
*pmat = mat;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
free(line);
|
|
Packit Service |
c5cf8c |
return NETLOC_SUCCESS;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
error:
|
|
Packit Service |
c5cf8c |
free(line);
|
|
Packit Service |
c5cf8c |
free(mat_values);
|
|
Packit Service |
c5cf8c |
free(mat);
|
|
Packit Service |
c5cf8c |
*pmat = NULL;
|
|
Packit Service |
c5cf8c |
*pn = 0;
|
|
Packit Service |
c5cf8c |
fclose (input);
|
|
Packit Service |
c5cf8c |
return NETLOC_ERROR;
|
|
Packit Service |
c5cf8c |
}
|