def _find_unexecuted_comps(self):
        self._unexecuted = []
        self._pre_driver = None
        cgraph = self._depgraph.component_graph()
        wfcomps = set([c.name for c in self.driver.iteration_set()])
        wfcomps.add('driver')
        diff = set(cgraph.nodes()) - wfcomps
        self._pre_driver = None
        if diff:
            out_edges = nx.edge_boundary(cgraph, diff)
            pre = [u for u, v in out_edges]
            self._unexecuted = list(set(pre) - diff)

            if pre:
                ## If there are upstream comps that are not in any workflow,
                ## create a hidden top level driver called _pre_driver. That
                ## driver will be executed once per execution of the Assembly.

                # can't call add here for _pre_driver because that calls
                # config_changed...
                self._pre_driver = Driver()
                self._pre_driver.parent = self
                pre.append('driver') # run the normal top driver after running the 'pre' comps
                self._pre_driver.workflow.add(pre)
                self._pre_driver.name = '_pre_driver'
                self._pre_driver._iter_set = set(pre)
                self._pre_driver._full_iter_set = self.driver._full_iter_set.union(pre)
                self._depgraph.add_node('_pre_driver', comp=True, driver=True)
dataset/ETHPy150Open OpenMDAO/OpenMDAO-Framework/openmdao.main/src/openmdao/main/assembly.py/Assembly._find_unexecuted_comps/swapped operands of `-`