def replace_output_leaf_nodes( root: Output, node: Variable, leaf: Input, ): """ Replace ``Output`` objects that are used before they are defined with ``Input`` objects with same data. """ for dependency in node.dependencies: if dependency is root: # replace dependency reference with Input node node.remove_dependency_node(dependency) node.add_dependency_node(leaf) replace_output_leaf_nodes(root, dependency, leaf)
def _remove_nonresiduals(root: Variable): """ Remove dependence of root on expressions that are not residuals Parameters ---------- root: Variable Node that serves as root for DAG """ remove = [] for expr in root.dependencies: if expr.is_residual == False: remove.append(expr) for rem in remove: root.remove_dependency_node(rem)
def replace_input_leaf_nodes( node: Variable, leaves: Dict[str, Input], ): """ Replace ``Input`` objects that depend on previous subsystems with ``Input`` objects that do not. This is required for defining graphs for residuals so that ``ImplicitComponent`` objects do not include subsystems. """ for dependency in node.dependencies: if isinstance(dependency, Input): if len(dependency.dependencies) > 0: node.remove_dependency_node(dependency) if dependency._id in leaves.keys(): node.add_dependency_node(leaves[dependency._id]) else: leaf = Input(dependency.name, shape=dependency.shape, val=dependency.val) leaf._id = dependency._id node.add_dependency_node(leaf) leaves[dependency._id] = leaf replace_input_leaf_nodes(dependency, leaves)