Issue
I have the following function that generates a graph.
import numpy as np
import networkx as nx
import random
def random_graph(vertices, connectivity):
#Creates random symmetric graph
arr = np.random.randint(0,10,(vertices,vertices))
sym = (arr+arr.T)
#removing self loops with fixing diagonal
np.fill_diagonal(sym,0)
#connectivity of graph -> 0 for highest connections, 9 for least connections
mat = (sym>connectivity).astype(int)
#convert to dictionary
G = {k:[i for i,j in enumerate(v) if j==1] for k,v in enumerate(mat)}
return G
I use that function with a randomly generated connectivity, unfortunately the generated graph is not always planar, so I want to run the function until I get a planar graph. The planarity of the graph is checked with the function check_planarity
from networkx
. The function check_planarity
returns a boolean, if it’s true, the graph is planar, if false the graph is not planar and I need to generate a new graph until it’s planar. This is what I have tried:
while True:
random_connectivity = random.randint(4, 9)
G = random_graph(5, random_connectivity)
g = nx.Graph(G)
planar = nx.check_planarity(g)
if planar:
break
else:
pass
As you can see from the loop above, first I generate random_connectivity
, them I create the graph with that connectivity and then with networkx
I check the planarity. Then I try to check if it’s planar or not and if not I run the program again. Unfortunately it doesn’t work because it often returns a non planar graph. I also tried unpacking planar
and checking the first element of the unpacked list but it doesn’t work:
planar_check = [x[0] for x in planar]
When trying the line of code above I get the following traceback:
Traceback (most recent call last):
File "c:\Users\besan\OneDrive\Desktop\LAM da correggere\test.py", line 64, in <module>
planar_check = [x[0] for x in planar]
File "c:\Users\besan\OneDrive\Desktop\LAM da correggere\test.py", line 64, in <listcomp>
planar_check = [x[0] for x in planar]
TypeError: 'bool' object is not subscriptable
Solution
Solved by directly checking the first element of planar
insead of unpacking it:
planar = nx.check_planarity(g)[0]
Answered By – Emilio
Answer Checked By – Marilyn (BugsFixing Volunteer)