code: def derived_solutions(self, solution=None):
          
          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)
docs: Returns all possible solutions based on the provide solution. This assumes
          that the given solution is incomplete.