Revision e0f4bbd19d892da805db949a5b98c3dfa9842abc authored by Fabian Brandt on 23 April 2021, 09:51:40 UTC, committed by GitHub on 23 April 2021, 09:51:40 UTC
1 parent 29b3fba
dynamics.pyx
# distutils: language=c++
from .base cimport _Algorithm
from .base cimport Algorithm
from .graph cimport _Graph, Graph
def stdstring(pystring):
""" convert a Python string to a bytes object which is automatically coerced to std::string"""
pybytes = pystring.encode("utf-8")
return pybytes
cdef class GraphEvent:
NODE_ADDITION = 0
NODE_REMOVAL = 1
NODE_RESTORATION = 2
EDGE_ADDITION = 3
EDGE_REMOVAL = 4
EDGE_WEIGHT_UPDATE = 5
EDGE_WEIGHT_INCREMENT = 6
TIME_STEP = 7
property type:
def __get__(self):
return self._this.type
def __set__(self, t):
self._this.type = t
property u:
def __get__(self):
return self._this.u
def __set__(self, u):
self._this.u = u
property v:
def __get__(self):
return self._this.v
def __set__(self, v):
self._this.v = v
property w:
def __get__(self):
return self._this.w
def __set__(self, w):
self._this.w = w
def __cinit__(self, _GraphEventType type, node u, node v, edgeweight w):
self._this = _GraphEvent(type, u, v, w)
def toString(self):
return self._this.toString().decode("utf-8")
def __repr__(self):
return self.toString()
def __eq__(self, GraphEvent other not None):
return _GraphEvent_equal(self._this, other._this)
cdef extern from "<networkit/dynamics/DGSStreamParser.hpp>":
cdef cppclass _DGSStreamParser "NetworKit::DGSStreamParser":
_DGSStreamParser(string path, bool_t mapped, node baseIndex) except +
vector[_GraphEvent] getStream() except +
cdef class DGSStreamParser:
cdef _DGSStreamParser* _this
def __cinit__(self, path, mapped=True, baseIndex=0):
self._this = new _DGSStreamParser(stdstring(path), mapped, baseIndex)
def __dealloc__(self):
del self._this
def getStream(self):
return [GraphEvent(ev.type, ev.u, ev.v, ev.w) for ev in self._this.getStream()]
cdef extern from "<networkit/dynamics/DGSWriter.hpp>":
cdef cppclass _DGSWriter "NetworKit::DGSWriter":
void write(vector[_GraphEvent] stream, string path) except +
cdef class DGSWriter:
cdef _DGSWriter* _this
def __cinit__(self):
self._this = new _DGSWriter()
def __dealloc__(self):
del self._this
def write(self, stream, path):
cdef vector[_GraphEvent] _stream
for ev in stream:
_stream.push_back(_GraphEvent(ev.type, ev.u, ev.v, ev.w))
self._this.write(_stream, stdstring(path))
cdef extern from "<networkit/dynamics/GraphDifference.hpp>":
cdef cppclass _GraphDifference "NetworKit::GraphDifference"(_Algorithm):
_GraphDifference(const _Graph &G1, const _Graph &G2) except +
vector[_GraphEvent] getEdits() except +
count getNumberOfEdits() except +
count getNumberOfNodeAdditions() except +
count getNumberOfNodeRemovals() except +
count getNumberOfNodeRestorations() except +
count getNumberOfEdgeAdditions() except +
count getNumberOfEdgeRemovals() except +
count getNumberOfEdgeWeightUpdates() except +
cdef class GraphDifference(Algorithm):
"""
Calculate the edge difference between two graphs.
This calculates which graph edge additions or edge removals are
necessary to transform one given graph into another given graph.
Both graphs need to have the same node set, directed graphs are not
supported currently.
Note that edge weight differences are not detected but edge
addition events set the correct edge weight.
Parameters:
-----------
G1 : networkit.Graph
The first graph to compare
G2 : networkit.Graph
The second graph to compare
"""
cdef Graph _G1, _G2
def __cinit__(self, Graph G1, Graph G2):
self._this = new _GraphDifference(G1._this, G2._this)
self._G1 = G1
self._G2 = G2
def getEdits(self):
""" Get the required edits.
Returns:
--------
list
A list of graph events
"""
cdef _GraphEvent ev
return [GraphEvent(ev.type, ev.u, ev.v, ev.w) for ev in (<_GraphDifference*>(self._this)).getEdits()]
def getNumberOfEdits(self):
""" Get the required number of edits.
Returns:
--------
int
The number of edits.
"""
return (<_GraphDifference*>(self._this)).getNumberOfEdits()
def getNumberOfNodeAdditions(self):
""" Get the required number of node additions.
Returns:
--------
int
The number of node additions.
"""
return (<_GraphDifference*>(self._this)).getNumberOfNodeAdditions()
def getNumberOfNodeRemovals(self):
""" Get the required number of node removals.
Returns:
--------
int
The number of node removals.
"""
return (<_GraphDifference*>(self._this)).getNumberOfNodeRemovals()
def getNumberOfNodeRestorations(self):
""" Get the required number of node restorations.
Returns:
--------
int
The number of node restorations.
"""
return (<_GraphDifference*>(self._this)).getNumberOfNodeRestorations()
def getNumberOfEdgeAdditions(self):
""" Get the required number of edge additions.
Returns:
--------
int
The number of edge additions.
"""
return (<_GraphDifference*>(self._this)).getNumberOfEdgeAdditions()
def getNumberOfEdgeRemovals(self):
""" Get the required number of edge removals.
Returns:
--------
int
The number of edge removals.
"""
return (<_GraphDifference*>(self._this)).getNumberOfEdgeRemovals()
def getNumberOfEdgeWeightUpdates(self):
""" Get the required number of edge weight updates.
Returns:
--------
int
The number of edge weight updates.
"""
return (<_GraphDifference*>(self._this)).getNumberOfEdgeWeightUpdates()
cdef extern from "<networkit/dynamics/GraphUpdater.hpp>":
cdef cppclass _GraphUpdater "NetworKit::GraphUpdater":
_GraphUpdater(_Graph G) except +
void update(vector[_GraphEvent] stream) nogil except +
vector[pair[count, count]] getSizeTimeline() except +
cdef class GraphUpdater:
""" Updates a graph according to a stream of graph events.
Parameters:
-----------
G : networkit.Graph
initial graph
"""
cdef _GraphUpdater* _this
cdef Graph _G
def __cinit__(self, Graph G):
self._G = G
self._this = new _GraphUpdater(G._this)
def __dealloc__(self):
del self._this
def update(self, stream):
cdef vector[_GraphEvent] _stream
for ev in stream:
_stream.push_back(_GraphEvent(ev.type, ev.u, ev.v, ev.w))
with nogil:
self._this.update(_stream)
Computing file changes ...