def check_integrity(self): """ Call this for a diagnosis if things go awry. """ nodes = graph.ops(self.inputs, self.outputs) if self.apply_nodes != nodes: missing = nodes.difference(self.apply_nodes) excess = self.apply_nodes.difference(nodes) raise Exception( "The nodes are inappropriately cached. missing, in excess: ", missing, excess, ) for node in nodes: if node.fgraph is not self: raise Exception("Node should belong to the FunctionGraph.", node) for i, variable in enumerate(node.inputs): if variable.fgraph is not self: raise Exception( "Input of node should belong to the FunctionGraph.", variable, (node, i), ) if (node, i) not in variable.clients: raise Exception("Inconsistent clients list.", (node, i), variable.clients) variables = set(graph.variables(self.inputs, self.outputs)) if set(self.variables) != variables: missing = variables.difference(self.variables) excess = self.variables.difference(variables) raise Exception( "The variables are inappropriately cached. missing, in excess: ", missing, excess, ) for variable in variables: if (variable.owner is None and variable not in self.inputs and not isinstance(variable, graph.Constant)): raise Exception("Undeclared input.", variable) if variable.fgraph is not self: raise Exception("Variable should belong to the FunctionGraph.", variable) for node, i in variable.clients: if node == "output": if self.outputs[i] is not variable: raise Exception("Inconsistent clients list.", variable, self.outputs[i]) continue if node not in nodes: raise Exception("Client not in FunctionGraph.", variable, (node, i)) if node.inputs[i] is not variable: raise Exception("Inconsistent clients list.", variable, node.inputs[i])
def check_integrity(self): """ WRITEME Call this for a diagnosis if things go awry. """ nodes = graph.ops(self.inputs, self.outputs) if self.apply_nodes != nodes: missing = nodes.difference(self.apply_nodes) excess = self.apply_nodes.difference(nodes) raise Exception( "The nodes are inappropriately cached. missing, in excess: ", missing, excess) for node in nodes: if node.fgraph is not self: raise Exception("Node should belong to the FunctionGraph.", node) for i, variable in enumerate(node.inputs): if variable.fgraph is not self: raise Exception( "Input of node should belong to the FunctionGraph.", variable, (node, i)) if (node, i) not in variable.clients: raise Exception("Inconsistent clients list.", (node, i), variable.clients) variables = set(graph.variables(self.inputs, self.outputs)) if set(self.variables) != variables: missing = variables.difference(self.variables) excess = self.variables.difference(variables) raise Exception( "The variables are inappropriately cached. missing, in excess: ", missing, excess) for variable in variables: if (variable.owner is None and variable not in self.inputs and not isinstance(variable, graph.Constant)): raise Exception("Undeclared input.", variable) if variable.fgraph is not self: raise Exception("Variable should belong to the FunctionGraph.", variable) for node, i in variable.clients: if node == 'output': if self.outputs[i] is not variable: raise Exception("Inconsistent clients list.", variable, self.outputs[i]) continue if node not in nodes: raise Exception("Client not in FunctionGraph.", variable, (node, i)) if node.inputs[i] is not variable: raise Exception("Inconsistent clients list.", variable, node.inputs[i])
def test_ops(): r1, r2, r3, r4 = MyVariable(1), MyVariable(2), MyVariable(3), MyVariable(4) o1 = MyOp(r1, r2) o1.name = "o1" o2 = MyOp(r3, r4) o2.name = "o2" o3 = MyOp(r3, o1, o2) o3.name = "o3" res = ops([r1, r2], [o3]) res_list = list(res) assert res_list == [o3.owner, o2.owner, o1.owner]