Beispiel #1
0
        def random_recurse(node, prev_solution):
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break

            if valid:

                for terminator in terminators:
                    if not terminator(solution):
                        valid = False
                        break

                if valid and node.children is None:
                    node.children = [
                        _SolutionNode(x, parent=node) for x in domain[0]
                    ]
                    return solution

                elif node.children == []:
                    return node

                else:
                    if node.children is None:
                        node.children = [
                            _SolutionNode(x, parent=node) for x in domain[0]
                        ]
                    result = random_recurse(
                        random.choice(node.children),
                        solution,
                    )
                    if isinstance(result, list):
                        return result
                    if isinstance(result, tuple):
                        solution, child = result
                        node.children.remove(child)
                        if node.children == []:
                            return solution, node
                        return solution
                    elif result is None:
                        return None
                    elif isinstance(result, type(node)):
                        node.children.remove(result)
                        if node.children == []:
                            return node
                        return None

            else:
                return node
        def random_recurse(node, prev_solution):
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break

            if valid:

                for terminator in terminators:
                    if not terminator(solution):
                        valid = False
                        break

                if valid and node.children is None:
                    node.children = [_SolutionNode(x, parent=node) 
                        for x in domain[0]]
                    return solution

                elif node.children == []:
                    return node

                else:
                    if node.children is None:
                        node.children = [_SolutionNode(x, parent=node) 
                            for x in domain[0]]
                    result = random_recurse(
                        random.choice(node.children),
                        solution,
                        )
                    if isinstance(result, list):
                        return result
                    if isinstance(result, tuple):
                        solution, child = result
                        node.children.remove(child)
                        if node.children == []:
                            return solution, node
                        return solution
                    elif result is None:
                        return None
                    elif isinstance(result, type(node)):
                        node.children.remove(result)
                        if node.children == []:
                            return node
                        return None

            else:
                return node
 def ordered_recurse(node, prev_solution, prev_depth=0):
     depth = prev_depth + 1
     solution = list(prev_solution) + [node.value]
     valid = True
     for constraint in constraints:
         if not constraint(solution):
             valid = False
             break
     if valid:
         if depth == domain_length:
             yield solution
         else:
             for x in domain[depth]:
                 child = _SolutionNode(x, parent=node, children=[])
                 node.append(child)
                 for y in ordered_recurse(child, solution, depth):
                     yield y
Beispiel #4
0
 def ordered_recurse(node, prev_solution, prev_depth=0):
     depth = prev_depth + 1
     solution = list(prev_solution) + [node.value]
     valid = True
     for constraint in constraints:
         if not constraint(solution):
             valid = False
             break
     if valid:
         if depth == domain_length:
             yield solution
         else:
             for x in domain[depth]:
                 child = _SolutionNode(x, parent=node, children=[])
                 node.append(child)
                 for y in ordered_recurse(child, solution, depth):
                     yield y
 def ordered_recurse(node, prev_solution):
     solution = list(prev_solution) + [node.value]
     valid = True
     for constraint in constraints:
         if not constraint(solution):
             valid = False
             break
     if valid:
         for terminator in terminators:
             if not terminator(solution):
                 valid = False
                 break
         if valid:
             yield solution
         for x in domain[0]:
             child = _SolutionNode(x, parent=node, children=[])
             node.append(child)
             for y in ordered_recurse(child, solution):
                 yield y
Beispiel #6
0
 def ordered_recurse(node, prev_solution):
     solution = list(prev_solution) + [node.value]
     valid = True
     for constraint in constraints:
         if not constraint(solution):
             valid = False
             break
     if valid:
         for terminator in terminators:
             if not terminator(solution):
                 valid = False
                 break
         if valid:
             yield solution
         for x in domain[0]:
             child = _SolutionNode(x, parent=node, children=[])
             node.append(child)
             for y in ordered_recurse(child, solution):
                 yield y
