Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/networkx/generators/small.py: 37%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

187 statements  

1""" 

2Various small and named graphs, together with some compact generators. 

3 

4""" 

5 

6__all__ = [ 

7 "LCF_graph", 

8 "bull_graph", 

9 "chvatal_graph", 

10 "cubical_graph", 

11 "desargues_graph", 

12 "diamond_graph", 

13 "dodecahedral_graph", 

14 "frucht_graph", 

15 "generalized_petersen_graph", 

16 "heawood_graph", 

17 "hoffman_singleton_graph", 

18 "house_graph", 

19 "house_x_graph", 

20 "icosahedral_graph", 

21 "krackhardt_kite_graph", 

22 "moebius_kantor_graph", 

23 "octahedral_graph", 

24 "pappus_graph", 

25 "petersen_graph", 

26 "sedgewick_maze_graph", 

27 "tetrahedral_graph", 

28 "truncated_cube_graph", 

29 "truncated_tetrahedron_graph", 

30 "tutte_graph", 

31] 

32 

33from functools import wraps 

34 

35import networkx as nx 

36from networkx.exception import NetworkXError 

37from networkx.generators.classic import ( 

38 complete_graph, 

39 cycle_graph, 

40 empty_graph, 

41 path_graph, 

42) 

43 

44 

45def _raise_on_directed(func): 

46 """ 

47 A decorator which inspects the `create_using` argument and raises a 

48 NetworkX exception when `create_using` is a DiGraph (class or instance) for 

49 graph generators that do not support directed outputs. 

50 

51 `create_using` may be a keyword argument or the first positional argument. 

52 """ 

53 

54 @wraps(func) 

55 def wrapper(*args, **kwargs): 

56 create_using = args[0] if args else kwargs.get("create_using") 

57 if create_using is not None: 

58 G = nx.empty_graph(create_using=create_using) 

59 if G.is_directed(): 

60 raise NetworkXError("Directed Graph not supported in create_using") 

61 return func(*args, **kwargs) 

62 

63 return wrapper 

64 

65 

66@nx._dispatchable(graphs=None, returns_graph=True) 

67def LCF_graph(n, shift_list, repeats, create_using=None): 

68 """ 

69 Return the cubic graph specified in LCF notation. 

70 

71 LCF (Lederberg-Coxeter-Fruchte) notation[1]_ is a compressed 

72 notation used in the generation of various cubic Hamiltonian 

73 graphs of high symmetry. See, for example, `dodecahedral_graph`, 

74 `desargues_graph`, `heawood_graph` and `pappus_graph`. 

75 

76 Nodes are drawn from ``range(n)``. Each node ``n_i`` is connected with 

77 node ``n_i + shift % n`` where ``shift`` is given by cycling through 

78 the input `shift_list` `repeat` s times. 

79 

80 Parameters 

81 ---------- 

82 n : int 

83 The starting graph is the `n`-cycle with nodes ``0, ..., n-1``. 

84 The null graph is returned if `n` < 1. 

85 

86 shift_list : list 

87 A list of integer shifts mod `n`, ``[s1, s2, .., sk]`` 

88 

89 repeats : int 

90 Integer specifying the number of times that shifts in `shift_list` 

91 are successively applied to each current node in the n-cycle 

92 to generate an edge between ``n_current`` and ``n_current + shift mod n``. 

93 

94 Returns 

95 ------- 

96 G : Graph 

97 A graph instance created from the specified LCF notation. 

98 

99 Examples 

100 -------- 

101 The utility graph $K_{3,3}$ 

102 

103 >>> G = nx.LCF_graph(6, [3, -3], 3) 

104 >>> G.edges() 

105 EdgeView([(0, 1), (0, 5), (0, 3), (1, 2), (1, 4), (2, 3), (2, 5), (3, 4), (4, 5)]) 

106 

107 The Heawood graph: 

108 

109 >>> G = nx.LCF_graph(14, [5, -5], 7) 

110 >>> nx.is_isomorphic(G, nx.heawood_graph()) 

111 True 

112 

113 References 

114 ---------- 

115 .. [1] https://en.wikipedia.org/wiki/LCF_notation 

116 

117 """ 

118 if n <= 0: 

119 return empty_graph(0, create_using) 

120 

121 # start with the n-cycle 

122 G = cycle_graph(n, create_using) 

123 if G.is_directed(): 

124 raise NetworkXError("Directed Graph not supported") 

125 G.name = "LCF_graph" 

126 nodes = sorted(G) 

127 

128 n_extra_edges = repeats * len(shift_list) 

129 # edges are added n_extra_edges times 

130 # (not all of these need be new) 

131 if n_extra_edges < 1: 

132 return G 

133 

134 for i in range(n_extra_edges): 

