def test_merge(): l = [4, 7, 2, 8, 4, 6, 9, 5, 5, 7, 3, 2, 8] l_sorted = sorted(l) l_left = LinkedList.from_list(sorted(l[:5])) l_right = LinkedList.from_list(sorted(l[5:])) ll = LinkedList.merge(l_left, l_right) assert len(ll) == len(l) for i, j in zip(ll, l_sorted): assert i == j
def rev_prune_order(self) -> LinkedList["BinaryDecisionTree"]: """Iterate over nodes from leaves inwards with each step minimizing the collapse loss""" assert not self.terminal, "Can't prune a terminal tree" if not self.left.terminal: left_order = self.left.rev_prune_order() else: left_order = Nil if not self.right.terminal: right_order = self.right.rev_prune_order() else: right_order = Nil return LinkedList( self, LinkedList.merge(left_order, right_order, key=lambda x: -x.loss_delta_if_collapsed), )