code: def _open_all_rings(self):
          
          self.unique_fragments.insert(0, self.mol_graph)
          for fragment in self.unique_fragments:
              ring_edges = fragment.find_rings()
              if ring_edges != []:
                  for bond in ring_edges[0]:
                      new_fragment = open_ring(fragment, [bond], self.opt_steps)
                      found = False
                      for unique_fragment in self.unique_fragments:
                          if unique_fragment.isomorphic_to(new_fragment):
                              found = True
                              break
                      if not found:
                          self.unique_fragments_from_ring_openings.append(new_fragment)
                          self.unique_fragments.append(new_fragment)
          # Finally, remove the principle molecule graph:
          self.unique_fragments.pop(0)
docs: Having already generated all unique fragments that did not require ring opening,
          now we want to also obtain fragments that do require opening. We achieve this by
          looping through all unique fragments and opening each bond present in any ring
          we find. We also temporarily add the principle molecule graph to self.unique_fragments
          so that its rings are opened as well.