Blame src/hwloc/netloc/mpicomm.c

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
}