/*
* This file is part of MAMMULT: Metrics And Models for Multilayer Networks
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
/**
*
* Some utility functions to be used with tune_rho, compute_rho and
* the like
*
*/
#include
#include
#include
#include
#include
#include "rank_utils.h"
void load_ranking(char *fname, int *N, double **R){
char buff[256];
int size = 10;
FILE *f;
if (*R == NULL){
*R = malloc(size * sizeof (double));
}
f = fopen(fname, "r");
if (!f){
printf("Unable to open file: %s!!! Exiting\n");
exit(1);
}
*N = 0;
while (fgets(buff, 255, f)){
if (* N == size){
size += 10;
*R = realloc(*R, size * sizeof(double));
}
(*R)[*N] = atof(buff);
*N += 1;
}
}
double avg_array(double *v, int N){
double sum = 0.0;
int i;
for (i = 0; i < N; i ++){
sum += v[i];
}
return sum/N;
}
double compute_C(double *R1, double *R2, int N){
double mu1, mu2, sum1, sum2;
mu1 = avg_array(R1, N);
mu2 = avg_array(R2, N);
sum1 = mu1 * N;
sum2 = mu2 * N;
return N * mu1 * mu2 - mu2 * sum1 - mu1 * sum2;
}
double compute_D(double *R1, double *R2, int N){
double mu1, mu2, s1, s2;
int i;
mu1 = avg_array(R1, N);
mu2 = avg_array(R1, N);
s1 = s2 = 0.0;
for (i=0 ; i < N; i ++){
s1 += pow((R1[i] - mu1), 2);
s2 += pow((R2[i] - mu2), 2);
}
return sqrt(s1 * s2);
}
double compute_rho(double *R1, double *R2, int N, int *pairing){
double rho = 0;
int i;
for (i=0; i < N; i ++){
rho += R1[i] * R2[ pairing[i] ];
}
rho = (rho + compute_C(R1, R2, N))/ compute_D(R1, R2, N);
return rho;
}
void dump_ranking(double *R, int N){
int i;
for (i=0; i < N; i ++){
printf("%d: %f\n", i, R[i] );
}
}
void init_pairing_natural(int *pairing, int N){
int i;
for (i = 0; i< N; i ++){
pairing[i] = i;
}
}
void init_pairing_inverse(int *pairing, int N){
int i;
for (i = 0; i< N; i ++){
pairing[i] = N-i-1;
}
}
void select_pairing(int *pairing, int N, int argc, char *argv[], int pos){
if (argc < pos + 1 || !strncasecmp("rnd", argv[pos], 3)){
init_pairing_random(pairing, N);
}
else if (!strncasecmp("nat", argv[pos], 3)){
init_pairing_natural(pairing, N);
}
else if (!strncasecmp("inv", argv[pos], 3)){
init_pairing_inverse(pairing, N);
}
else{
printf ("Pairing strategy \"%s\" unknown!!! Exiting...\n", argv[pos]);
exit(1);
}
}
void shuffle_sequence(int *s, int N){
int i, j, tmp;
for (i=N-1; i>=0; i--){
j = rand() % (i+1);
tmp = s[j];
s[j] = s[i];
s[i] = tmp;
}
}
void init_pairing_random(int *pairing, int N){
init_pairing_natural(pairing, N);
shuffle_sequence(pairing, N);
}
/* Loads a pairing from a file, in the format:
*
* rank1 rank2
* ...........
*/
void load_pairing(int **pairing, int N, char *fname){
FILE *f;
int i, j, num;
char buff[256];
char *ptr;
f = fopen(fname, "r");
if (!f){
printf("Error opening file \"%s\"!!!! Exiting....\n", fname);
exit(2);
}
if (*pairing == NULL){
*pairing = malloc(N * sizeof(int));
init_pairing_natural(*pairing, N);
}
num = 0;
while(num < N){
fgets(buff, 255, f);
if (buff[0] == '#')
continue;
ptr = strtok(buff, " "); /* read the first node */
i = atoi(ptr);
ptr = strtok(NULL, " "); /* read the second node */
j = atoi(ptr);
(*pairing)[i] = j;
num += 1;
}
}
void dump_pairing(int *pairing, int N){
int i;
for(i=0; i< N; i ++){
printf("%d %d\n", i, pairing[i]);
}
}
void copy_pairing(int *p1, int *p2, int N){
int i;
for (i=0 ; i < N; i ++){
p2[i] = p1[i];
}
}