135 shift = shift_list[i % len(shift_list)] # cycle through shift_list 

136 v1 = nodes[i % n] # cycle repeatedly through nodes 

137 v2 = nodes[(i + shift) % n] 

138 G.add_edge(v1, v2) 

139 return G 

140 

141 

142# ------------------------------------------------------------------------------- 

143# Various small and named graphs 

144# ------------------------------------------------------------------------------- 

145 

146 

147@_raise_on_directed 

148@nx._dispatchable(graphs=None, returns_graph=True) 

149def bull_graph(create_using=None): 

150 """ 

151 Returns the Bull Graph 

152 

153 The Bull Graph has 5 nodes and 5 edges. It is a planar undirected 

154 graph in the form of a triangle with two disjoint pendant edges [1]_ 

155 The name comes from the triangle and pendant edges representing 

156 respectively the body and legs of a bull. 

157 

158 Parameters 

159 ---------- 

160 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

161 Graph type to create. If graph instance, then cleared before populated. 

162 

163 Returns 

164 ------- 

165 G : networkx Graph 

166 A bull graph with 5 nodes 

167 

168 References 

169 ---------- 

170 .. [1] https://en.wikipedia.org/wiki/Bull_graph. 

171 

172 """ 

173 G = nx.from_dict_of_lists( 

174 {0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 4], 3: [1], 4: [2]}, 

175 create_using=create_using, 

176 ) 

177 G.name = "Bull Graph" 

178 return G 

179 

180 

181@_raise_on_directed 

182@nx._dispatchable(graphs=None, returns_graph=True) 

183def chvatal_graph(create_using=None): 

184 """ 

185 Returns the Chvátal Graph 

186 

187 The Chvátal Graph is an undirected graph with 12 nodes and 24 edges [1]_. 

188 It has 370 distinct (directed) Hamiltonian cycles, giving a unique generalized 

189 LCF notation of order 4, two of order 6 , and 43 of order 1 [2]_. 

190 

191 Parameters 

192 ---------- 

193 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

194 Graph type to create. If graph instance, then cleared before populated. 

195 

196 Returns 

197 ------- 

198 G : networkx Graph 

199 The Chvátal graph with 12 nodes and 24 edges 

200 

201 References 

202 ---------- 

203 .. [1] https://en.wikipedia.org/wiki/Chv%C3%A1tal_graph 

204 .. [2] https://mathworld.wolfram.com/ChvatalGraph.html 

205 

206 """ 

207 G = nx.from_dict_of_lists( 

208 { 

209 0: [1, 4, 6, 9], 

210 1: [2, 5, 7], 

211 2: [3, 6, 8], 

212 3: [4, 7, 9], 

213 4: [5, 8], 

214 5: [10, 11], 

215 6: [10, 11], 

216 7: [8, 11], 

217 8: [10], 

218 9: [10, 11], 

219 }, 

220 create_using=create_using, 

221 ) 

222 G.name = "Chvatal Graph" 

223 return G 

224 

225 

226@_raise_on_directed 

227@nx._dispatchable(graphs=None, returns_graph=True) 

228def cubical_graph(create_using=None): 

229 """ 

230 Returns the 3-regular Platonic Cubical Graph 

231 

232 The skeleton of the cube (the nodes and edges) form a graph, with 8 

233 nodes, and 12 edges. It is a special case of the hypercube graph. 

234 It is one of 5 Platonic graphs, each a skeleton of its 

235 Platonic solid [1]_. 

236 Such graphs arise in parallel processing in computers. 

237 

238 Parameters 

239 ---------- 

240 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

241 Graph type to create. If graph instance, then cleared before populated. 

242 

243 Returns 

244 ------- 

245 G : networkx Graph 

246 A cubical graph with 8 nodes and 12 edges 

247 

248 See Also 

249 -------- 

250 tetrahedral_graph, octahedral_graph, dodecahedral_graph, icosahedral_graph 

251 

252 References 

253 ---------- 

254 .. [1] https://en.wikipedia.org/wiki/Cube#Cubical_graph 

255 

256 """ 

257 G = nx.from_dict_of_lists( 

258 { 

259 0: [1, 3, 4], 

260 1: [0, 2, 7], 

261 2: [1, 3, 6], 

262 3: [0, 2, 5], 

263 4: [0, 5, 7], 

264 5: [3, 4, 6], 

265 6: [2, 5, 7], 

266 7: [1, 4, 6], 

267 }, 

268 create_using=create_using, 

269 ) 

270 G.name = "Platonic Cubical Graph" 

271 return G 

272 

273 

274@nx._dispatchable(graphs=None, returns_graph=True) 

275def desargues_graph(create_using=None): 

