def watts_converter(network, show_progress=False): logger.info('Get giant component') g = network.clusters().giant() logger.info('Calculate closeness') closenesses = [] progress = progressbar1.DummyProgressBar(end=g.vcount(), width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=g.vcount(), width=15) for x in g.vs: progress += 1 progress.show_progress() closenesses.append(g.closeness(x, mode=igraph.ALL)) g.vs['closeness'] = closenesses logger.info('Add edges') new_edge_list = [] watts_graph = g.copy() watts_graph.delete_edges(watts_graph.es) watts_graph.to_directed() progress = progressbar1.DummyProgressBar(end=g.ecount(), width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=g.ecount(), width=15) for e in g.es: progress += 1 progress.show_progress() s, t = e.source, e.target if g.vs[s]['closeness'] > g.vs[t]['closeness']: t, s = s, t new_edge_list.append((s, t)) watts_graph.add_edges(new_edge_list) for e in watts_graph.es: e['provider'] = False logger.info('Get provider edges') progress = progressbar1.DummyProgressBar(end=g.vcount(), width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=g.vcount(), width=15) for n in g.vs: progress += 1 progress.show_progress() provider_eid = get_provider_edge_highest_closeness(g, watts_graph, n) if provider_eid is None: continue watts_graph.es[provider_eid]['provider'] = True return watts_graph
def ba_gen(arguments): g = helpers.load_network(arguments.input_graph) if arguments.use_degree_seq: method = 'Degree Seq.' generated_graph = _degree_graph(g) else: method = 'Barabasi-Albert' generated_graph = _ba_graph(g) logger.info('Used method: [b]%s[/]' % method) logger.debug('Graph created. Fill up closeness values') N = generated_graph.vcount() progress = progressbar1.DummyProgressBar(end=10, width=15) if arguments.progressbar: progress = progressbar1.AnimatedProgressBar(end=N, width=15) for vs in generated_graph.vs: progress += 1 progress.show_progress() vs['name'] = 'BA%s' % vs.index vs['closeness'] = generated_graph.closeness(vs, mode=igraph.OUT) logger.info('Save to %s' % arguments.ba_output) generated_graph.save(arguments.ba_output)
def main(): parser = argparse.ArgumentParser( description='Save closeness values for all node', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('network') parser.add_argument('out') parser.add_argument('--progressbar', action='store_true') parser.add_argument('--verbose', '-v', action='count', default=0) arguments = parser.parse_args() arguments.verbose = min(len(helpers.LEVELS), arguments.verbose) logging.getLogger('compnet').setLevel(helpers.LEVELS[arguments.verbose]) g = helpers.load_network(arguments.network) logger.info('Graph loaded from: %s' % arguments.network) logger.info('Graph vertex count: %d' % g.vcount()) if 'closeness' not in g.vs: logger.info('Calculate closeness values') progress = progressbar1.DummyProgressBar(end=10, width=15) if arguments.progressbar: progress = progressbar1.AnimatedProgressBar(end=g.vcount(), width=15) for n in g.vs: progress += 1 progress.show_progress() closeness = g.closeness(n, mode=igraph.OUT) n['closeness'] = closeness g.save(arguments.out)
def upwalker_counter(g, meta, vf_g, arguments): N = g.vcount() progress = progressbar1.DummyProgressBar(end=10, width=15) if arguments.progressbar: progress = progressbar1.AnimatedProgressBar(end=len(meta), width=15) # trace_up_map = {} # random_up_map = {} trace_up_counter = [] random_up_counter = [] for m in meta: progress += 1 progress.show_progress() trace = m[helpers.TRACE] trace_dir = vft.trace_to_string(g, trace) trace_up_count = trace_dir.count('U') trace_up_counter.append(trace_up_count) # trace_up_map[trace_up_count] = trace_up_map.get(trace_up_count, 0) + # 1 s, t = trace[0], trace[-1] s_idx, t_idx = vft.node_to_nodeid(g, s), vft.node_to_nodeid(g, t) random_vf_route = helpers.random_route_walk(vf_g, s_idx, t_idx + N, len(trace), named=False, weight_field='VFweight') random_vf_route = vft.vf_route_converter(random_vf_route, N) random_vf_dir = vft.trace_to_string(g, random_vf_route) random_vf_count = random_vf_dir.count('U') random_up_counter.append(random_vf_count) # random_up_map[random_vf_count] = random_up_map.get(random_vf_count, # 0) + 1 real_counter = collections.Counter(trace_up_counter) real_up = ' '.join( ['%s: %s' % (k, real_counter[k]) for k in sorted(list(real_counter))]) random_counter = collections.Counter(random_up_counter) random_up = ' '.join([ '%s: %s' % (k, random_counter[k]) for k in sorted(list(random_counter)) ]) logger.info('') logger.info('Real trace UP counter: %s' % real_up) logger.info('Random vf trace up counter: %s' % random_up) helpers.save_to_json(arguments.out, { 'REAL': dict(real_counter), 'RANDOM': dict(random_counter) }) keys = sorted(set(list(real_counter) + list(random_counter))) logger.info('IDX;REAL;RANDOM') for k in keys: logger.info('%s;%d;%d' % (k, real_counter[k], random_counter[k]))
def purify(g, sample_size, show_progress): nodes = range(0, g.vcount()) samples = [random.sample(nodes, 4) for idx in range(0, sample_size)] progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(samples), width=15) logger.info('Avg distance calculation') avg_len = g.average_path_length() logger.info('Avg len: %d' % avg_len) hbcs = [] for quadruplet in samples: progress += 1 progress.show_progress() hbc = hyperbolicity(g, quadruplet) hbcs.append(hbc) avg_hbc = sum(hbcs) / float(len(hbcs)) logger.info('Avg hbc num: %f' % avg_hbc) logger.info('Avg hbc: %f' % (avg_hbc / float(avg_len)))
def main(): parser = argparse.ArgumentParser( description='SANDBOX mode. Write something useful here', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('network') parser.add_argument('--sample-size', type=int, default=1000, dest='sample_size') parser.add_argument('--node-drop', type=float, default=.1, dest='node_drop') parser.add_argument('--progressbar', action='store_true') parser.add_argument('--verbose', '-v', action='count', default=0) arguments = parser.parse_args() arguments.verbose = min(len(helpers.LEVELS), arguments.verbose) logging.getLogger('compnet').setLevel(helpers.LEVELS[arguments.verbose]) g = helpers.load_network(arguments.network) g = g.components().giant() logger.info('Graph loaded from: %s' % arguments.network) logger.info('Graph vertex count: %d' % g.vcount()) end = int(g.vcount() * arguments.node_drop) logger.info('Remaining node count: %d' % end) try: nodes = [(x.index, x['closeness']) for x in g.vs] except KeyError: logger.info('Calculate closeness values') progress = progressbar1.DummyProgressBar(end=10, width=15) if arguments.progressbar: progress = progressbar1.AnimatedProgressBar(end=g.vcount(), width=15) for n in g.vs: progress += 1 progress.show_progress() closeness = g.closeness(n) n['closeness'] = closeness g.save('with_closeness.gml') nodes = [(x.index, x['closeness']) for x in g.vs] nodes = sorted(nodes, reverse=True, key=lambda x: x[1]) top_nodes = [x[0] for x in nodes[:end]] delete_nodes = [x.index for x in g.vs if x.index not in top_nodes] g.delete_vertices(delete_nodes) logger.info('Left nodes: %d' % g.vcount()) purify(g, arguments.sample_size, arguments.progressbar)
def ba_generator(ba_graph, sh_paths, stretch, vf_g, progressbar=False): vf_count = 0 trace_count = 0 lp_count = 0 progress = progressbar1.DummyProgressBar(end=10, width=15) if progressbar: progress = progressbar1.AnimatedProgressBar(end=len(sh_paths), width=15) for (s, t), shl in sh_paths: progress += 1 progress.show_progress() logger.debug('SH from %s to %s is %d' % (s, t, shl)) random_route = helpers.random_route_walk(ba_graph, s, t, shl + stretch) logger.debug('Random route: %s' % random_route) real_stretch = len(random_route) - shl if real_stretch != stretch: continue trace_count += 1 is_vf = vft.is_valley_free(ba_graph, random_route, vfmode=vft.CLOSENESS) logger.debug( 'Trace edge dir: %s' % vft.trace_to_string(ba_graph, random_route, vfmode=vft.CLOSENESS)) logger.debug('Is VF: %s' % is_vf) if is_vf: is_lp = vft.is_local_preferenced(ba_graph, random_route, first_edge=True, vfmode=vft.CLOSENESS, vf_g=vf_g) else: is_lp = 0 logger.debug('Is LP: %s' % is_lp) vf_count += int(is_vf) lp_count += int(is_lp) logger.info('Stretch %d' % stretch) logger.info('Trace count: %d' % trace_count) logger.info('VF count: %d' % vf_count) logger.info('LP count: %d' % lp_count) return (stretch, trace_count, vf_count, lp_count)
def upwalker_deepness(g, meta, vf_g, arguments): N = g.vcount() progress = progressbar1.DummyProgressBar(end=10, width=15) if arguments.progressbar: progress = progressbar1.AnimatedProgressBar(end=len(meta), width=15) graph_max = max([x['closeness'] for x in g.vs]) with open(arguments.out, 'w') as f: f.write( 'TRACE_MIN\tTRACE_AVG\tTRACE_MEDIAN\tTRACE_MAX\tSH_MIN\tSH_AVG\tSH_MEDIAN\tSH_MAX\tTRACE_MAX\tGRAPH_MAX\tSH_MAX\tSTRETCH\tLENGTH\n' ) for m in meta: progress += 1 progress.show_progress() trace = m[helpers.TRACE] s, t = trace[0], trace[-1] sh_trace = g.get_all_shortest_paths(s, t) sh_trace = random.choice(sh_trace) sh_closeness = [g.vs[x]['closeness'] for x in sh_trace] trace_closeness = [g.vs.find(x)['closeness'] for x in trace] stretch = m[helpers.HOP_STRETCH] if m[ helpers.HOP_STRETCH] else len(trace) - len(sh_trace) trace_max = max(trace_closeness) sh_max = max(sh_trace) with open('{}_trace{}'.format(arguments.out, len(trace)), 'a') as fo: for x in trace_closeness: fo.write('{} '.format(x / float(graph_max))) fo.write('\n') with open('{}_sh{}'.format(arguments.out, len(sh_trace)), 'a') as fo: for x in sh_closeness: fo.write('{} '.format(x / float(graph_max))) fo.write('\n') with open(arguments.out, 'a') as f: f.write( "{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n".format( min(trace_closeness), np.average(trace_closeness), np.median(trace_closeness), np.max(trace_closeness), min(sh_closeness), np.average(sh_closeness), np.median(sh_closeness), np.max(sh_closeness), trace_max, graph_max, sh_max, stretch, len(trace)))
def main(): parser = argparse.ArgumentParser(description='SANDBOX mode. Write something useful here', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('network') parser.add_argument('meta') parser.add_argument('--top-node-ratio', type=float, default=.1, dest='top_node_ratio') parser.add_argument('--progressbar', action='store_true') parser.add_argument('--verbose', '-v', action='count', default=0) arguments = parser.parse_args() arguments.verbose = min(len(helpers.LEVELS), arguments.verbose) logging.getLogger('compnet').setLevel(helpers.LEVELS[arguments.verbose]) g = helpers.load_network(arguments.network) meta = helpers.load_from_json(arguments.meta) logger.info('Graph loaded from: %s' % arguments.network) logger.info('Graph vertex count: %d' % g.vcount()) end = int(g.vcount() * arguments.top_node_ratio) logger.info('Top node count: %d' % end) try: nodes = [(x.index, x['closeness']) for x in g.vs] except KeyError: logger.info('Calculate closeness values') progress = progressbar1.DummyProgressBar(end=10, width=15) if arguments.progressbar: progress = progressbar1.AnimatedProgressBar(end=g.vcount(), width=15) for n in g.vs: progress += 1 progress.show_progress() closeness = g.closeness(n) n['closeness'] = closeness g.save('%s_with_closeness.gml' % arguments.network) nodes = [(x.index, x['closeness']) for x in g.vs] nodes = sorted(nodes, reverse=True, key=lambda x: x[1]) top_nodes = set([x[0] for x in nodes[:end]]) purify(g, meta, top_nodes, arguments.progressbar)
def watts_trace_gen(g, traceroutes, show_progress=False): watts_traceroutes = [] progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(traceroutes), width=15) for trace in traceroutes: progress += 1 progress.show_progress() s, t = trace[0], trace[-1] logger.debug('Get route from {s} to {t}'.format(s=s, t=t)) logger.debug('Original trace[[g]%d[/]]: %s' % (len(trace), trace)) try: watts_trace = get_watts_route(g, s, t) watts_trace = [g.vs[x]['name'] for x in watts_trace] watts_traceroutes.append(watts_trace) logger.debug('Watts trace[[p]%d[/]]: %s' % (len(watts_trace), watts_trace)) except RuntimeError: logger.warning('[b]No watts route[/]') return watts_traceroutes
def purify(g, out, count=1000, show_progress=False): logger.info('Started') nodes = range(0, g.vcount()) endpoints = [random.sample(nodes, 2) for idx in range(0, count)] progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar( end=len(endpoints), width=15) traces = [] for endpoint in endpoints: progress += 1 progress.show_progress() src, dst = endpoint trace = g.get_shortest_paths(src, dst)[0] if len(trace) > 0: traces.append([g.vs[x]['name'] for x in trace]) logger.info('Len last trace: %d' % len(trace)) helpers.save_to_json(out, traces)
def main(): parser = argparse.ArgumentParser( description='Pretty plot', formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('network') parser.add_argument('meta') # parser.add_argument('output') parser.add_argument('--progressbar', action='store_true') parser.add_argument('--verbose', '-v', action='count', default=0) arguments = parser.parse_args() arguments.verbose = min(len(helpers.LEVELS), arguments.verbose) logging.getLogger('compnet').setLevel(helpers.LEVELS[arguments.verbose]) g = helpers.load_network(arguments.network) meta = helpers.load_from_json(arguments.meta) edges = [(e.source, e.target) for e in g.es] rand_edges = random.sample(edges, 40) progress = progressbar1.DummyProgressBar(end=10, width=15) if arguments.progressbar: progress = progressbar1.AnimatedProgressBar(end=len(meta), width=15) for m in meta[:15]: progress += 1 progress.show_progress() trace = m[helpers.TRACE] if len(trace) < 3: continue s, t = trace[0], trace[-1] sh = g.get_shortest_paths(s, t)[0] pretty_plot(g, trace, sh, rand_edges)
def purify(g, meta_original, out, count=1000, try_per_race=1, show_progress=False): empty = 0 # remove traces with already calculated random paths logger.warn('[r]ONLY NOT FILLED PATHS[/]') meta_filled = [ x for x in meta_original if helpers.RANDOM_NONVF_WALK_RUN_COUNT not in x ] logger.info('All trace count: %d' % len(meta_filled)) tr_count = min(len(meta_filled), count) meta_random = random.sample(meta_filled, tr_count) logger.info('Chosen subset count: %d' % len(meta_random)) real_vf_degree = [x for x in meta_random if x[helpers.IS_VF_DEGREE] == 1] real_nonvf_degree = [ x for x in meta_random if x[helpers.IS_VF_DEGREE] == 0 ] assert len(real_nonvf_degree) == tr_count - len(real_vf_degree) real_vf_prelabeled = [ x for x in meta_random if x[helpers.IS_VF_PRELABELED] == 1 ] real_nonvf_prelabeled = [ x for x in meta_random if x[helpers.IS_VF_PRELABELED] == 0 ] assert len(real_nonvf_prelabeled) == tr_count - len(real_vf_prelabeled) real_vf_closeness = [ x for x in meta_random if x[helpers.IS_VF_CLOSENESS] == 1 ] real_nonvf_closeness = [ x for x in meta_random if x[helpers.IS_VF_CLOSENESS] == 0 ] assert len(real_nonvf_closeness) == tr_count - len(real_vf_closeness) logger.info('Real vf degree: %f[%d]' % ((len(real_vf_degree) / float(tr_count), len(real_vf_degree)))) logger.info( 'Real nonvf degree: %f[%d]' % ((len(real_nonvf_degree) / float(tr_count), len(real_nonvf_degree)))) logger.info( 'Real vf prelabeled: %f[%d]' % ((len(real_vf_prelabeled) / float(tr_count), len(real_vf_prelabeled)))) logger.info('Real nonvf prelabeled: %f[%d]' % ((len(real_nonvf_prelabeled) / float(tr_count), len(real_nonvf_prelabeled)))) logger.info( 'Real vf closeness: %f[%d]' % ((len(real_vf_closeness) / float(tr_count), len(real_vf_closeness)))) logger.info('Real nonvf closeness: %f[%d]' % ((len(real_nonvf_closeness) / float(tr_count), len(real_nonvf_closeness)))) progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(meta_random), width=15) for trace_meta in meta_random: progress += 1 progress.show_progress() trace = vft.trace_in_vertex_id(g, [ trace_meta[helpers.TRACE], ]) if len(trace) != 1: logger.error('PROBLEM') logger.error('%s' % trace_meta) continue trace = trace[0] random_nonvf_walk_closeness_route_count = 0 random_nonvf_walk_closeness_route_len = [] random_nonvf_walk_degree_route_count = 0 random_nonvf_walk_degree_route_len = [] random_nonvf_walk_prelabeled_route_count = 0 random_nonvf_walk_prelabeled_route_len = [] random_nonvf_walk_lp_soft_closeness_route_count = 0 random_nonvf_walk_lp_soft_degree_route_count = 0 random_nonvf_walk_lp_soft_prelabeled_route_count = 0 random_nonvf_walk_lp_hard_closeness_route_count = 0 random_nonvf_walk_lp_hard_degree_route_count = 0 random_nonvf_walk_lp_hard_prelabeled_route_count = 0 s, t = trace[0], trace[-1] for counter in xrange(0, try_per_race): isvf, random_path = helpers.random_nonvf_route( g, s, t, len(trace), vfmode=vft.CLOSENESS) assert len(random_path) > 0 if isvf: random_nonvf_walk_closeness_route_count += 1 lp_soft = vft.is_local_preferenced(g, trace, first_edge=True, vfmode=vft.CLOSENESS) lp_hard = vft.is_local_preferenced(g, trace, first_edge=False, vfmode=vft.CLOSENESS) if lp_soft: random_nonvf_walk_lp_soft_closeness_route_count += 1 if lp_hard: random_nonvf_walk_lp_hard_closeness_route_count += 1 random_nonvf_walk_closeness_route_len.append(len(random_path)) isvf, random_path = helpers.random_nonvf_route(g, s, t, len(trace), vfmode=vft.DEGREE) assert len(random_path) > 0 if isvf: random_nonvf_walk_degree_route_count += 1 lp_soft = vft.is_local_preferenced(g, trace, first_edge=True, vfmode=vft.DEGREE) lp_hard = vft.is_local_preferenced(g, trace, first_edge=False, vfmode=vft.DEGREE) if lp_soft: random_nonvf_walk_lp_soft_degree_route_count += 1 if lp_hard: random_nonvf_walk_lp_hard_degree_route_count += 1 random_nonvf_walk_degree_route_len.append(len(random_path)) isvf, random_path = helpers.random_nonvf_route( g, s, t, len(trace), vfmode=vft.PRELABELED) assert len(random_path) > 0 if isvf: random_nonvf_walk_prelabeled_route_count += 1 lp_soft = vft.is_local_preferenced(g, trace, first_edge=True, vfmode=vft.PRELABELED) lp_hard = vft.is_local_preferenced(g, trace, first_edge=False, vfmode=vft.PRELABELED) if lp_soft: random_nonvf_walk_lp_soft_prelabeled_route_count += 1 if lp_hard: random_nonvf_walk_lp_hard_prelabeled_route_count += 1 random_nonvf_walk_prelabeled_route_len.append(len(random_path)) # sanity check # if random_path[0] != s or random_path[-1] != t: # logger.error('ALERT') if len(random_path) != len(set(random_path)): logger.error('LENGTH ERROR') extra_meta = { helpers.RANDOM_NONVF_WALK_RUN_COUNT: try_per_race, helpers.RANDOM_NONVF_WALK_VF_CLOSENESS_ROUTE: random_nonvf_walk_closeness_route_count, helpers.RANDOM_NONVF_WALK_VF_CLOSENESS_ROUTE_LEN: random_nonvf_walk_closeness_route_len, helpers.RANDOM_NONVF_WALK_VF_DEGREE_ROUTE: random_nonvf_walk_degree_route_count, helpers.RANDOM_NONVF_WALK_VF_DEGREE_ROUTE_LEN: random_nonvf_walk_degree_route_len, helpers.RANDOM_NONVF_WALK_VF_PRELABELED_ROUTE: random_nonvf_walk_prelabeled_route_count, helpers.RANDOM_NONVF_WALK_VF_PRELABELED_ROUTE_LEN: random_nonvf_walk_prelabeled_route_len, helpers.RANDOM_NONVF_WALK_LP_SOFT_DEGREE_ROUTE: random_nonvf_walk_lp_soft_degree_route_count, helpers.RANDOM_NONVF_WALK_LP_SOFT_CLOSENESS_ROUTE: random_nonvf_walk_lp_soft_closeness_route_count, helpers.RANDOM_NONVF_WALK_LP_SOFT_PRELABELED_ROUTE: random_nonvf_walk_lp_soft_prelabeled_route_count, helpers.RANDOM_NONVF_WALK_LP_HARD_DEGREE_ROUTE: random_nonvf_walk_lp_hard_degree_route_count, helpers.RANDOM_NONVF_WALK_LP_HARD_CLOSENESS_ROUTE: random_nonvf_walk_lp_hard_closeness_route_count, helpers.RANDOM_NONVF_WALK_LP_HARD_PRELABELED_ROUTE: random_nonvf_walk_lp_hard_prelabeled_route_count } trace_meta.update(extra_meta) ## save modified meta # all meta_* get only references from meta_original helpers.save_to_json(out, meta_original) # calculate results real_vf = [x[helpers.IS_VF_CLOSENESS] for x in meta_random] real_vf_ratio = np.mean(real_vf) random_nonvf_walk_vf_ratio_per_element = [ x[helpers.RANDOM_NONVF_WALK_VF_CLOSENESS_ROUTE] / x[helpers.RANDOM_NONVF_WALK_RUN_COUNT] for x in meta_random ] random_nonvf_walk_vf_ratio = np.mean( random_nonvf_walk_vf_ratio_per_element) # print results logger.info('') logger.info('Empty: %d' % empty) logger.info('Tested trace count: %d' % len(meta_random)) logger.info('VF ratio in tested traces: %f' % real_vf_ratio) logger.info('VF ratio in random walks: %f' % random_nonvf_walk_vf_ratio)
def trace_dir(g, meta, vf_g, arguments): N = g.vcount() vf_sum_lp_w = sum([e['LPweight'] for e in vf_g.es]) out_instead_core = 0 core_instead_out = 0 in_customer = 0 in_customer_but_use_up = 0 progress = progressbar1.DummyProgressBar(end=10, width=15) if arguments.progressbar: progress = progressbar1.AnimatedProgressBar(end=len(meta), width=15) for m in meta: progress += 1 progress.show_progress() trace = m[helpers.TRACE] first_edge = [trace[0], trace[1]] first_hop_type = vft.edge_dir(g, first_edge, vfmode=vft.CLOSENESS) s_idx = vft.node_to_nodeid(g, trace[0]) t_idx = vft.node_to_nodeid(g, trace[-1]) sh_vf = vf_g.get_all_shortest_paths(s_idx + N, t_idx + N) if len(sh_vf) > 0: in_customer += 1 if first_hop_type != LinkDir.D: in_customer_but_use_up += 1 if first_hop_type == LinkDir.D: # 'remove' all downward path: for neighbor in vf_g.neighbors(s_idx + N, mode=igraph.OUT): down_edge = vf_g.get_eid(s_idx + N, neighbor, directed=True) vf_g.es[down_edge]['LPweight_old'] = vf_g.es[down_edge][ 'LPweight'] vf_g.es[down_edge]['LPweight'] = vf_sum_lp_w + 1 lp_sh = vft.get_shortest_vf_route(g, s_idx, t_idx, mode='lp', vf_g=vf_g, vfmode=vft.CLOSENESS) pretty_plotter.pretty_plot(g, trace, lp_sh, []) first_new_edge = [lp_sh[0], lp_sh[1]] first_new_hop_type = vft.edge_dir(g, first_new_edge, vfmode=vft.CLOSENESS) if first_hop_type != first_new_hop_type: out_instead_core += 1 print '' print "Original trace: %s" % trace print 'Original trace dir: %s' % vft.trace_to_string(g, trace) print 'Original closeness: %s' % [ g.vs.find(x)['closeness'] for x in trace ] print 'LP trace: %s' % [g.vs[x]['name'] for x in lp_sh] print 'LP dir: %s' % vft.trace_to_string(g, lp_sh) print 'LP closeness: %s' % [ g.vs.find(x)['closeness'] for x in lp_sh ] # raw_input() for neighbor in vf_g.neighbors(s_idx + N, mode=igraph.OUT): down_edge = vf_g.get_eid(s_idx + N, neighbor, directed=True) vf_g.es[down_edge]['LPweight'] = vf_g.es[down_edge][ 'LPweight_old'] elif first_hop_type == LinkDir.U: lp_sh = vft.get_shortest_vf_route(g, s_idx, t_idx, mode='lp', vf_g=vf_g, vfmode=vft.CLOSENESS) lp_dir = vft.trace_to_string(g, lp_sh) # if lp_dir[1:].startswith('U') or lp_dir[1:].startswith('D'): # continue first_new_edge = [lp_sh[0], lp_sh[1]] first_new_hop_type = vft.edge_dir(g, first_new_edge, vfmode=vft.CLOSENESS) if first_hop_type != first_new_hop_type: core_instead_out += 1 print '' print "Original trace: %s" % trace print 'Original trace dir: %s' % vft.trace_to_string(g, trace) print 'Original closeness: %s' % [ g.vs.find(x)['closeness'] for x in trace ] print 'LP trace: %s' % [g.vs[x]['name'] for x in lp_sh] print 'LP dir: %s' % vft.trace_to_string(g, lp_sh) print 'LP closeness: %s' % [ g.vs.find(x)['closeness'] for x in lp_sh ] pretty_plotter.pretty_plot(g, trace, lp_sh, []) # raw_input() logger.info('Core instead down: %d' % core_instead_out) logger.info('Down instead core: %d' % out_instead_core) logger.info('In customer cone: %d' % in_customer) logger.info('In customer but use UP: %d' % in_customer_but_use_up)
def purify(g, meta, top_nodes, show_progress): progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(meta), width=15) logger.info('Purify') triplet_count_closeness = 0 top_nodes_triplet_closeness = 0 triplet_count_prelabeled = 0 top_nodes_triplet_prelabeled = 0 triplet_count_degree = 0 top_nodes_triplet_degree = 0 for row in meta: progress += 1 progress.show_progress() trace = row[helpers.TRACE] trace = vft.trace_in_vertex_id(g, [trace, ])[0] if row[helpers.IS_VF_CLOSENESS] == 0: logger.debug('Closeness valley') vt = vft.get_valley_triplets(g, trace, vft.CLOSENESS) triplet_count_closeness += len(vt) for trip in vt: if any([x in top_nodes for x in trip]): top_nodes_triplet_closeness += 1 if row[helpers.IS_VF_PRELABELED] == 0: logger.debug('Prelabeled valley') vt = vft.get_valley_triplets(g, trace, vft.PRELABELED) triplet_count_prelabeled += len(vt) for trip in vt: if any([x in top_nodes for x in trip]): top_nodes_triplet_prelabeled += 1 if row[helpers.IS_VF_DEGREE] == 0: logger.debug('Degree valley') vt = vft.get_valley_triplets(g, trace, vft.DEGREE) triplet_count_degree += len(vt) for trip in vt: if any([x in top_nodes for x in trip]): top_nodes_triplet_degree += 1 print try: ratio_closeness = top_nodes_triplet_closeness / float(triplet_count_closeness) except ZeroDivisionError: ratio_closeness = 0.0 try: ratio_prelabeled = top_nodes_triplet_prelabeled / float(triplet_count_prelabeled) except ZeroDivisionError: ratio_prelabeled = 0.0 try: ratio_degree = top_nodes_triplet_degree / float(triplet_count_degree) except ZeroDivisionError: ratio_degree = 0.0 logger.info('CLOSENESS: %6.3f[%d/%d]' % (ratio_closeness, top_nodes_triplet_closeness, triplet_count_closeness)) logger.info('PRELABELED: %6.3f[%d/%d]' % (ratio_prelabeled, top_nodes_triplet_prelabeled, triplet_count_prelabeled)) logger.info('DEGREE: %6.3f[%d/%d]' % (ratio_degree, top_nodes_triplet_degree, triplet_count_degree))
def main(): parser = argparse.ArgumentParser( description=('SANDBOX mode. ', 'Write something ', 'useful here'), formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--progressbar', action='store_true') parser.add_argument('--verbose', '-v', action='count', default=0) parser.add_argument('--edge-drop', dest='edge_drop', type=float, default=0.0) parser.add_argument('--closeness-limit', dest='closeness_limit', type=float, default=0.0) parser.add_argument('network') parser.add_argument('traceroutes') arguments = parser.parse_args() show_progress = arguments.progressbar arguments.verbose = min(len(helpers.LEVELS), arguments.verbose) logging.getLogger('compnet').setLevel(helpers.LEVELS[arguments.verbose]) g = helpers.load_network(arguments.network) traceroutes = helpers.load_from_json(arguments.traceroutes) logger.info('ecount: %d' % g.ecount()) logger.info('vcount: %d' % g.vcount()) logger.info('trace count: %d' % len(traceroutes)) g_dummy = g.copy() progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(traceroutes), width=15) closeness_list = [] for x in g_dummy.vs: progress += 1 progress.show_progress() closeness_list.append((x.index, g_dummy.closeness(x))) end = int(arguments.closeness_limit * g_dummy.vcount()) logger.debug('Top node count: %d' % end) top_nodes = sorted(closeness_list, key=lambda x: x[1], reverse=True)[:end] top_nodes_index = [x[0] for x in top_nodes] top_nodes_name = [g_dummy.vs[x[0]]['name'] for x in top_nodes] top_edges = [ e for e in g_dummy.es if e.source in top_nodes_index and e.target in top_nodes_index ] logger.debug('Top edge count: %d' % len(top_edges)) random.shuffle(top_edges) edge_drop = top_edges[:int(len(top_edges) * arguments.edge_drop)] logger.debug('Dropped edge count: %d' % len(edge_drop)) # edges = [x.index for x in g_dummy.es] # random.shuffle(edges) # edge_drop = edges[:int(g.ecount() * arguments.edge_drop)] g_dummy.delete_edges(edge_drop) traceroutes = traceroutes[:10000] all_edges = [] for trace in traceroutes: edges = zip(trace, trace[1:]) edges = [tuple(sorted(e)) for e in edges] all_edges.extend(edges) all_edges = list(set(all_edges)) top_edges = [ e for e in all_edges if e[0] in top_nodes_name and e[1] in top_nodes_name ] logger.info('TOP edge count in real traceroutes: %d' % len(top_edges)) found_top_edges = [] increments = [] for trace in traceroutes: edges = zip(trace, trace[1:]) edges = [tuple(sorted(e)) for e in edges] top_edges = [ x for x in edges if x[0] in top_nodes_name and x[1] in top_nodes_name ] found_top_edges.extend(top_edges) found_top_edges = list(set(found_top_edges)) increments.append(len(found_top_edges)) logger.info('Found top edge count: %d' % len(found_top_edges)) dummy_sh_traceroutes_meta = [] original_sh_traceroutes_meta = [] stretches = [] progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(traceroutes), width=15) for trace in traceroutes: progress += 1 progress.show_progress() s, t = trace[0], trace[-1] # logger.debug('Get shortest paths from {s} to {t}'.format(s=s, t=t)) sh_dummy = random.choice(g_dummy.get_shortest_paths(s, t)) sh_original = random.choice(g.get_shortest_paths(s, t)) stretch = len(sh_dummy) - len(sh_original) dummy_sh_traceroutes_meta.append((sh_dummy, stretch)) original_sh_traceroutes_meta.append((sh_original, 0)) stretches.append(stretch) # logger.debug('Stretch: %d' % stretch) # logger.debug('SH DUMMY: %s' % [g_dummy.vs[x]['name'] for x in sh_dummy]) # logger.debug('SH ORIG: %s' % [g.vs[x]['name'] for x in sh_original]) dummy_sh_meta = [(x[0], x[1], vft.is_valley_free(g_dummy, x[0], vft.CLOSENESS)) for x in dummy_sh_traceroutes_meta] dummy_sh_len_hist = collections.Counter( [len(x[0]) for x in dummy_sh_traceroutes_meta]) original_sh_len_hist = collections.Counter( [len(x[0]) for x in original_sh_traceroutes_meta]) original_len_hist = collections.Counter([len(x) for x in traceroutes]) stretches = [x for x in stretches if x >= 0] stretch_hist = collections.Counter(stretches) import matplotlib.pyplot as plt print print[(x, 100 * y / float(len(traceroutes)), y) for x, y in stretch_hist.iteritems()] plt.plot([x for x in stretch_hist.iterkeys()], [x for x in stretch_hist.itervalues()], 'g^') plt.ylabel('some numbers') # plt.show() logger.info('Dummy VF stat') max_stretch = max(dummy_sh_meta, key=lambda x: x[1])[1] for stretch in range(0, max_stretch + 1): stretched_traces = [x for x in dummy_sh_meta if x[1] == stretch] count = len(stretched_traces) vf_count = len([x for x in stretched_traces if x[2]]) vf_perc = vf_count / float(count) nonvf_count = count - vf_count nonvf_perc = nonvf_count / float(count) logger.info( '{stretch} -- {vf_perc}[{vf_count}]\t{nonvf_perc}[{nonvf_count}]'. format(stretch=stretch, vf_perc=vf_perc, vf_count=vf_count, nonvf_perc=nonvf_perc, nonvf_count=nonvf_count)) import matplotlib.pyplot as plt plt.plot(increments, 'g^') plt.ylabel('some numbers') plt.show()
def purify(g, meta_original, out, count=1000, try_per_race=1, show_progress=False, with_lp=True): empty = 0 # remove traces with already calculated random paths logger.warn('[r]ONLY NOT FILLED PATHS[/]') meta_filled = [ x for x in meta_original if helpers.RANDOM_WALK_RUN_COUNT not in x ] # Filter if interested only in routes of stretch 1 # meta_filled = [x for x in meta_original # if x[helpers.TRACE_LEN]-x[helpers.SH_LEN] == 1] ## traces with a maximum stretch # logger.warn('[r]!!!ONLY WITH STRETCH[/]') # meta = [x for x in meta if x[helpers.STRETCH] > -1] # # shorter meta records # logger.warn('[r]!!!ONLY SHORT TRACES[/]') # meta = [x for x in meta if len(x[helpers.TRACE]) < 5] # meta_map = {tuple(x[helpers.TRACE]): x for x in meta_filled} logger.info('All trace count: %d' % len(meta_filled)) tr_count = min(len(meta_filled), count) meta_random = random.sample(meta_filled, tr_count) logger.info('Chosen subset count: %d' % len(meta_random)) # real_vf_degree = [x for x in meta_random if x[helpers.IS_VF_DEGREE] == 1] # real_nonvf_degree = [x for x in meta_random if x[helpers.IS_VF_DEGREE] == 0] # assert len(real_nonvf_degree) == tr_count - len(real_vf_degree) # real_vf_prelabeled = [x for x in meta_random if x[helpers.IS_VF_PRELABELED] == 1] # real_nonvf_prelabeled = [x for x in meta_random if x[helpers.IS_VF_PRELABELED] == 0] # assert len(real_nonvf_prelabeled) == tr_count - len(real_vf_prelabeled) # real_vf_closeness = [x for x in meta_random if x[helpers.IS_VF_CLOSENESS] == 1] # real_nonvf_closeness = [x for x in meta_random if x[helpers.IS_VF_CLOSENESS] == 0] # assert len(real_nonvf_closeness) == tr_count - len(real_vf_closeness) # logger.info('Real vf degree: %f[%d]' % ((len(real_vf_degree) / float(tr_count), # len(real_vf_degree)))) # logger.info('Real nonvf degree: %f[%d]' % ((len(real_nonvf_degree) / float(tr_count), # len(real_nonvf_degree)))) # logger.info('Real vf prelabeled: %f[%d]' % ((len(real_vf_prelabeled) / float(tr_count), # len(real_vf_prelabeled)))) # logger.info('Real nonvf prelabeled: %f[%d]' % ((len(real_nonvf_prelabeled) / float(tr_count), # len(real_nonvf_prelabeled)))) # logger.info('Real vf closeness: %f[%d]' % ((len(real_vf_closeness)/float(tr_count), len(real_vf_closeness)))) # logger.info('Real nonvf closeness: %f[%d]' % ((len(real_nonvf_closeness)/float(tr_count), len(real_nonvf_closeness)))) # traceroutes = [x[helpers.TRACE] for x in meta_random] # traceroutes = vft.trace_in_vertex_id(g, traceroutes) try: meta_random[0][helpers.TRACE] except Exception: meta_random = [{helpers.TRACE: x} for x in meta_random] progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(meta_random), width=15) stretch_list = [] max_stretch = max( [x[helpers.TRACE_LEN] - x[helpers.SH_LEN] for x in meta_random]) for stretch in range(0, max_stretch + 1): metas = [ x for x in meta_random if x[helpers.TRACE_LEN] - x[helpers.SH_LEN] == stretch ] stretch_list.extend(list(repeat(stretch, len(metas)))) # print(stretch_list) lenghts = random.shuffle(stretch_list) strx_array = [] for idx, trace_meta in enumerate(meta_random): progress += 1 progress.show_progress() # print(trace_meta[helpers.TRACE]) shl = trace_meta[helpers.SH_LEN] trace = vft.trace_in_vertex_id(g, [ trace_meta[helpers.TRACE], ]) if len(trace) != 1: print 'PROBLEM' print trace_meta continue trace = trace[0] # print(trace) random_walk_closeness_route_vf = 0 random_walk_closeness_route_lp_soft = 0 random_walk_closeness_route_lp_hard = 0 random_walk_degree_route_vf = 0 random_walk_degree_route_lp_soft = 0 random_walk_degree_route_lp_hard = 0 random_walk_prelabeled_route_vf = 0 random_walk_prelabeled_route_lp_soft = 0 random_walk_prelabeled_route_lp_hard = 0 s, t = trace[0], trace[-1] for counter in xrange(0, try_per_race): # random_path = helpers.random_route_walk(g, s, t, len(trace)) # Modified random_path = helpers.random_route_walk( g, s, t, shl + stretch_list[idx]) # Modified if len(random_path) == 0: empty += 1 if vft.is_valley_free(g, random_path, vfmode=vft.CLOSENESS): random_walk_closeness_route_vf += 1 if (len(random_path) == shl + 1): strx_array.append(1) if with_lp: lp_soft = vft.is_local_preferenced(g, random_path, first_edge=True, vfmode=vft.CLOSENESS) lp_hard = vft.is_local_preferenced(g, random_path, first_edge=False, vfmode=vft.CLOSENESS) if lp_soft: random_walk_closeness_route_lp_soft += 1 if lp_hard: random_walk_closeness_route_lp_hard += 1 else: if (len(random_path) == shl + 1): strx_array.append(0) # if vft.is_valley_free(g, random_path, vfmode=vft.DEGREE): # random_walk_degree_route_vf += 1 # if with_lp: # lp_soft = vft.is_local_preferenced(g, random_path, # first_edge=True, # vfmode=vft.DEGREE) # lp_hard = vft.is_local_preferenced(g, random_path, # first_edge=False, # vfmode=vft.DEGREE) # if lp_soft: # random_walk_degree_route_lp_soft += 1 # if lp_hard: # random_walk_degree_route_lp_hard += 1 # if vft.is_valley_free(g, random_path, vfmode=vft.PRELABELED): # random_walk_prelabeled_route_vf += 1 # if with_lp: # lp_soft = vft.is_local_preferenced(g, random_path, # first_edge=True, # vfmode=vft.PRELABELED) # lp_hard = vft.is_local_preferenced(g, random_path, # first_edge=False, # vfmode=vft.PRELABELED) # if lp_soft: # random_walk_prelabeled_route_lp_soft += 1 # if lp_hard: # random_walk_prelabeled_route_lp_hard += 1 # sanity check # if random_path[0] != s or random_path[-1] != t: # logger.error('ALERT') if len(random_path) != len(set(random_path)): logger.error('LENGTH ERROR') extra_meta = { helpers.RANDOM_WALK_RUN_COUNT: try_per_race, helpers.RANDOM_WALK_VF_CLOSENESS_ROUTE: random_walk_closeness_route_vf, helpers.RANDOM_WALK_VF_DEGREE_ROUTE: random_walk_degree_route_vf, helpers.RANDOM_WALK_VF_PRELABELED_ROUTE: random_walk_prelabeled_route_vf, } if with_lp: extra_meta.update({ helpers.RANDOM_WALK_LP_SOFT_CLOSENESS_ROUTE: random_walk_closeness_route_lp_soft, helpers.RANDOM_WALK_LP_HARD_CLOSENESS_ROUTE: random_walk_closeness_route_lp_hard, helpers.RANDOM_WALK_LP_SOFT_DEGREE_ROUTE: random_walk_degree_route_lp_soft, helpers.RANDOM_WALK_LP_HARD_DEGREE_ROUTE: random_walk_degree_route_lp_hard, helpers.RANDOM_WALK_LP_SOFT_PRELABELED_ROUTE: random_walk_prelabeled_route_lp_soft, helpers.RANDOM_WALK_LP_HARD_PRELABELED_ROUTE: random_walk_prelabeled_route_lp_hard }) trace_meta.update(extra_meta) ## save modified meta # all meta_* get only references from meta_original helpers.save_to_json(out, meta_random) # meta_mod = [x for x in meta_map.itervalues()] # helpers.save_to_json(out, meta_mod) # calculate results # real_vf = [x[helpers.IS_VF_CLOSENESS] for x in meta_random] # real_vf_ratio = np.mean(real_vf) random_walk_vf_ratio_per_element = [ x[helpers.RANDOM_WALK_VF_CLOSENESS_ROUTE] / x[helpers.RANDOM_WALK_RUN_COUNT] for x in meta_random ] random_walk_vf_ratio = np.mean(random_walk_vf_ratio_per_element) # print results logger.info('') logger.info('Empty: %d' % empty) logger.info('Tested trace count: %d' % len(meta_random)) # logger.info('VF ratio in tested traces: %f' % real_vf_ratio) logger.info('VF ratio in random walks: %f' % random_walk_vf_ratio) logger.info('VF ratio in random walks for path stretch 1: %f' % np.mean(strx_array))
def purify(g, traceroutes, flags, show_progress=False): results = list() # remove traces with unknown nodes traceroutes = vft.trace_in_vertex_id(g, traceroutes) # generate valley-free graph if flags[FLAG_PRELABELED]: logger.info('Generate VF_G_PRE') vf_g_pre = vft.convert_to_vf(g, vfmode=vft.PRELABELED) else: logger.info('Skip prelabeled graph') if flags[FLAG_DEGREE]: logger.info('Generate VF_G_DEGREE') vf_g_degree = vft.convert_to_vf(g, vfmode=vft.DEGREE) else: logger.info('Skip degree graph') if flags[FLAG_CLOSENESS]: logger.info('Generate VF_G_CLOSENESS') vf_g_closeness = vft.convert_to_vf(g, vfmode=vft.CLOSENESS) else: logger.info('Skip closeness graph') progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(traceroutes), width=15) for trace in traceroutes: progress += 1 progress.show_progress() logger.debug('Current trace: %s' % ([g.vs[x]['name'] for x in trace])) if len(trace) == 1: continue s, t = trace[0], trace[-1] is_vf_prelabeled = -1 is_lp_prelabeled_hard = -1 is_lp_prelabeled_soft = -1 is_vf_degree = -1 is_lp_degree_hard = -1 is_lp_degree_soft = -1 is_vf_closeness = -1 is_lp_closeness_hard = -1 is_lp_closeness_soft = -1 trace_len = len(trace) sh_len = g.shortest_paths(s, t, mode=i.OUT)[0][0] sh_len += 1 # convert hop count to node Counter if flags[FLAG_PRELABELED]: is_vf_prelabeled = vft.is_valley_free(g, trace, vft.PRELABELED) is_vf_prelabeled = int(is_vf_prelabeled) if is_vf_prelabeled: if flags[FLAG_LP_SOFT]: lp_soft = vft.is_local_preferenced(g, trace, vf_g=vf_g_pre, first_edge=True, vfmode=vft.PRELABELED) is_lp_prelabeled_soft = 1 if lp_soft else 0 else: is_lp_prelabeled_soft = -1 if flags[FLAG_LP_HARD]: lp_hard = vft.is_local_preferenced(g, trace, vf_g=vf_g_pre, first_edge=False, vfmode=vft.PRELABELED) is_lp_prelabeled_hard = 1 if lp_hard else 0 else: is_lp_prelabeled_hard = -1 if flags[FLAG_DEGREE]: is_vf_degree = vft.is_valley_free(g, trace, vft.DEGREE) is_vf_degree = int(is_vf_degree) if is_vf_degree: if flags[FLAG_LP_SOFT]: lp_soft = vft.is_local_preferenced(g, trace, vf_g=vf_g_degree, first_edge=True, vfmode=vft.DEGREE) is_lp_degree_soft = 1 if lp_soft else 0 else: is_lp_degree_soft = -1 if flags[FLAG_LP_HARD]: lp_hard = vft.is_local_preferenced(g, trace, vf_g=vf_g_degree, first_edge=False, vfmode=vft.DEGREE) is_lp_degree_hard = 1 if lp_hard else 0 else: is_lp_degree_hard = -1 if flags[FLAG_CLOSENESS]: is_vf_closeness = vft.is_valley_free(g, trace, vft.CLOSENESS) is_vf_closeness = int(is_vf_closeness) if is_vf_closeness: if flags[FLAG_LP_SOFT]: lp_soft = vft.is_local_preferenced(g, trace, vf_g=vf_g_closeness, first_edge=True, vfmode=vft.CLOSENESS) is_lp_closeness_soft = 1 if lp_soft else 0 else: is_lp_closeness_soft = -1 if flags[FLAG_LP_HARD]: lp_hard = vft.is_local_preferenced(g, trace, vf_g=vf_g_closeness, first_edge=False, vfmode=vft.CLOSENESS) is_lp_closeness_hard = 1 if lp_hard else 0 else: is_lp_closeness_hard = -1 if False: sh_vf_len = vft.get_shortest_vf_route(g, s, t, mode='vf', vf_g=vf_g_pre, _all=True, vfmode=vft.PRELABELED) # ugy tunik, mintha nem mindig lenne pontos? fentartassal kezelendo # ez az ertek azert is kerult bele, hogy ellenorizzuk in_vf_prediction = 1 if sh_vf_len and trace in sh_vf_len else 0 else: sh_vf_len = -1 in_vf_prediction = -1 sh_vf_len = len(sh_vf_len[0]) if isinstance(sh_vf_len, list) else -1 percentage_stretch = trace_len / float(sh_len) named_trace = [g.vs[_id]["name"] for _id in trace] result = { helpers.TRACE: named_trace, helpers.TRACE_LEN: trace_len, helpers.SH_LEN: sh_len, helpers.SH_VF_LEN: sh_vf_len, helpers.IS_VF_PRELABELED: is_vf_prelabeled, helpers.IS_VF_DEGREE: is_vf_degree, helpers.IS_VF_CLOSENESS: is_vf_closeness, helpers.HOP_STRETCH: trace_len - sh_len, helpers.PERC_STRETCH: percentage_stretch, helpers.IN_VF_PRED: in_vf_prediction, helpers.IS_LP_SOFT_PRELABELED: is_lp_prelabeled_soft, helpers.IS_LP_HARD_PRELABELED: is_lp_prelabeled_hard, helpers.IS_LP_SOFT_DEGREE: is_lp_degree_soft, helpers.IS_LP_HARD_DEGREE: is_lp_degree_hard, helpers.IS_LP_SOFT_CLOSENESS: is_lp_closeness_soft, helpers.IS_LP_HARD_CLOSENESS: is_lp_closeness_hard, } results.append(result) # print >> sys.stderr, ('TRACE\tTRACE_LEN\tSH_LEN\tSH_VF_LEN\tIS_VF', # '\tSTRETCH\tIN_VF_PREDICTION\tIS_LP_F\tIS_LP_ALL') # for result in results: # result = [str(r) for r in result] # print >> sys.stderr, '\t'.join(result) # statistic = statistics.purify(g, results, # 'nc+ec+tc+rt+vf+vf_closeness+pred+lp_soft_prelabeled+lp_hard_prelabeled+lp_soft_degree+lp_hard_degree+lp_soft_closeness+lp_hard_closeness'.split('+')) # statistics.stat_printer(statistic) return results
def main(): parser = argparse.ArgumentParser( description=('Syntetic route generator'), formatter_class=argparse.ArgumentDefaultsHelpFormatter) parser.add_argument('--progressbar', action='store_true') parser.add_argument('--verbose', '-v', action='count', default=0) parser.add_argument('network') parser.add_argument('meta') parser.add_argument('all_trace_out', metavar='all-trace-out') parser.add_argument('syntetic_out', metavar='syntetic-out') parser.add_argument('--trace-count', '-tc', type=int, dest='trace_count', default=5000) parser.add_argument('--random-sample', dest='random_sample', action='store_true') parser.add_argument('--closeness-error', '-ce', type=float, dest='closeness_error', default=0.0) parser.add_argument('--core-limit-percentile', '-cl', type=int, dest='core_limit', default=0) parser.add_argument('--toggle-node-error-mode', action='store_true') arguments = parser.parse_args() arguments.verbose = min(len(helpers.LEVELS) - 1, arguments.verbose) logging.getLogger('compnet').setLevel(helpers.LEVELS[arguments.verbose]) show_progress = arguments.progressbar g = helpers.load_network(arguments.network) g = g.simplify() meta = helpers.load_from_json(arguments.meta) if arguments.random_sample: random.shuffle(meta) meta = meta[:arguments.trace_count] N = g.vcount() cl = sorted([x['closeness'] for x in g.vs], reverse=True) logger.info('Min closeness: %s' % np.min(cl)) logger.info('Max closeness: %s' % np.max(cl)) logger.info('Mean closenss: %s' % np.mean(cl)) logger.info('10%% closeness: %s' % np.percentile(cl, 10)) logger.info('90%% closeness: %s' % np.percentile(cl, 90)) logger.info('Core limit: [r]%d%%[/]' % arguments.core_limit) change_probability = 100 * arguments.closeness_error logger.info('Change probability: [r]%6.2f%%[/]' % change_probability) core_limit = np.percentile(cl, arguments.core_limit) logger.info('Core limit in closeness: [bb]%f[/]' % core_limit) if arguments.toggle_node_error_mode: logger.info('[r]Node error mode[/]') msg = ( "If given node's closeness >= core_limit then the new ", "closeness in this node is ", #"rand(closeness_error ... old closeness)" "OLD_CLOSENSS * +/- closeness_error%") logger.info(''.join(msg)) logger.info('Minimum node closeness: [g]%f[/]' % arguments.closeness_error) for n in g.vs: if n['closeness'] < core_limit: continue # sign = -1 if random.uniform(-1, 1) < 0 else 1 # n['closeness'] = n['closeness'] * (1 + sign * arguments.closeness_error) new_closeness = random.uniform(arguments.closeness_error, n['closeness']) n['closeness'] = new_closeness g_labeled = vft.label_graph_edges(g, vfmode=vft.CLOSENESS) peer_edge_count = len([x for x in g_labeled.es if x['dir'] == LinkDir.P]) logger.info('Peer edge count: %d' % peer_edge_count) changed_edges = [] if not arguments.toggle_node_error_mode: msg = ("If the closeness values of the endpoints in given edge is ", "larger than the core_limit and ", "random(0,1) < closeness_error then change the direction ", "for this edge") logger.info(''.join(msg)) changed_u = changed_d = 0 changed_edges = [] changed_edgess = [] for edge in g_labeled.es: s, t = edge.source, edge.target s_cl = g_labeled.vs[s]['closeness'] t_cl = g_labeled.vs[t]['closeness'] if (s_cl < core_limit or t_cl < core_limit): continue if random.uniform(0, 1) > arguments.closeness_error: continue # if abs(s_cl - t_cl) / min(s_cl, t_cl) > 0.02: continue new_edge_dir = LinkDir.U if random.uniform(0, 1) > 0.5 else LinkDir.D if new_edge_dir != edge['dir']: if edge['dir'] == LinkDir.U: changed_u += 1 else: changed_d += 1 edge['dir'] = new_edge_dir changed_edges.append(edge) changed_edgess.append((edge.source, edge.target)) # if edge['dir'] == LinkDir.U: # changed_u += 1 # changed_edgess.append((edge.source, edge.target)) # edge['dir'] = LinkDir.D # changed_edges.append(edge) # elif edge['dir'] == LinkDir.D: # changed_d += 1 # changed_edgess.append((edge.source, edge.target)) # edge['dir'] = LinkDir.U # changed_edges.append(edge) logger.info('E count: %d' % g_labeled.ecount()) logger.info('Changed U: %d' % changed_u) logger.info('Changed D: %d' % changed_d) logger.info('Changed: %d' % (changed_d + changed_u)) changed_e = [(g_labeled.vs[e.source]['name'], g_labeled.vs[e.target]['name']) for e in changed_edges] changed_e = changed_e + [(x[1], x[0]) for x in changed_e] changed_e = set(changed_e) vf_g_closeness = vft.convert_to_vf(g, vfmode=vft.CLOSENESS, labeled_graph=g_labeled) # e_colors = [] # for e in vf_g_closeness.es: # if e.source < N and e.target < N: col = 'grey' # elif e.source < N and e.target >= N: col = 'blue' # elif e.source >= N and e.target >= N: col = 'red' # else: col = 'cyan' # e_colors.append(col) # igraph.plot(vf_g_closeness, "/tmp/closeness.pdf", # vertex_label=vf_g_closeness.vs['name'], # vertex_size=0.2, # edge_color=e_colors) pairs = [(g.vs.find(x[helpers.TRACE][0]).index, g.vs.find(x[helpers.TRACE][-1]).index, tuple(x[helpers.TRACE])) for x in meta] # pairs = list(set(pairs)) # random.shuffle(pairs) # visited = set() # pairs2 = [] # for x in pairs: # k = (x[0], x[1]) # if k in visited: continue # visited.add(k) # visited.add((k[1], k[0])) # pairs2.append(x) # pairs = pairs2 traces = [x[2] for x in pairs] stretches = [] syntetic_traces = [] sh_traces = [] base_traces = [] original_traces = [] bad = 0 progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(pairs), width=15) for s, t, trace_original in pairs: progress += 1 progress.show_progress() trace_original_idx = [g.vs.find(x).index for x in trace_original] logger.debug('Original trace: %s -- %s -- %s', [g.vs[x]['name'] for x in trace_original_idx], vft.trace_to_string(g, trace_original_idx, vft.CLOSENESS), [g.vs[x]['closeness'] for x in trace_original_idx]) sh_routes = g.get_all_shortest_paths(s, t) sh_len = len(sh_routes[0]) sh_routes_named = [[g.vs[y]['name'] for y in x] for x in sh_routes] sh_trace_name = random.choice(sh_routes_named) base_trace_name = random.choice(sh_routes_named) candidates = vf_g_closeness.get_all_shortest_paths(s + N, t + N) candidates = [vft.vf_route_converter(x, N) for x in candidates] # candidates = [] if len(candidates) == 0: candidates = vft.get_shortest_vf_route(g_labeled, s, t, mode='vf', vf_g=vf_g_closeness, _all=True, vfmode=vft.CLOSENESS) if len(candidates) == 0: s_name, t_name = g.vs[s]['name'], g.vs[t]['name'] logger.debug("!!!No syntetic route from %s to %s" % (s_name, t_name)) continue logger.debug('Candidates from %s to %s:' % (g.vs[s]['name'], g.vs[t]['name'])) for c in candidates: logger.debug('%s -- %s -- %s' % ([g.vs[x]['name'] for x in c], vft.trace_to_string(g_labeled, c, vft.PRELABELED), [g.vs[x]['closeness'] for x in c])) chosen_one = random.choice(candidates) chosen_one_name = [g.vs[x]['name'] for x in chosen_one] # print chosen_one # print trace_original # pretty_plotter.pretty_plot(g, trace_original_idx, # chosen_one, changed_edgess, # spec_color=(0, 0, 0, 155)) hop_stretch = len(chosen_one) - sh_len stretches.append(hop_stretch) trace_original_e = zip(trace_original, trace_original[1:]) chosen_one_e = zip(chosen_one_name, chosen_one_name[1:]) trace_affected = any([x in changed_e for x in trace_original_e]) chosen_affected = any([x in changed_e for x in chosen_one_e]) logger.debug('Trace affected: %s' % trace_affected) logger.debug('Chosen affected: %s' % chosen_affected) # if hop_stretch > 2: # logger.debug('Base: %s' % trace_to_string(g_labeled, base_trace_name)) # logger.debug('SH: %s' % trace_to_string(g_labeled, sh_trace_name)) # logger.debug('Trace: %s' % trace_to_string(g_labeled, trace_original)) # logger.debug('Syntetic: %s' % trace_to_string(g_labeled, chosen_one_name)) if trace_affected or chosen_affected or hop_stretch > 2: # pretty_plotter.pretty_plot_all(g, traces, # chosen_one, changed_edgess, # spec_color=(0, 0, 0, 255)) bad += 1 syntetic_traces.append(chosen_one_name) sh_traces.append(sh_trace_name) base_traces.append(base_trace_name) original_traces.append(trace_original) logger.debug('From %s to %s chosen one %s' % (g.vs[s]['name'], g.vs[t]['name'], chosen_one_name)) result = zip(base_traces, sh_traces, original_traces, syntetic_traces) helpers.save_to_json(arguments.all_trace_out, result) helpers.save_to_json(arguments.syntetic_out, syntetic_traces) print 'Bad: %d' % bad c = collections.Counter(stretches) trace_count = len(syntetic_traces) logger.info('Stretch dist:') for k in c: logger.info('\t%d: %5.2f%%[%d]' % (k, 100 * c[k] / float(trace_count), c[k])) logger.info('Valid route count: %d' % trace_count) logger.info('Route count parameter: %d' % arguments.trace_count) logger.info('Generated valid pair count: %d' % len(pairs))
def purify(g, meta, flags, try_per_trace, show_progress=False): # generate valley-free graph if flags[FLAG_PRELABELED]: logger.info('Generate VF_G_PRE') vf_g_pre = vft.convert_to_vf(g, vfmode=vft.PRELABELED) else: logger.info('Skip prelabeled graph') if flags[FLAG_DEGREE]: logger.info('Generate VF_G_DEGREE') vf_g_degree = vft.convert_to_vf(g, vfmode=vft.DEGREE) else: logger.info('Skip degree graph') if flags[FLAG_CLOSENESS]: logger.info('Generate VF_G_CLOSENESS') vf_g_closeness = vft.convert_to_vf(g, vfmode=vft.CLOSENESS) else: logger.info('Skip closeness graph') # Randomize stretch dispersion stretches = [x[helpers.HOP_STRETCH] for x in meta] # a veletlen stretchek az eredeti stretchek veletlen, nem # visszateveses mintavetelezese. Mindez annyiszor, ahany # veletlen utat akarunk generalni minden valos trace vegpontja # kozott. stretch_list = [random.sample(stretches, len(stretches)) for x in xrange(0, try_per_trace)] # A kovetkezo ciklusban minden meta sorhoz rogton kiszamolunk # annyi random utat, amennyit parameterben megadtunk. Ehhez at kell # alakitani a stretch lista strukturat, hogy minden elem egy meta sorhoz # tartalmazza a random stretch ertekeket # # Pelda: elozo lepesnel kijott ez: [ [1,2,3,4], [2,4,1,3], [3,1,4,2] ] # vagyis elso lepesben a metaban tarolt tracek rendre 1,2,3,4 stretchet # kell felvegyenek, a masodikban 2,4,1,3 stb. A ciklusban viszont a meta # elso elemehez rogton ki akarjuk szamolni a veletlen stretchekhez tartozo # random utakat, vagyis [ [1,2,3], [2,4,1], [3,1,4], [4,3,2] ] formaban # van szukseg az ertekekre stretch_list = zip(*stretch_list) progress = progressbar1.DummyProgressBar(end=10, width=15) if show_progress: progress = progressbar1.AnimatedProgressBar(end=len(meta), width=15) for idx, record in enumerate(meta): progress += 1 progress.show_progress() trace = vft.trace_in_vertex_id(g, [record[helpers.TRACE], ]) if len(trace) != 1: print 'PROBLEM' print record continue trace = trace[0] if len(trace) == 1: continue sh_len = record[helpers.SH_LEN] s, t = trace[0], trace[-1] is_vf_prelabeled_l = [] is_lp_prelabeled_hard_l = [] is_lp_prelabeled_soft_l = [] is_vf_degree_l = [] is_lp_degree_hard_l = [] is_lp_degree_soft_l = [] is_vf_closeness_l = [] is_lp_closeness_hard_l = [] is_lp_closeness_soft_l = [] stretch_dist = stretch_list[idx] real_stretch_dist = [] for current_stretch in stretch_dist: random_length = sh_len + current_stretch random_path = helpers.random_route_walk(g, s, t, random_length) real_stretch_dist.append(len(random_path) - sh_len) if len(random_path) == 0: empty += 1 if flags[FLAG_PRELABELED]: (is_vf_prelabeled, is_lp_prelabeled_soft, is_lp_prelabeled_hard) = vf_attributes(g,random_path, vft.PRELABELED, flags[FLAG_LP_SOFT], flags[FLAG_LP_HARD], vf_g_pre) is_vf_prelabeled_l.append(is_vf_prelabeled) is_lp_prelabeled_soft_l.append(is_lp_prelabeled_soft) is_lp_prelabeled_hard_l.append(is_lp_prelabeled_hard) if flags[FLAG_DEGREE]: (is_vf_degree, is_lp_degree_soft, is_lp_degree_hard) = vf_attributes(g, random_path, vft.DEGREE, flags[FLAG_LP_SOFT], flags[FLAG_LP_HARD], vf_g_degree) is_vf_degree_l.append(is_vf_degree) is_lp_degree_soft_l.append(is_lp_degree_soft) is_lp_degree_hard_l.append(is_lp_degree_hard) if flags[FLAG_CLOSENESS]: (is_vf_closeness, is_lp_closeness_soft, is_lp_closeness_hard) = vf_attributes(g, random_path, vft.CLOSENESS, flags[FLAG_LP_SOFT], flags[FLAG_LP_HARD], vf_g_closeness) is_vf_closeness_l.append(is_vf_closeness) is_lp_closeness_soft_l.append(is_lp_closeness_soft) is_lp_closeness_hard_l.append(is_lp_closeness_hard) result = { helpers.RANDOM_GULYAS_WALK_ROUTES_RQ_STRETCH: stretch_dist, helpers.RANDOM_GULYAS_WALK_ROUTES_STRETCH: real_stretch_dist, helpers.RANDOM_GULYAS_WALK_ROUTES_VF_PRELABELED: is_vf_prelabeled_l, helpers.RANDOM_GULYAS_WALK_ROUTES_VF_DEGREE: is_vf_degree_l, helpers.RANDOM_GULYAS_WALK_ROUTES_VF_CLOSENESS: is_vf_closeness_l, helpers.RANDOM_GULYAS_WALK_ROUTES_LP_SOFT_PRELABELED: is_lp_prelabeled_soft_l, helpers.RANDOM_GULYAS_WALK_ROUTES_LP_HARD_PRELABELED: is_lp_prelabeled_hard_l, helpers.RANDOM_GULYAS_WALK_ROUTES_LP_SOFT_DEGREE: is_lp_degree_soft_l, helpers.RANDOM_GULYAS_WALK_ROUTES_LP_HARD_DEGREE: is_lp_degree_hard_l, helpers.RANDOM_GULYAS_WALK_ROUTES_LP_SOFT_CLOSENESS: is_lp_closeness_soft_l, helpers.RANDOM_GULYAS_WALK_ROUTES_LP_HARD_CLOSENESS: is_lp_closeness_hard_l, } record.update(result)