ysig / GraKeL

A scikit-learn compatible library for graph kernels
https://ysig.github.io/GraKeL/
Other
593 stars 97 forks source link

MultiDiGraph: graph_from_networkx() ValueError #86

Closed MichZipp closed 1 year ago

MichZipp commented 1 year ago

Describe the bug I have networkx MultiDiGraph with the edge property "edge_type". If I try to fit the kernel I get a value error. If I convert the MultiDiGraph to a DiGraph the error disappears. Are MultiDiGraphs not supported?

To Reproduce

import networkx as nx
from grakel.kernels import RandomWalk

G1 = nx.MultiDiGraph()
G1.add_edges_from([(1,2)], edge_type=0)
G1.add_edges_from([(3,4),(4,5)], edge_type=1)
G1.add_edges_from([(2,3)], edge_type=2)

G2 = nx.MultiDiGraph()

G2.add_edges_from([(1,2)], edge_type=0)
G2.add_edges_from([(4,5)], edge_type=1)
G2.add_edges_from([(4,5)], edge_type=2)
G2.add_edges_from([(2,3), (3,4)], edge_type=2)

print(G1.edges(data=True))

G = graph_from_networkx([G1, G2], edge_labels_tag=('edge_type'))

gk = RandomWalk(normalize=True)
K = gk.fit_transform(G)

Expected behavior Fitted kernel

Stack Trace


ValueError                                Traceback (most recent call last)

File ...python3.9/site-packages/grakel/kernels/kernel.py:195, in Kernel.fit_transform(self, X)
    171 """Fit and transform, on the same dataset.
    172 
    173 Parameters
   (...)
    192 
    193 """
    194 self._method_calling = 2
--> 195 self.fit(X)
    197 # Transform - calculate kernel matrix
    198 km = self._calculate_kernel_matrix()

File ...python3.9/site-packages/grakel/kernels/kernel.py:124, in Kernel.fit(self, X, y)
    122     raise ValueError('`fit` input cannot be None')
    123 else:
--> 124     self.X = self.parse_input(X)
    126 # Return the transformer
    127 return self
...
   1359     )
-> 1360 u, v, k = e
   1361 return self._adjdict[u][v][k]

ValueError: not enough values to unpack (expected 3, got 2)
giannisnik commented 1 year ago

Hi @MichZipp ,

Multigraphs are not supported so far. Graph kernels are typically applied to simple graphs and it is not always clear how to generalize them to multigraphs.