/**
* 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
* .
*
* (c) Vincenzo Nicosia 2009-2017 --
*
* This file is part of NetBunch, a package for complex network
* analysis and modelling. For more information please visit:
*
* http://www.complex-networks.net/
*
* If you use this software, please add a reference to
*
* V. Latora, V. Nicosia, G. Russo
* "Complex Networks: Principles, Methods and Applications"
* Cambridge University Press (2017)
* ISBN: 9781107103184
*
***********************************************************************
*
*
* This program grows a weighted network using the model proposed by
* Barrat, Barthelemy, and Vespignani.
*
* References:
*
* [1] A. Barrat, M. Barthelemy, and A. Vespignani. "Weighted
* Evolving Networks: Coupling Topology and Weight
* Dynamics". Phys. Rev. Lett. 92 (2004), 228701.
*
* [2] A. Barrat, M. Barthelemy, and A. Vespignani. "Modeling the
* evolution of weighted networks". Phys. Rev. E 70 (2004),
* 066149.
*
*/
#include
#include
#include
#include
#include "cum_distr.h"
void usage(char *argv[]){
printf("********************************************************************\n"
"** **\n"
"** -*- bbv -*- **\n"
"** **\n"
"** Grow a weighted network of 'N' nodes using the model **\n"
"** proposed by Barrat-Barthelemy-Vespignani. **\n"
"** **\n"
"** The initial network is a clique of 'n0' nodes, and each new **\n"
"** node creates 'm' edges. All edges have an initial weight **\n"
"** equal to 'w0', and the attachment probability in of the **\n"
"** form: **\n"
"** **\n"
"** P(i->j) ~ s_j **\n"
"** **\n"
"** where s_j is the strength of node j. The parameter 'delta' **\n"
"** tunes the rearrangement of edge weights due to the **\n"
"** addition of a new edge. The degree, strength, and weight **\n"
"** distributions of the created graphs are power-laws, **\n"
"** whose esponents depend on the values of 'w0' and 'delta'. **\n"
"** **\n"
"********************************************************************\n"
" This is Free Software - You can use and distribute it under \n"
" the terms of the GNU General Public License, version 3 or later\n\n"
" (c) Vincenzo Nicosia 2009-2017 (v.nicosia@qmul.ac.uk)\n\n"
"********************************************************************\n\n"
);
printf("Usage: %s \n", argv[0]);
}
typedef struct{
int id;
double w;
double delta_w;
} link_t;
typedef struct {
int id;
int size;
int deg;
double s;
link_t *neighs;
} node_t;
/* create the initial graph as a clique of n0 nodes */
void init_seed(node_t *G, int n0, double w0, cum_distr_t *d){
int i, j, n;
for(i=0; i< n0; i++){
G[i].neighs = malloc((n0-1) * sizeof(link_t));
G[i].size = n0-1;
G[i].deg = n0-1;
n= 0;
for (j=0; j i){
tot_w += G[i].neighs[j].w;
printf("%d %d %g\n", i, G[i].neighs[j].id, G[i].neighs[j].w);
}
}
}
}
/* grow a weighted graph using the BBV model */
node_t* bbv(unsigned int N, unsigned int n0, unsigned int m, double w0, double delta){
node_t *G;
int t, i, j;
cum_distr_t *distr = NULL;
int *tmp_neighs;
distr = cum_distr_init(N * m);
G = malloc(N * sizeof(node_t));
tmp_neighs = malloc(m * sizeof(int));
init_seed(G, n0, w0, distr);
for(t=n0; t n0){
fprintf(stderr, "n0 cannot be smaller than m\n");
exit(1);
}
if (n0<1){
fprintf(stderr, "n0 must be positive\n");
exit(1);
}
if (m < 1){
fprintf(stderr, "m must be positive\n");
exit(1);
}
if (w0 <= 0.0){
fprintf(stderr, "w0 must be positive\n");
exit(1);
}
if (delta < 0.0){
fprintf(stderr, "delta must be positive\n");
exit(1);
}
net = bbv(N, n0, m, w0, delta);
dump_net(net, N);
for(i=0; i