def on_change_input(self, fgraph, app, i, old_r, new_r, reason):
            """
            app.inputs[i] changed from old_r to new_r.

            """
            if app == 'output':
                # app == 'output' is special key that means FunctionGraph is redefining which nodes are being
                # considered 'outputs' of the graph.
                pass
            else:
                # if app not in self.debug_all_apps: raise ProtocolError("change without import")

                # UPDATE self.clients
                self.clients[old_r][app] -= 1
                if self.clients[old_r][app] == 0:
                    del self.clients[old_r][app]

                self.clients.setdefault(new_r, {}).setdefault(app, 0)
                self.clients[new_r][app] += 1

                # UPDATE self.view_i, self.view_o
                for o_idx, i_idx_list in iteritems(getattr(app.op, 'view_map',
                                                           {})):
                    if len(i_idx_list) > 1:
                        # destroying this output invalidates multiple inputs
                        raise NotImplementedError()
                    i_idx = i_idx_list[0]
                    output = app.outputs[o_idx]
                    if i_idx == i:
                        if app.inputs[i_idx] is not new_r:
                            raise ProtocolError("wrong new_r on change")

                        self.view_i[output] = new_r

                        self.view_o[old_r].remove(output)
                        if not self.view_o[old_r]:
                            del self.view_o[old_r]

                        self.view_o.setdefault(new_r, OrderedSet()).add(output)

            self.stale_droot = True
dataset/ETHPy150Open rizar/attention-lvcsr/libs/Theano/theano/gof/destroyhandler.py/DestroyHandler.on_change_input/original