Reproducing stk graphs ====================== In this simple script, I show that we can check for/compare to graphs from other sources, in particular :mod:`stk`. This is also a test to show we reproduce the known graphs that we expect to with our search. First, we define some fake building blocks to use to generate the iterator. .. testcode:: recipe7-test import logging import pathlib import rustworkx as rx import stk import cgexplore as cgx logger = logging.getLogger(__name__) bbs = { 1: stk.BuildingBlock("BrC", (stk.BromoFactory(),)), 2: stk.BuildingBlock("BrCCCCBr", (stk.BromoFactory(),)), 3: stk.BuildingBlock("BrCC(Br)CCBr", (stk.BromoFactory(),)), 4: stk.BuildingBlock("BrCC(Br)CCC(Br)CCBr", (stk.BromoFactory(),)), 5: stk.BuildingBlock("BrC1C(Br)C(Br)C(Br)C1Br", (stk.BromoFactory(),)), } And here is the translation list of :mod:`stk` graphs. As well as the list of known failures at this time. .. testcode:: recipe7-test knowns = { "6-2FG": (stk.cage.M3L3Triangle, {bbs[2]: 6}), "8-2FG": (stk.cage.M4L4Square, {bbs[2]: 8}), "2-3FG": (stk.cage.OnePlusOne, {bbs[3]: 2}), "4-3FG": (stk.cage.TwoPlusTwo, {bbs[3]: 4}), "x4-3FG": (stk.cage.M4L6Tetrahedron, {bbs[3]: 4}), "8-3FG": (stk.cage.FourPlusFour, {bbs[3]: 8}), "x8-3FG": (stk.cage.M4L4Tetrahedron, {bbs[3]: 8}), "2-3FG_3-2FG": (stk.cage.TwoPlusThree, {bbs[3]: 2, bbs[2]: 3}), "4-3FG_6-2FG": (stk.cage.FourPlusSix, {bbs[3]: 4, bbs[2]: 6}), "x4-3FG_6-2FG": ( stk.cage.M4L6TetrahedronSpacer, {bbs[3]: 4, bbs[2]: 6}, ), "xx4-3FG_6-2FG": (stk.cage.FourPlusSix2, {bbs[3]: 4, bbs[2]: 6}), "6-3FG_9-2FG": (stk.cage.SixPlusNine, {bbs[3]: 6, bbs[2]: 9}), "8-3FG_12-2FG": (stk.cage.EightPlusTwelve, {bbs[3]: 8, bbs[2]: 12}), "20-3FG_30-2FG": (stk.cage.TwentyPlusThirty, {bbs[3]: 20, bbs[2]: 30}), "1-4FG_2-2FG": (cgx.topologies.UnalignedM1L2, {bbs[4]: 1, bbs[2]: 2}), "2-4FG_4-2FG": (stk.cage.M2L4Lantern, {bbs[4]: 2, bbs[2]: 4}), "x2-4FG_4-2FG": (stk.cage.TwoPlusFour, {bbs[4]: 2, bbs[2]: 4}), "3-4FG_6-2FG": (stk.cage.M3L6, {bbs[4]: 3, bbs[2]: 6}), "x3-4FG_6-2FG": (stk.cage.ThreePlusSix, {bbs[4]: 3, bbs[2]: 6}), "4-4FG_8-2FG": (cgx.topologies.CGM4L8, {bbs[4]: 4, bbs[2]: 8}), "x4-4FG_8-2FG": (cgx.topologies.M4L82, {bbs[4]: 4, bbs[2]: 8}), "xx4-4FG_8-2FG": (stk.cage.FourPlusEight, {bbs[4]: 4, bbs[2]: 8}), "xxx4-4FG_8-2FG": (stk.cage.M4L8, {bbs[4]: 4, bbs[2]: 8}), "5-4FG_10-2FG": (stk.cage.FivePlusTen, {bbs[4]: 5, bbs[2]: 10}), "6-4FG_12-2FG": (stk.cage.M6L12Cube, {bbs[4]: 6, bbs[2]: 12}), "x6-4FG_12-2FG": (cgx.topologies.M6L122, {bbs[4]: 6, bbs[2]: 12}), "xx6-4FG_12-2FG": (stk.cage.SixPlusTwelve, {bbs[4]: 6, bbs[2]: 12}), "8-4FG_16-2FG": (stk.cage.EightPlusSixteen, {bbs[4]: 8, bbs[2]: 16}), "x8-4FG_16-2FG": (cgx.topologies.M8L162, {bbs[4]: 8, bbs[2]: 16}), "10-4FG_20-2FG": (stk.cage.TenPlusTwenty, {bbs[4]: 10, bbs[2]: 20}), "12-4FG_24-2FG": (cgx.topologies.CGM12L24, {bbs[4]: 12, bbs[2]: 24}), "x12-4FG_24-2FG": (stk.cage.M12L24, {bbs[4]: 12, bbs[2]: 24}), "24-4FG_48-2FG": (stk.cage.M24L48, {bbs[4]: 24, bbs[2]: 48}), "6-4FG_8-3FG": (stk.cage.SixPlusEight, {bbs[4]: 6, bbs[3]: 8}), "x6-4FG_8-3FG": (stk.cage.M8L6Cube, {bbs[4]: 6, bbs[3]: 8}), "3-4FG_8-3FG": (stk.cage.M6L2L3Prism, {bbs[4]: 3, bbs[3]: 8}), "12-5FG_30-2FG": (stk.cage.TwelvePlusThirty, {bbs[5]: 12, bbs[2]: 30}), } known_failures = ( "3-4FG_8-3FG", "20-3FG_30-2FG", "24-4FG_48-2FG", "12-5FG_30-2FG", "12-4FG_24-2FG", "x12-4FG_24-2FG", ) And so all we do now is iterate through and check for isomoprhism of all the graphs in our iterator. .. testcode:: recipe7-test for known_, (tfun, bbs) in knowns.items(): found = False stk_topology_code, _ = cgx.scram.get_stk_topology_code(tfun) iterator = cgx.scram.TopologyIterator(building_block_counts=bbs) if not iterator.graph_exists(): logger.info("%s graph not built yet", known_) if known_ in known_failures: logger.info("----> it is ok though, we knew about this one!") continue for tc in iterator.yield_graphs(): if rx.is_isomorphic(stk_topology_code.get_graph(), tc.get_graph()): found = True break if found: logger.info( "found stk graph for %s in the %s graphs", known_, iterator.count_graphs(), ) else: logger.info( "not found stk graph for %s in the %s graphs", known_, iterator.count_graphs(), ) if known_ in known_failures: logger.info("----> it is ok though, we knew about this one!") .. testcode:: recipe7-test :hide: for known_, (tfun, bbs) in knowns.items(): found = False string = known_.replace("x", "") if "x" in known_ else known_ stk_topology_code, _ = cgx.scram.get_stk_topology_code(tfun) iterator = cgx.scram.TopologyIterator( building_block_counts=bbs, graph_type=string, graph_set="rxx", ) if not iterator.graph_exists(): if known_ not in known_failures: assert False continue for tc in iterator.yield_graphs(): if rx.is_isomorphic(stk_topology_code.get_graph(), tc.get_graph()): found = True break if not found and known_ not in known_failures: assert False .. raw:: html ⬇️ Download Python Script