Source code for MetaNetworkDict

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


__author__ = 'plandweh'

from collections import defaultdict
import dynetmlparsingutils as dmlpu
from lxml import etree
from MetaNetwork import MetaNetwork


[docs]class MetaNetworkDict (MetaNetwork): """ A subclass of the MetaNetwork class that handles networks by storing them as a tuple of a dictionary of attributes and a defaultdict(dict) of edges. """ def _rename_network_nodes(self, nodeclass_name, nodeset_name, node_name, new_node_name): for nk in self.networks: if nk[0]['sourceType'] == nodeclass_name and nk[0]['source'] == nodeset_name or \ nk[0]['targetType'] == nodeclass_name and nk[0]['target'] == nodeset_name: nk[new_node_name] = nk[node_name] del nk[node_name] for src in nk: if node_name in nk[src]: nk[src][new_node_name] = nk[src][node_name] del nk[src][node_name] def _parse_and_add_graph_tag(self, nk_tag): g = {}, defaultdict(dict) g[0]['sourceType'] = nk_tag.attrib['sourceType'] g[0]['source'] = nk_tag.attrib['source'] g[0]['targetType'] = nk_tag.attrib['targetType'] g[0]['target'] = nk_tag.attrib['target'] g[0]['id'] = nk_tag.attrib['id'] g[0]['isDirected'] = nk_tag.attrib['isDirected'] == 'true' g[0]['allowSelfLoops'] = nk_tag.attrib['allowSelfLoops'] == 'true' g[0]['isBinary'] = nk_tag.attrib['isBinary'] == 'true' #for attrib_key in nk_tag.attrib: # g[0][attrib_key] = format_prop(nk_tag.attrib[attrib_key]) if g[0]['isDirected']: for link in nk_tag.iterfind('link'): weight = float(link.attrib['value']) if 'value' in link.attrib else 1.0 g[1][link.attrib['source']][link.attrib['target']] = weight else: for link in nk_tag.iterfind('link'): weight = float(link.attrib['value']) if 'value' in link.attrib else 1.0 g[1][link.attrib['source']][link.attrib['target']] = weight g[1][link.attrib['target']][link.attrib['source']] = weight self.networks[nk_tag.attrib['id']] = 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][0]['sourceType'] # network_tag['source'] = self.networks[key][0]['source'] # network_tag['targetType'] = self.networks[key][0]['targetType'] # network_tag['target'] = self.networks[key][0]['target'] # network_tag['id'] = key # network_tag['isDirected'] = dmlpu.unformat_prop(self.networks[key][0]['isDirected']) # network_tag['allowSelfLoops'] = dmlpu.unformat_prop(self.networks[key][0]['allowSelfLoops']) # network_tag['isBinary'] = dmlpu.unformat_prop(self.networks[key][0]['isBinary']) # # if self.networks[key][0]['isBinary']: # for edge in self.networks[key].edges_iter(): # network_tag.append(bs.new_tag('link', source=edge[0], target=edge[1])) # else: # for edge in self.networks[key].edges_iter(data=True): # network_tag.append(bs.new_tag('link', source=edge[0], target=edge[1], value=edge[2]['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][0]['sourceType'], 'source': self.networks[key][0]['source'], 'targetType': self.networks[key][0]['targetType'], 'target': self.networks[key][0]['target'], 'id': key, 'isDirected': dmlpu.unformat_prop(self.networks[key][0]['isDirected']), 'allowSelfLoops': dmlpu.unformat_prop(self.networks[key][0]['allowSelfLoops']), 'isBinary': dmlpu.unformat_prop(self.networks[key][0]['isBinary'])}) if self.networks[key][0]['isBinary']: for edge in self.networks[key].edges_iter(): etree.SubElement(network_tag, 'link', attrib={'source': edge[0], 'target': edge[1]}) else: for edge in self.networks[key].edges_iter(data=True): etree.SubElement(network_tag, 'link', attrib={'source': edge[0], 'target': edge[1], 'value': edge[2]['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] print u' Network {0}: {1}'.format(network_count, nk_key).encode('utf8') for prop in nk[0]: print u' {0}: {1}'.format(prop, nk[0][prop]).encode('utf8') nodes = set() edges = list() for src in nk[1]: nodes.add(src) for target in nk[1][src]: nodes.add(target) edges.append([src, target]) if nk[0]['isDirected']: for edge in edges: edge.sort() print ' {0} nodes'.format(len(nodes)) print ' {0} edges'.format(len(set(edges))) network_count += 1