'Return a list of ordered (:class:`OutputSignal`,
:class:`InputSignal`, weight) tuples that could be added to
the scheme between `source_node` and `sink_node`.
.. note:: This can depend on the links already in the scheme.'

def propose_links(self, source_node, sink_node):

    if ((source_node is sink_node) or self.is_ancestor(sink_node, source_node)):
        return []
    outputs = source_node.output_channels()
    inputs = sink_node.input_channels()
    links = self.find_links(None, None, sink_node)
    already_connected_sinks = [link.sink_channel for link in links if link.sink_channel.single]
    def weight(out_c, in_c):
        if (out_c.explicit or in_c.explicit):
            weight = 0
        else:
            type_checks = issubclass(name_lookup(out_c.type), name_lookup(in_c.type))
            assert (type_checks or out_c.dynamic)
            check = [type_checks, (in_c not in already_connected_sinks), bool(in_c.default), bool(out_c.default)]
            weights = [(2 ** i) for i in range(len(check), 0, (-1))]
            weight = sum([w for (w, c) in zip(weights, check) if c])
        return weight
    proposed_links = []
    for out_c in outputs:
        for in_c in inputs:
            if compatible_channels(out_c, in_c):
                proposed_links.append((out_c, in_c, weight(out_c, in_c)))
    return sorted(proposed_links, key=itemgetter((-1)), reverse=True)
