Source code for MetaNetworkIGraph

#!/usr/bin/env python
# -*- coding: utf-8 -*-

__author__ = 'Peter M. Landwehr <plandweh@cs.cmu.edu>'

from collections import OrderedDict
import dynetmlparsingutils as dmlpu
import igraph
from lxml import etree
from MetaNetwork import MetaNetwork


[docs]class MetaNetworkIG (MetaNetwork): """ A subclass of the MetaNetwork class that stores networks as tuples. The first element of each tuple is a \ dictionary that matches node names to igraph node numbers. The second element is an :class:`igraph.Graph` \ containing the network itself. """ def _rename_network_nodes(self, nodeclass_name, nodeset_name, node_name, new_node_name): for nk in self.networks: if nk[1]['sourceType'] == nodeclass_name and nk[1]['source'] == nodeset_name or \ nk[1]['targetType'] == nodeclass_name and nk[1]['target'] == nodeset_name: if node_name in nk[0]: nk[0][new_node_name] = nk[0][node_name] del nk[0][node_name] def _parse_and_add_graph_tag(self, nk_tag): g = igraph.Graph(directed=nk_tag.attrib['isDirected'] == 'true') g['sourceType'] = nk_tag.attrib['sourceType'] g['source'] = nk_tag.attrib['source'] g['targetType'] = nk_tag.attrib['targetType'] g['target'] = nk_tag.attrib['target'] g['id'] = nk_tag.attrib['id'] g['isDirected'] = nk_tag.attrib['isDirected'] == 'true' g['allowSelfLoops'] = nk_tag.attrib['allowSelfLoops'] == 'true' g['isBinary'] = nk_tag.attrib['isBinary'] == 'true' #for attrib_key in nk_tag.attrib: # g[nk_tag.attrib['id']][attrib_key] = format_prop(nk_tag.attrib[attrib_key]) edge_list = list() id_vertex_dict = OrderedDict() weight_list = list() for link_tag in nk_tag.iterfind('link'): if link_tag.attrib['source'] not in id_vertex_dict: id_vertex_dict[link_tag.attrib['source']] = len(id_vertex_dict) if link_tag.attrib['target'] not in id_vertex_dict: id_vertex_dict[link_tag.attrib['target']] = len(id_vertex_dict) edge_list.append((id_vertex_dict[link_tag.attrib['source']], id_vertex_dict[link_tag.attrib['target']])) try: weight_list.append(float(link_tag.attrib['weight'])) except KeyError: weight_list.append(1.0) g.add_vertices(len(id_vertex_dict)) g.add_edges(edge_list) if not g['isBinary']: g.es['weight'] = weight_list self.networks[nk_tag.attrib['id']] = id_vertex_dict, g def _get_networks_tag(self): # bs = BeautifulSoup() # networks_tag = bs.new_tag('networks') # for key in self.networks: # network_tag = bs.new_tag('network') # network_tag['sourceType'] = self.networks[key][1]['sourceType'] # network_tag['source'] = self.networks[key][1]['source'] # network_tag['targetType'] = self.networks[key][1]['targetType'] # network_tag['target'] = self.networks[key][1]['target'] # network_tag['id'] = key # network_tag['isDirected'] = dmlpu.unformat_prop(self.networks[key]['isDirected']) # network_tag['allowSelfLoops'] = dmlpu.unformat_prop(self.networks[key]['allowSelfLoops']) # network_tag['isBinary'] = dmlpu.unformat_prop(self.networks[key]['isBinary']) # # e_l = self.networks[key].edge_list() # if self.networks[key]['isBinary']: # for i in range(len(e_l)): # network_tag.append(bs.new_tag('link', source=e_l[i][0], target=e_l[i][1])) # else: # for i in range(len(e_l)): # network_tag.append(bs.new_tag('link', source=e_l[i][0], target=e_l[i][1], # value=self.networks[key].es[i]['weight'])) # # networks_tag.append(network_tag) # # return networks_tag networks_tag = etree.Element('networks') for key in self.networks: network_tag = etree.SubElement(networks_tag, 'network', attrib={ 'sourceType': self.networks[key][1]['sourceType'], 'source': self.networks[key][1]['source'], 'targetType': self.networks[key][1]['targetType'], 'target': self.networks[key][1]['target'], 'id': key, 'isDirected': dmlpu.unformat_prop(self.networks[key]['isDirected']), 'allowSelfLoops': dmlpu.unformat_prop(self.networks[key]['allowSelfLoops']), 'isBinary': dmlpu.unformat_prop(self.networks[key]['isBinary'])}) e_l = self.networks[key].edge_list() if self.networks[key]['isBinary']: for i in range(len(e_l)): etree.SubElement(network_tag, 'link', attrib={'source': e_l[i][0], 'target': e_l[i][1]}) else: for i in range(len(e_l)): etree.SubElement(network_tag, 'link', attrib={'source': e_l[i][0], 'target': e_l[i][1], 'value': self.networks[key].es[i]['weight']}) return networks_tag def _pretty_print_networks(self): print ' == Networks ==' network_count = 0 for nk_key in self.networks: nk = self.networks[nk_key][1] print u' Network {0}: {1}'.format(network_count, nk_key).encode('utf8') for prop in nk: print u' {0}: {1}'.format(prop, nk[prop]).encode('utf8') print ' {0} nodes'.format(len(nk.vs)) print ' {0} edges'.format(len(nk.es)) network_count += 1