276 """ 

277 Returns the Desargues Graph 

278 

279 The Desargues Graph is a non-planar, distance-transitive cubic graph 

280 with 20 nodes and 30 edges [1]_. It is isomorphic to the Generalized 

281 Petersen Graph GP(10, 3). It is a symmetric graph. It can be represented 

282 in LCF notation as [5,-5,9,-9]^5 [2]_. 

283 

284 Parameters 

285 ---------- 

286 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

287 Graph type to create. If graph instance, then cleared before populated. 

288 

289 Returns 

290 ------- 

291 G : networkx Graph 

292 Desargues Graph with 20 nodes and 30 edges 

293 

294 References 

295 ---------- 

296 .. [1] https://en.wikipedia.org/wiki/Desargues_graph 

297 .. [2] https://mathworld.wolfram.com/DesarguesGraph.html 

298 """ 

299 G = LCF_graph(20, [5, -5, 9, -9], 5, create_using) 

300 G.name = "Desargues Graph" 

301 return G 

302 

303 

304@_raise_on_directed 

305@nx._dispatchable(graphs=None, returns_graph=True) 

306def diamond_graph(create_using=None): 

307 """ 

308 Returns the Diamond graph 

309 

310 The Diamond Graph is planar undirected graph with 4 nodes and 5 edges. 

311 It is also sometimes known as the double triangle graph or kite graph [1]_. 

312 

313 Parameters 

314 ---------- 

315 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

316 Graph type to create. If graph instance, then cleared before populated. 

317 

318 Returns 

319 ------- 

320 G : networkx Graph 

321 Diamond Graph with 4 nodes and 5 edges 

322 

323 References 

324 ---------- 

325 .. [1] https://mathworld.wolfram.com/DiamondGraph.html 

326 """ 

327 G = nx.from_dict_of_lists( 

328 {0: [1, 2], 1: [0, 2, 3], 2: [0, 1, 3], 3: [1, 2]}, create_using=create_using 

329 ) 

330 G.name = "Diamond Graph" 

331 return G 

332 

333 

334@nx._dispatchable(graphs=None, returns_graph=True) 

335def dodecahedral_graph(create_using=None): 

336 """ 

337 Returns the Platonic Dodecahedral graph. 

338 

339 The dodecahedral graph has 20 nodes and 30 edges. The skeleton of the 

340 dodecahedron forms a graph. It is one of 5 Platonic graphs [1]_. 

341 It can be described in LCF notation as: 

342 ``[10, 7, 4, -4, -7, 10, -4, 7, -7, 4]^2`` [2]_. 

343 

344 Parameters 

345 ---------- 

346 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

347 Graph type to create. If graph instance, then cleared before populated. 

348 

349 Returns 

350 ------- 

351 G : networkx Graph 

352 Dodecahedral Graph with 20 nodes and 30 edges 

353 

354 See Also 

355 -------- 

356 tetrahedral_graph, cubical_graph, octahedral_graph, icosahedral_graph 

357 

358 References 

359 ---------- 

360 .. [1] https://en.wikipedia.org/wiki/Regular_dodecahedron#Dodecahedral_graph 

361 .. [2] https://mathworld.wolfram.com/DodecahedralGraph.html 

362 

363 """ 

364 G = LCF_graph(20, [10, 7, 4, -4, -7, 10, -4, 7, -7, 4], 2, create_using) 

365 G.name = "Dodecahedral Graph" 

366 return G 

367 

368 

369@nx._dispatchable(graphs=None, returns_graph=True) 

370def frucht_graph(create_using=None): 

371 """ 

372 Returns the Frucht Graph. 

373 

374 The Frucht Graph is the smallest cubical graph whose 

375 automorphism group consists only of the identity element [1]_. 

376 It has 12 nodes and 18 edges and no nontrivial symmetries. 

377 It is planar and Hamiltonian [2]_. 

378 

379 Parameters 

380 ---------- 

381 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

382 Graph type to create. If graph instance, then cleared before populated. 

383 

384 Returns 

385 ------- 

386 G : networkx Graph 

387 Frucht Graph with 12 nodes and 18 edges 

388 

389 References 

390 ---------- 

391 .. [1] https://en.wikipedia.org/wiki/Frucht_graph 

392 .. [2] https://mathworld.wolfram.com/FruchtGraph.html 

393 

394 """ 

395 G = cycle_graph(7, create_using) 

396 G.add_edges_from( 

397 [ 

398 [0, 7], 

399 [1, 7], 

400 [2, 8], 

401 [3, 9], 

402 [4, 9], 

403 [5, 10], 

404 [6, 10], 

405 [7, 11], 

406 [8, 11], 

407 [8, 9], 

408 [10, 11], 

409 ] 

410 ) 

411 

412 G.name = "Frucht Graph" 

413 return G 

414 

415 

416@nx._dispatchable(graphs=None, returns_graph=True) 