Beispiel #7
0
 def random_recurse(node, prev_solution, prev_depth=0):
     depth = prev_depth + 1
     solution = list(prev_solution) + [node.value]
     valid = True
     for constraint in constraints:
         if not constraint(solution):
             valid = False
             break
     if valid:
         if depth == domain_length:
             return solution, node
         else:
             if node.children is None:
                 node.children = [
                     _SolutionNode(x, parent=node)
                     for x in domain[depth]
                 ]
             elif node.children == []:
                 return node
             else:
                 result = random_recurse(
                     random.choice(node.children),
                     solution,
                     depth,
                 )
                 if isinstance(result, list):
                     return result
                 if isinstance(result, tuple):
                     solution, child = result
                     node.children.remove(child)
                     if node.children == []:
                         return solution, node
                     return solution
                 elif result is None:
                     return None
                 elif isinstance(result, type(node)):
                     node.children.remove(result)
                     if node.children == []:
                         return node
                     return None
     else:
         return node
 def random_recurse(node, prev_solution, prev_depth=0):
     depth = prev_depth + 1
     solution = list(prev_solution) + [node.value]
     valid = True
     for constraint in constraints:
         if not constraint(solution):
             valid = False
             break
     if valid:
         if depth == domain_length:
             return solution, node
         else:
             if node.children is None:
                 node.children = [_SolutionNode(x, parent=node)
                     for x in domain[depth]]
             elif node.children == []:
                 return node
             else:
                 result = random_recurse(
                     random.choice(node.children),
                     solution,
                     depth,
                     )
                 if isinstance(result, list):
                     return result
                 if isinstance(result, tuple):
                     solution, child = result
                     node.children.remove(child)
                     if node.children == []:
                         return solution, node
                     return solution
                 elif result is None:
                     return None
                 elif isinstance(result, type(node)):
                     node.children.remove(result)
                     if node.children == []:
                         return node
                     return None
     else:
         return node
    def __iter__(self):

        domain = self._domain
        domain_length = len(domain)
        constraints = self._constraints

        def random_recurse(node, prev_solution, prev_depth=0):
            depth = prev_depth + 1
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break
            if valid:
                if depth == domain_length:
                    return solution, node
                else:
                    if node.children is None:
                        node.children = [_SolutionNode(x, parent=node)
                            for x in domain[depth]]
                    elif node.children == []:
                        return node
                    else:
                        result = random_recurse(
                            random.choice(node.children),
                            solution,
                            depth,
                            )
                        if isinstance(result, list):
                            return result
                        if isinstance(result, tuple):
                            solution, child = result
                            node.children.remove(child)
                            if node.children == []:
                                return solution, node
                            return solution
                        elif result is None:
                            return None
                        elif isinstance(result, type(node)):
                            node.children.remove(result)
                            if node.children == []:
                                return node
                            return None
            else:
                return node

        def ordered_recurse(node, prev_solution, prev_depth=0):
            depth = prev_depth + 1
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break
            if valid:
                if depth == domain_length:
                    yield solution
                else:
                    for x in domain[depth]:
                        child = _SolutionNode(x, parent=node, children=[])
                        node.append(child)
                        for y in ordered_recurse(child, solution, depth):
                            yield y

        # randomized traversal
        if self.randomized:
            graphs = [_SolutionNode(x) for x in domain[0]]
            while graphs:
                result = random_recurse(random.choice(graphs), [], 0)
                if isinstance(result, list):
                    yield result
                elif isinstance(result, tuple):
                    solution, node = result
                    graphs.remove(node)
                    yield solution
                elif isinstance(result, _SolutionNode):
                    graphs.remove(result)

        # ordered traversal
        else:
            for x in domain[0]:
                node = _SolutionNode(x, children=[])
                for y in ordered_recurse(node, [], 0):
                    yield y
    def __iter__(self):
        domain = self._domain
        constraints = self._constraints
        terminators = self._terminators

        def ordered_recurse(node, prev_solution):
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break
            if valid:
                for terminator in terminators:
                    if not terminator(solution):
                        valid = False
                        break
                if valid:
                    yield solution
                for x in domain[0]:
                    child = _SolutionNode(x, parent=node, children=[])
                    node.append(child)
                    for y in ordered_recurse(child, solution):
                        yield y

        def random_recurse(node, prev_solution):
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break

            if valid:

                for terminator in terminators:
                    if not terminator(solution):
                        valid = False
                        break

                if valid and node.children is None:
                    node.children = [_SolutionNode(x, parent=node) 
                        for x in domain[0]]
                    return solution

                elif node.children == []:
                    return node

                else:
                    if node.children is None:
                        node.children = [_SolutionNode(x, parent=node) 
                            for x in domain[0]]
                    result = random_recurse(
                        random.choice(node.children),
                        solution,
                        )
                    if isinstance(result, list):
                        return result
                    if isinstance(result, tuple):
                        solution, child = result
                        node.children.remove(child)
                        if node.children == []:
                            return solution, node
                        return solution
                    elif result is None:
                        return None
                    elif isinstance(result, type(node)):
                        node.children.remove(result)
                        if node.children == []:
                            return node
                        return None

            else:
                return node

        if self.randomized:
            graphs = [_SolutionNode(x) for x in domain[0]]
            while graphs:
                result = random_recurse(random.choice(graphs), [])
                if isinstance(result, list):
                    yield result
                elif isinstance(result, tuple):
                    solution, node = result
                    graphs.remove(node)
                    yield solution
                elif isinstance(result, _SolutionNode):
                    graphs.remove(result)
        else:
            for x in domain[0]:
                node = _SolutionNode(x, children=[])
                for y in ordered_recurse(node, ()):
                    yield y
