Source code for jgf.igraph
import numpy as np
import jgf
from collections import OrderedDict
[docs]def load(filename='',compressed=None):
"""
Loads a JGF(Z) – Json Graph Format (gZipped) – file and converts it
to an igraph.Graph object.
Parameters
----------
filename : str or file handle
Path to the file or a file handle to be used as input.
compressed : bool
If true, the input file will be interpreted as being compressed.
If not provided, this will be guessed from the file extension.
Use '.jgfz' for compressed files.
Returns
----------
out : list of igraph.Graph
List of igraph network objects.
"""
import igraph as ig
inputGraphs = jgf.load(filename,compressed=compressed)
graphs = []
for inputGraph in inputGraphs:
nodeCount = 0
if("node-count" in inputGraph):
nodeCount = inputGraph["node-count"]
directed = False
if("directed" in inputGraph):
directed = inputGraph["directed"]
edges = []
edgeCount = 0
if("edges" in inputGraph):
edges = inputGraph["edges"]
edgeCount = len(edges)
graph = ig.Graph(nodeCount,directed=directed,edges=edges)
if("label") in inputGraph:
graph["label"] = inputGraph["label"]
if("network-properties" in inputGraph):
for key,value in inputGraph["network-properties"].items():
graph[key] = value
if("node-properties" in inputGraph):
for key,values in inputGraph["node-properties"].items():
if(isinstance(values, dict)):
for indexKey,value in values.items():
nodeIndex = int(indexKey)
if(nodeIndex<0 or nodeIndex>=nodeCount):
raise ValueError("Found a node index out of bounds. %d is not in range [%d,%d) "%(nodeIndex,0,nodeCount))
graph.vs[nodeIndex][key] = values[indexKey]
else:
graph.vs[key] = values
if("edge-properties" in inputGraph):
for key,values in inputGraph["edge-properties"].items():
if(isinstance(values, dict)):
for indexKey,value in values.items():
edgeIndex = int(indexKey)
if(edgeIndex<0 or edgeIndex>=edgeCount):
raise ValueError("Found an edge index out of bounds. %d is not in range [%d,%d) "%(edgeIndex,0,edgeCount))
graph.es[edgeIndex] = values[indexKey]
else:
graph.es[key] = values
graphs.append(graph)
return graphs
[docs]def save(graphs, filename='',compressed=None):
"""
Writes a list igraph.Graph networks to a JGF(Z) – Json Graph Format (gZipped) – file.
Parameters
----------
graphs : list of igraph.Graph objects or a single Graph object
Graphs to be saved.
filename : str or file handle
Path to the file or a file handle to be used as output.
compressed : bool
If true, the input file will be interpreted as being compressed.
If not provided, this will be guessed from the file extension.
Use '.jgfz' for compressed files.
"""
import igraph as ig
exportGraphs = []
if(not isinstance(graphs,list)):
graphs = [graphs]
for graph in graphs:
exportGraph = OrderedDict()
if("label" in graph.attributes()):
exportGraph["label"] = graph["label"]
exportGraph["node-count"] = graph.vcount()
exportGraph["directed"] = graph.is_directed()
networkProperties = OrderedDict()
for key in graph.attributes():
if(key!="label"):
networkProperties[key] = graph[key]
if(len(networkProperties)>0):
exportGraph["network-properties"] = networkProperties
exportGraph["edges"] = graph.get_edgelist()
nodeProperties = OrderedDict()
for key in graph.vertex_attributes():
values = graph.vs[key]
foundNone = False
for value in values:
if(value is None):
foundNone=True
break
if(foundNone):
nodeProperties[key] = OrderedDict((index,value) for index,value in enumerate(values) if value is not None)
else:
nodeProperties[key] = values
if(len(nodeProperties)>0):
exportGraph["node-properties"] = nodeProperties
edgeProperties = OrderedDict()
for key in graph.edge_attributes():
values = graph.es[key]
foundNone = False
for value in values:
if(value is None):
foundNone=True
break
if(foundNone):
edgeProperties[key] = OrderedDict((index,value) for index,value in enumerate(values) if value is not None)
else:
edgeProperties[key] = values
if(len(edgeProperties)>0):
exportGraph["edge-properties"] = edgeProperties
exportGraphs.append(exportGraph)
jgf.save(exportGraphs,filename,compressed)