417def heawood_graph(create_using=None): 

418 """ 

419 Returns the Heawood Graph, a (3,6) cage. 

420 

421 The Heawood Graph is an undirected graph with 14 nodes and 21 edges, 

422 named after Percy John Heawood [1]_. 

423 It is cubic symmetric, nonplanar, Hamiltonian, and can be represented 

424 in LCF notation as ``[5,-5]^7`` [2]_. 

425 It is the unique (3,6)-cage: the regular cubic graph of girth 6 with 

426 minimal number of vertices [3]_. 

427 

428 Parameters 

429 ---------- 

430 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

431 Graph type to create. If graph instance, then cleared before populated. 

432 

433 Returns 

434 ------- 

435 G : networkx Graph 

436 Heawood Graph with 14 nodes and 21 edges 

437 

438 References 

439 ---------- 

440 .. [1] https://en.wikipedia.org/wiki/Heawood_graph 

441 .. [2] https://mathworld.wolfram.com/HeawoodGraph.html 

442 .. [3] https://www.win.tue.nl/~aeb/graphs/Heawood.html 

443 

444 """ 

445 G = LCF_graph(14, [5, -5], 7, create_using) 

446 G.name = "Heawood Graph" 

447 return G 

448 

449 

450@nx._dispatchable(graphs=None, returns_graph=True) 

451def hoffman_singleton_graph(): 

452 """ 

453 Returns the Hoffman-Singleton Graph. 

454 

455 The Hoffman–Singleton graph is a symmetrical undirected graph 

456 with 50 nodes and 175 edges. 

457 All indices lie in ``Z % 5``: that is, the integers mod 5 [1]_. 

458 It is the only regular graph of vertex degree 7, diameter 2, and girth 5. 

459 It is the unique (7,5)-cage graph and Moore graph, and contains many 

460 copies of the Petersen Graph [2]_. 

461 

462 Returns 

463 ------- 

464 G : networkx Graph 

465 Hoffman–Singleton Graph with 50 nodes and 175 edges 

466 

467 Notes 

468 ----- 

469 Constructed from pentagon and pentagram as follows: Take five pentagons $P_h$ 

470 and five pentagrams $Q_i$ . Join vertex $j$ of $P_h$ to vertex $h·i+j$ of $Q_i$ [3]_. 

471 

472 References 

473 ---------- 

474 .. [1] https://blogs.ams.org/visualinsight/2016/02/01/hoffman-singleton-graph/ 

475 .. [2] https://mathworld.wolfram.com/Hoffman-SingletonGraph.html 

476 .. [3] https://en.wikipedia.org/wiki/Hoffman%E2%80%93Singleton_graph 

477 

478 """ 

479 G = nx.Graph() 

480 for i in range(5): 

481 for j in range(5): 

482 G.add_edge(("pentagon", i, j), ("pentagon", i, (j - 1) % 5)) 

483 G.add_edge(("pentagon", i, j), ("pentagon", i, (j + 1) % 5)) 

484 G.add_edge(("pentagram", i, j), ("pentagram", i, (j - 2) % 5)) 

485 G.add_edge(("pentagram", i, j), ("pentagram", i, (j + 2) % 5)) 

486 for k in range(5): 

487 G.add_edge(("pentagon", i, j), ("pentagram", k, (i * k + j) % 5)) 

488 G = nx.convert_node_labels_to_integers(G) 

489 G.name = "Hoffman-Singleton Graph" 

490 return G 

491 

492 

493@_raise_on_directed 

494@nx._dispatchable(graphs=None, returns_graph=True) 

495def house_graph(create_using=None): 

496 """ 

497 Returns the House graph (square with triangle on top) 

498 

499 The house graph is a simple undirected graph with 

500 5 nodes and 6 edges [1]_. 

501 

502 Parameters 

503 ---------- 

504 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

505 Graph type to create. If graph instance, then cleared before populated. 

506 

507 Returns 

508 ------- 

509 G : networkx Graph 

510 House graph in the form of a square with a triangle on top 

511 

512 References 

513 ---------- 

514 .. [1] https://mathworld.wolfram.com/HouseGraph.html 

515 """ 

516 G = nx.from_dict_of_lists( 

517 {0: [1, 2], 1: [0, 3], 2: [0, 3, 4], 3: [1, 2, 4], 4: [2, 3]}, 

518 create_using=create_using, 

519 ) 

520 G.name = "House Graph" 

521 return G 

522 

523 

524@_raise_on_directed 

525@nx._dispatchable(graphs=None, returns_graph=True) 

526def house_x_graph(create_using=None): 