Beispiel #11
0
    def __iter__(self):

        domain = self._domain
        domain_length = len(domain)
        constraints = self._constraints

        def random_recurse(node, prev_solution, prev_depth=0):
            depth = prev_depth + 1
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break
            if valid:
                if depth == domain_length:
                    return solution, node
                else:
                    if node.children is None:
                        node.children = [
                            _SolutionNode(x, parent=node)
                            for x in domain[depth]
                        ]
                    elif node.children == []:
                        return node
                    else:
                        result = random_recurse(
                            random.choice(node.children),
                            solution,
                            depth,
                        )
                        if isinstance(result, list):
                            return result
                        if isinstance(result, tuple):
                            solution, child = result
                            node.children.remove(child)
                            if node.children == []:
                                return solution, node
                            return solution
                        elif result is None:
                            return None
                        elif isinstance(result, type(node)):
                            node.children.remove(result)
                            if node.children == []:
                                return node
                            return None
            else:
                return node

        def ordered_recurse(node, prev_solution, prev_depth=0):
            depth = prev_depth + 1
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break
            if valid:
                if depth == domain_length:
                    yield solution
                else:
                    for x in domain[depth]:
                        child = _SolutionNode(x, parent=node, children=[])
                        node.append(child)
                        for y in ordered_recurse(child, solution, depth):
                            yield y

        # randomized traversal
        if self.randomized:
            graphs = [_SolutionNode(x) for x in domain[0]]
            while graphs:
                result = random_recurse(random.choice(graphs), [], 0)
                if isinstance(result, list):
                    yield result
                elif isinstance(result, tuple):
                    solution, node = result
                    graphs.remove(node)
                    yield solution
                elif isinstance(result, _SolutionNode):
                    graphs.remove(result)

        # ordered traversal
        else:
            for x in domain[0]:
                node = _SolutionNode(x, children=[])
                for y in ordered_recurse(node, [], 0):
                    yield y
Beispiel #12
0
    def __iter__(self):
        domain = self._domain
        constraints = self._constraints
        terminators = self._terminators

        def ordered_recurse(node, prev_solution):
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break
            if valid:
                for terminator in terminators:
                    if not terminator(solution):
                        valid = False
                        break
                if valid:
                    yield solution
                for x in domain[0]:
                    child = _SolutionNode(x, parent=node, children=[])
                    node.append(child)
                    for y in ordered_recurse(child, solution):
                        yield y

        def random_recurse(node, prev_solution):
            solution = list(prev_solution) + [node.value]
            valid = True
            for constraint in constraints:
                if not constraint(solution):
                    valid = False
                    break

            if valid:

                for terminator in terminators:
                    if not terminator(solution):
                        valid = False
                        break

                if valid and node.children is None:
                    node.children = [
                        _SolutionNode(x, parent=node) for x in domain[0]
                    ]
                    return solution

                elif node.children == []:
                    return node

                else:
                    if node.children is None:
                        node.children = [
                            _SolutionNode(x, parent=node) for x in domain[0]
                        ]
                    result = random_recurse(
                        random.choice(node.children),
                        solution,
                    )
                    if isinstance(result, list):
                        return result
                    if isinstance(result, tuple):
                        solution, child = result
                        node.children.remove(child)
                        if node.children == []:
                            return solution, node
                        return solution
                    elif result is None:
                        return None
                    elif isinstance(result, type(node)):
                        node.children.remove(result)
                        if node.children == []:
                            return node
                        return None

            else:
                return node

        if self.randomized:
            graphs = [_SolutionNode(x) for x in domain[0]]
            while graphs:
                result = random_recurse(random.choice(graphs), [])
                if isinstance(result, list):
                    yield result
                elif isinstance(result, tuple):
                    solution, node = result
                    graphs.remove(node)
                    yield solution
                elif isinstance(result, _SolutionNode):
                    graphs.remove(result)
        else:
            for x in domain[0]:
                node = _SolutionNode(x, children=[])
                for y in ordered_recurse(node, ()):
                    yield y