Returns all possible solutions based on the provide solution. This assumes
        that the given solution is incomplete.

def derived_solutions(self, solution=None):
        """Returns all possible solutions based on the provide solution. This assumes
        that the given solution is incomplete.

        """
        solution = solution or Solution()
        used_variables = solution.keys()
        unused_variables = (v for v in self._variable_expand_order if v not in used_variables)
        for var in unused_variables:
            for value in self._vars[var]:
                yield Solution({var: value}, solution)