527 """ 

528 Returns the House graph with a cross inside the house square. 

529 

530 The House X-graph is the House graph plus the two edges connecting diagonally 

531 opposite vertices of the square base. It is also one of the two graphs 

532 obtained by removing two edges from the pentatope graph [1]_. 

533 

534 Parameters 

535 ---------- 

536 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

537 Graph type to create. If graph instance, then cleared before populated. 

538 

539 Returns 

540 ------- 

541 G : networkx Graph 

542 House graph with diagonal vertices connected 

543 

544 References 

545 ---------- 

546 .. [1] https://mathworld.wolfram.com/HouseGraph.html 

547 """ 

548 G = house_graph(create_using) 

549 G.add_edges_from([(0, 3), (1, 2)]) 

550 G.name = "House-with-X-inside Graph" 

551 return G 

552 

553 

554@_raise_on_directed 

555@nx._dispatchable(graphs=None, returns_graph=True) 

556def icosahedral_graph(create_using=None): 

557 """ 

558 Returns the Platonic Icosahedral graph. 

559 

560 The icosahedral graph has 12 nodes and 30 edges. It is a Platonic graph 

561 whose nodes have the connectivity of the icosahedron. It is undirected, 

562 regular and Hamiltonian [1]_. 

563 

564 Parameters 

565 ---------- 

566 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

567 Graph type to create. If graph instance, then cleared before populated. 

568 

569 Returns 

570 ------- 

571 G : networkx Graph 

572 Icosahedral graph with 12 nodes and 30 edges. 

573 

574 See Also 

575 -------- 

576 tetrahedral_graph, cubical_graph, octahedral_graph, dodecahedral_graph 

577 

578 References 

579 ---------- 

580 .. [1] https://mathworld.wolfram.com/IcosahedralGraph.html 

581 """ 

582 G = nx.from_dict_of_lists( 

583 { 

584 0: [1, 5, 7, 8, 11], 

585 1: [2, 5, 6, 8], 

586 2: [3, 6, 8, 9], 

587 3: [4, 6, 9, 10], 

588 4: [5, 6, 10, 11], 

589 5: [6, 11], 

590 7: [8, 9, 10, 11], 

591 8: [9], 

592 9: [10], 

593 10: [11], 

594 }, 

595 create_using=create_using, 

596 ) 

597 G.name = "Platonic Icosahedral Graph" 

598 return G 

599 

600 

601@_raise_on_directed 

602@nx._dispatchable(graphs=None, returns_graph=True) 

603def krackhardt_kite_graph(create_using=None): 

604 """ 

605 Returns the Krackhardt Kite Social Network. 

606 

607 A 10 actor social network introduced by David Krackhardt 

608 to illustrate different centrality measures [1]_. 

609 

610 Parameters 

611 ---------- 

612 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

613 Graph type to create. If graph instance, then cleared before populated. 

614 

615 Returns 

616 ------- 

617 G : networkx Graph 

618 Krackhardt Kite graph with 10 nodes and 18 edges 

619 

620 Notes 

621 ----- 

622 The traditional labeling is: 

623 Andre=1, Beverley=2, Carol=3, Diane=4, 

624 Ed=5, Fernando=6, Garth=7, Heather=8, Ike=9, Jane=10. 

625 

626 References 

627 ---------- 

628 .. [1] Krackhardt, David. "Assessing the Political Landscape: Structure, 

629 Cognition, and Power in Organizations". Administrative Science Quarterly. 

630 35 (2): 342–369. doi:10.2307/2393394. JSTOR 2393394. June 1990. 

631 

632 """ 

633 G = nx.from_dict_of_lists( 

634 { 

635 0: [1, 2, 3, 5], 

636 1: [0, 3, 4, 6], 

637 2: [0, 3, 5], 

638 3: [0, 1, 2, 4, 5, 6], 

639 4: [1, 3, 6], 

640 5: [0, 2, 3, 6, 7], 

641 6: [1, 3, 4, 5, 7], 

642 7: [5, 6, 8], 

643 8: [7, 9], 

644 9: [8], 

645 }, 

646 create_using=create_using, 

647 ) 

648 G.name = "Krackhardt Kite Social Network" 

649 return G 

650 

651 

652@nx._dispatchable(graphs=None, returns_graph=True) 

653def moebius_kantor_graph(create_using=None): 

654 """ 

655 Returns the Moebius-Kantor graph. 

656 

657 The Möbius-Kantor graph is the cubic symmetric graph on 16 nodes. 

658 Its LCF notation is [5,-5]^8, and it is isomorphic to the generalized 

659 Petersen Graph GP(8, 3) [1]_. 

660 

661 Parameters 

662 ---------- 

663 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

664 Graph type to create. If graph instance, then cleared before populated. 

665 

666 Returns 

667 ------- 

668 G : networkx Graph 

669 Moebius-Kantor graph 

670 

671 References 

672 ---------- 

673 .. [1] https://en.wikipedia.org/wiki/M%C3%B6bius%E2%80%93Kantor_graph 

674 

675 """ 

