You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
2.6 KiB
Python
56 lines
2.6 KiB
Python
#! /usr/bin/python3
|
|
|
|
from queue import Empty
|
|
import multiprocessing
|
|
import networkx as nx
|
|
import numpy as np
|
|
import argparse
|
|
import random
|
|
import time
|
|
from utils import *
|
|
|
|
"""
|
|
This script computes the omega index for a given graph using parallelization. To see the implementation of the omega index, see the file omega.py in the same folder and check the function parallel_omega
|
|
"""
|
|
|
|
### PARSING ARGUMENTS ###
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument("graph", help="Name of the graph to be used.", choices=['checkins-foursquare', 'checkins-gowalla', 'checkins-brightkite', 'friends-foursquare', 'friends-gowalla', 'friends-brightkite'])
|
|
parser.add_argument("--k", help="Percentage of nodes to be sampled. Needs to be a float between 0 and 1. Default is 0.", default=0, type=float)
|
|
parser.add_argument("--nrand", help="Number of random graphs. Needs to be an integer. Default is 12", default=12, type=int)
|
|
parser.add_argument("--niter", help="Approximate number of rewiring per edge to compute the equivalent random graph. Default is 12", default=12, type=int)
|
|
parser.add_argument("--processes", help="Number of processes to be used. Needs to be an integer. Default is the number of cores.", default=multiprocessing.cpu_count(), type=int)
|
|
parser.add_argument("--seed", help="Seed for the random number generator. Needs to be an integer. Default is 42", default=42, type=int)
|
|
|
|
parser.add_help = True
|
|
args = parser.parse_args()
|
|
|
|
# check if the number of processes is valid
|
|
if args.processes > multiprocessing.cpu_count():
|
|
print("Number of processes is higher than available. Setting it to default value: all available")
|
|
args.processes = multiprocessing.cpu_count()
|
|
elif args.processes < 1:
|
|
raise ValueError("Number of processes needs to be at least 1")
|
|
|
|
# the name of the graph is the first part of the input string
|
|
name = args.graph.split('-')[1]
|
|
if 'checkins' in args.graph:
|
|
G = create_graph_from_checkins(name) #function from utils.py, check it out there
|
|
elif 'friends' in args.graph:
|
|
G = create_friendships_graph(name) #function from utils.py, check it out there
|
|
G.name = str(args.graph) + " Checkins Graph"
|
|
|
|
print("\nThe full graph {} has {} nodes and {} edges".format(args.graph, len(G), G.number_of_edges()))
|
|
print("Number of processes used: ", args.processes)
|
|
|
|
start = time.time()
|
|
# function from utils.py, check it out there (it's the parallel version of the omega index)
|
|
omega = parallel_omega(G, k = args.k, nrand=args.nrand, niter=args.niter, n_processes=args.processes, seed=42)
|
|
end = time.time()
|
|
|
|
print("\nOmega: ", omega)
|
|
print("Number of random graphs: ", args.nrand)
|
|
print("Time: ", round(end - start, 2), " seconds")
|