676 G = LCF_graph(16, [5, -5], 8, create_using) 

677 G.name = "Moebius-Kantor Graph" 

678 return G 

679 

680 

681@_raise_on_directed 

682@nx._dispatchable(graphs=None, returns_graph=True) 

683def octahedral_graph(create_using=None): 

684 """ 

685 Returns the Platonic Octahedral graph. 

686 

687 The octahedral graph is the 6-node 12-edge Platonic graph having the 

688 connectivity of the octahedron [1]_. If 6 couples go to a party, 

689 and each person shakes hands with every person except his or her partner, 

690 then this graph describes the set of handshakes that take place; 

691 for this reason it is also called the cocktail party graph [2]_. 

692 

693 Parameters 

694 ---------- 

695 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

696 Graph type to create. If graph instance, then cleared before populated. 

697 

698 Returns 

699 ------- 

700 G : networkx Graph 

701 Octahedral graph 

702 

703 See Also 

704 -------- 

705 tetrahedral_graph, cubical_graph, dodecahedral_graph, icosahedral_graph 

706 

707 References 

708 ---------- 

709 .. [1] https://mathworld.wolfram.com/OctahedralGraph.html 

710 .. [2] https://en.wikipedia.org/wiki/Tur%C3%A1n_graph#Special_cases 

711 

712 """ 

713 G = nx.from_dict_of_lists( 

714 {0: [1, 2, 3, 4], 1: [2, 3, 5], 2: [4, 5], 3: [4, 5], 4: [5]}, 

715 create_using=create_using, 

716 ) 

717 G.name = "Platonic Octahedral Graph" 

718 return G 

719 

720 

721@nx._dispatchable(graphs=None, returns_graph=True) 

722def pappus_graph(): 

723 """ 

724 Returns the Pappus graph. 

725 

726 The Pappus graph is a cubic symmetric distance-regular graph with 18 nodes 

727 and 27 edges. It is Hamiltonian and can be represented in LCF notation as 

728 [5,7,-7,7,-7,-5]^3 [1]_. 

729 

730 Returns 

731 ------- 

732 G : networkx Graph 

733 Pappus graph 

734 

735 References 

736 ---------- 

737 .. [1] https://en.wikipedia.org/wiki/Pappus_graph 

738 """ 

739 G = LCF_graph(18, [5, 7, -7, 7, -7, -5], 3) 

740 G.name = "Pappus Graph" 

741 return G 

742 

743 

744@_raise_on_directed 

745@nx._dispatchable(graphs=None, returns_graph=True) 

746def petersen_graph(create_using=None): 

747 """ 

748 Returns the Petersen Graph. 

749 

750 The Peterson Graph is a cubic, undirected graph with 10 nodes and 15 edges [1]_. 

751 Julius Petersen constructed the graph as the smallest counterexample 

752 against the claim that a connected bridgeless cubic graph 

753 has an edge colouring with three colours [2]_. 

754 

755 Parameters 

756 ---------- 

757 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

758 Graph type to create. If graph instance, then cleared before populated. 

759 

760 Returns 

761 ------- 

762 G : networkx Graph 

763 Petersen Graph 

764 

765 References 

766 ---------- 

767 .. [1] https://en.wikipedia.org/wiki/Petersen_graph 

768 .. [2] https://www.win.tue.nl/~aeb/drg/graphs/Petersen.html 

769 """ 

770 G = nx.from_dict_of_lists( 

771 { 

772 0: [1, 4, 5], 

773 1: [0, 2, 6], 

774 2: [1, 3, 7], 

775 3: [2, 4, 8], 

776 4: [3, 0, 9], 

777 5: [0, 7, 8], 

778 6: [1, 8, 9], 

779 7: [2, 5, 9], 

780 8: [3, 5, 6], 

781 9: [4, 6, 7], 

782 }, 

783 create_using=create_using, 

784 ) 

785 G.name = "Petersen Graph" 

786 return G 

787 

788 

789@nx._dispatchable(graphs=None, returns_graph=True) 

790def generalized_petersen_graph(n, k, *, create_using=None): 

791 """ 

792 Returns the Generalized Petersen Graph GP(n,k). 

793 

794 The Generalized Peterson Graph consists of an outer cycle of n nodes 

795 connected to an inner circulant graph of n nodes, where nodes in the 

796 inner circulant are connected to their kth nearest neighbor [1]_ [2]_. 

797 A Generalized Petersen Graph is cubic with 2n nodes and 3n edges. 

798 

799 Some well known graphs are examples of Generalized Petersen Graphs such 

800 as the Petersen Graph GP(5, 2), the Desargues graph GP(10, 3), the 

801 Moebius-Kantor graph GP(8, 3), and the dodecahedron graph GP(10, 2). 

802 

803 Parameters 

804 ---------- 

805 n : int 

806 Number of nodes in the outer cycle and inner circulant. ``n >= 3`` is required. 

807 

808 k : int 

809 Neighbor to connect in the inner circulant. ``1 <= k <= n/2``. 

810 Note that some people require ``k < n/2`` but we and others allow equality. 

811 Also, ``k < n/2`` is equivalent to ``k <= floor((n-1)/2)`` 

812 

813 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

814 Graph type to create. If graph instance, then cleared before populated. 

815 

816 Returns 

817 ------- 

818 G : networkx Graph 

819 Generalized Petersen Graph n k 

820 

821 References 

822 ---------- 

823 .. [1] https://mathworld.wolfram.com/GeneralizedPetersenGraph.html 

824 .. [2] https://en.wikipedia.org/wiki/Generalized_Petersen_graph 

825 """ 

826 if n <= 2: 

827 raise NetworkXError(f"n >= 3 required. Got {n=}") 

828 if k < 1 or k > n / 2: 

829 raise NetworkXError(f" Got {n=} {k=}. Need 1 <= k <= n/2") 

830 

831 G = nx.cycle_graph(range(n), create_using=create_using) # u-nodes 

832 if G.is_directed(): 

833 raise NetworkXError("Directed Graph not supported in create_using") 

834 for i in range(n): 

835 G.add_edge(i, n + i) # add v-nodes and u to v edges 

836 G.add_edge(n + i, n + (i + k) % n) # edge from v_i to v_(i+k)%n 

837 

838 G.name = f"Generalized Petersen Graph GP({n}, {k})" 

839 return G 

840 

841 

842@nx._dispatchable(graphs=None, returns_graph=True) 

843def sedgewick_maze_graph(create_using=None): 

844 """ 

845 Return a small maze with a cycle. 

846 

847 This is the maze used in Sedgewick, 3rd Edition, Part 5, Graph 

848 Algorithms, Chapter 18, e.g. Figure 18.2 and following [1]_. 

849 Nodes are numbered 0,..,7 

850 

851 Parameters 

852 ---------- 

853 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

854 Graph type to create. If graph instance, then cleared before populated. 

855 

856 Returns 

857 ------- 

858 G : networkx Graph 

859 Small maze with a cycle 

860 

861 References 

862 ---------- 

863 .. [1] Figure 18.2, Chapter 18, Graph Algorithms (3rd Ed), Sedgewick 

864 """ 

865 G = empty_graph(0, create_using) 

866 G.add_nodes_from(range(8)) 

867 G.add_edges_from([[0, 2], [0, 7], [0, 5]]) 

868 G.add_edges_from([[1, 7], [2, 6]]) 

869 G.add_edges_from([[3, 4], [3, 5]]) 

870 G.add_edges_from([[4, 5], [4, 7], [4, 6]]) 

871 G.name = "Sedgewick Maze" 

872 return G 

873 

874 

875@nx._dispatchable(graphs=None, returns_graph=True) 

876def tetrahedral_graph(create_using=None): 

877 """ 

878 Returns the 3-regular Platonic Tetrahedral graph. 

879 

880 Tetrahedral graph has 4 nodes and 6 edges. It is a 

881 special case of the complete graph, K4, and wheel graph, W4. 

882 It is one of the 5 platonic graphs [1]_. 

883 

884 Parameters 

885 ---------- 

886 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

887 Graph type to create. If graph instance, then cleared before populated. 

888 

889 Returns 

890 ------- 

891 G : networkx Graph 

892 Tetrahedral Graph 

893 

894 See Also 

895 -------- 

896 cubical_graph, octahedral_graph, dodecahedral_graph, icosahedral_graph 

897 

898 References 

899 ---------- 

900 .. [1] https://en.wikipedia.org/wiki/Tetrahedron#Tetrahedral_graph 

901 

902 """ 

903 G = complete_graph(4, create_using) 

904 G.name = "Platonic Tetrahedral Graph" 

905 return G 

906 

907 

908@_raise_on_directed 

909@nx._dispatchable(graphs=None, returns_graph=True) 

910def truncated_cube_graph(create_using=None): 

911 """ 

912 Returns the skeleton of the truncated cube. 

913 

914 The truncated cube is an Archimedean solid with 14 regular 

915 faces (6 octagonal and 8 triangular), 36 edges and 24 nodes [1]_. 

916 The truncated cube is created by truncating (cutting off) the tips 

917 of the cube one third of the way into each edge [2]_. 

918 

919 Parameters 

920 ---------- 

921 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

922 Graph type to create. If graph instance, then cleared before populated. 

923 

924 Returns 

925 ------- 

926 G : networkx Graph 

927 Skeleton of the truncated cube 

928 

929 References 

930 ---------- 

931 .. [1] https://en.wikipedia.org/wiki/Truncated_cube 

932 .. [2] https://www.coolmath.com/reference/polyhedra-truncated-cube 

933 

934 """ 

935 G = nx.from_dict_of_lists( 

936 { 

937 0: [1, 2, 4], 

938 1: [11, 14], 

939 2: [3, 4], 

940 3: [6, 8], 

941 4: [5], 

942 5: [16, 18], 

943 6: [7, 8], 

944 7: [10, 12], 

945 8: [9], 

946 9: [17, 20], 

947 10: [11, 12], 

948 11: [14], 

949 12: [13], 

950 13: [21, 22], 

951 14: [15], 

952 15: [19, 23], 

953 16: [17, 18], 

954 17: [20], 

955 18: [19], 

956 19: [23], 

957 20: [21], 

958 21: [22], 

959 22: [23], 

960 }, 

961 create_using=create_using, 

962 ) 

963 G.name = "Truncated Cube Graph" 

964 return G 

965 

966 

967@nx._dispatchable(graphs=None, returns_graph=True) 

968def truncated_tetrahedron_graph(create_using=None): 

969 """ 

970 Returns the skeleton of the truncated Platonic tetrahedron. 

971 

972 The truncated tetrahedron is an Archimedean solid with 4 regular hexagonal faces, 

973 4 equilateral triangle faces, 12 nodes and 18 edges. It can be constructed by truncating 

974 all 4 vertices of a regular tetrahedron at one third of the original edge length [1]_. 

975 

976 Parameters 

977 ---------- 

978 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

979 Graph type to create. If graph instance, then cleared before populated. 

980 

981 Returns 

982 ------- 

983 G : networkx Graph 

984 Skeleton of the truncated tetrahedron 

985 

986 References 

987 ---------- 

988 .. [1] https://en.wikipedia.org/wiki/Truncated_tetrahedron 

989 

990 """ 

991 G = path_graph(12, create_using) 

992 G.add_edges_from([(0, 2), (0, 9), (1, 6), (3, 11), (4, 11), (5, 7), (8, 10)]) 

993 G.name = "Truncated Tetrahedron Graph" 

994 return G 

995 

996 

997@_raise_on_directed 

998@nx._dispatchable(graphs=None, returns_graph=True) 

999def tutte_graph(create_using=None): 

1000 """ 

1001 Returns the Tutte graph. 

1002 

1003 The Tutte graph is a cubic polyhedral, non-Hamiltonian graph. It has 

1004 46 nodes and 69 edges. 

1005 It is a counterexample to Tait's conjecture that every 3-regular polyhedron 

1006 has a Hamiltonian cycle. 

1007 It can be realized geometrically from a tetrahedron by multiply truncating 

1008 three of its vertices [1]_. 

1009 

1010 Parameters 

1011 ---------- 

1012 create_using : NetworkX graph constructor, optional (default=nx.Graph) 

1013 Graph type to create. If graph instance, then cleared before populated. 

1014 

1015 Returns 

1016 ------- 

1017 G : networkx Graph 

1018 Tutte graph 

1019 

1020 References 

1021 ---------- 

1022 .. [1] https://en.wikipedia.org/wiki/Tutte_graph 

1023 """ 

1024 G = nx.from_dict_of_lists( 

1025 { 

1026 0: [1, 2, 3], 

1027 1: [4, 26], 

1028 2: [10, 11], 

1029 3: [18, 19], 

1030 4: [5, 33], 

1031 5: [6, 29], 

1032 6: [7, 27], 

1033 7: [8, 14], 

1034 8: [9, 38], 

1035 9: [10, 37], 

1036 10: [39], 

1037 11: [12, 39], 

1038 12: [13, 35], 

1039 13: [14, 15], 

1040 14: [34], 

1041 15: [16, 22], 

1042 16: [17, 44], 

1043 17: [18, 43], 

1044 18: [45], 

1045 19: [20, 45], 

1046 20: [21, 41], 

1047 21: [22, 23], 

1048 22: [40], 

1049 23: [24, 27], 

1050 24: [25, 32], 

1051 25: [26, 31], 

1052 26: [33], 

1053 27: [28], 

1054 28: [29, 32], 

1055 29: [30], 

1056 30: [31, 33], 

1057 31: [32], 

1058 34: [35, 38], 

1059 35: [36], 

1060 36: [37, 39], 

1061 37: [38], 

1062 40: [41, 44], 

1063 41: [42], 

1064 42: [43, 45], 

1065 43: [44], 

1066 }, 

1067 create_using=create_using, 

1068 ) 

1069 G.name = "Tutte's Graph" 

1070 return G