def test_correct_path(database_dir):
    for pid in PuzzleManager.getPuzzleIds():
        p_cls = PuzzleManager.getPuzzleClass(pid)
        for variant in p_cls.test_variants:
            s_cls = PuzzleManager.getSolverClass(pid, test=True)
            solver = s_cls(p_cls.generateStartPosition(variant),
                           dir_path=database_dir)
            puzzle = p_cls.generateStartPosition(variant)

            solver.solve()

            if puzzle.numPositions:
                assert puzzle.numPositions >= len(
                    solver._remoteness
                ), "{} defined numPositions to be {} but solver calculated {}".format(
                    puzzle.name, puzzle.numPositions, len(solver))

            while puzzle.primitive() != PuzzleValue.SOLVABLE:
                assert (solver.getValue(puzzle) == PuzzleValue.SOLVABLE
                        ), "{} not SOLVABLE".format(
                            puzzle.toString(mode="minimal"))
                positions = generateMovePositions(puzzle)
                prev_remote = solver.getRemoteness(puzzle)
                b = False
                for pos in positions:
                    next_remote = solver.getRemoteness(pos[1])
                    if (next_remote != PuzzleValue.UNSOLVABLE
                            and next_remote < prev_remote):
                        puzzle = pos[1]
                        b = True
                if not b:
                    raise AssertionError(
                        "Puzzle {} has {} has no moves to reach solution".
                        format(puzzle.__class__.name,
                               puzzle.toString(mode="minimal")))
Example #2
0
def puzzles():
    response = [
        {
            "gameId": puzzle_id,
            "name"  : PuzzleManager.getPuzzleClass(puzzle_id).name,
            "status": check_available(puzzle_id)
        }
        for puzzle_id in PuzzleManager.getPuzzleIds() 
    ]
    return format_response(response)
Example #3
0
def puzzle_variant(puzzle_id, variant_id):
    validate(puzzle_id, variant_id)
    puzzle = PuzzleManager.getPuzzleClass(puzzle_id).generateStartPosition(variant_id)
    response = {
        "description": variant_id,
        "startPosition": puzzle.toString(mode="minimal"),
        "status": check_available(puzzle_id, variant_id),
        "variantId": variant_id
    }
    return format_response(response)
Example #4
0
def puzzle(puzzle_id):
    validate(puzzle_id)
    puzzlecls = PuzzleManager.getPuzzleClass(puzzle_id)
    response = {
        "puzzle_id": puzzle_id,
        "puzzle_name": puzzlecls.name,
        "author": puzzlecls.author,
        "description": puzzlecls.description,
        "date_created": puzzlecls.date_created,
        "variants": list(puzzlecls.variants)
    }
    return format_response(response)
Example #5
0
def validate(puzzleid=None, variantid=None, position=None):
    if puzzleid == None:
        raise ValueError("Nothing to validate")
    if not PuzzleManager.hasPuzzleId(puzzleid):
        abort(404, description="PuzzleId not found")
    if variantid != None:
        variants = PuzzleManager.getPuzzleClass(puzzleid).variants
        if variantid not in variants:
            abort(404, description="VariantId not found")
    if position != None:
        try:
            PuzzleManager.validate(puzzleid, variantid, position)
        except PuzzleException as e:
            abort(404, description=str(e))
Example #6
0
def server_start():
    # Check which Puzzles have been solved or not solved
    for p_cls in PuzzleManager.getPuzzleClasses():
        if p_cls.id not in puzzle_solved_variants:
            puzzle_solved_variants[p_cls.id] = {}

        variants = p_cls.variants

        for variant in variants:
            p_cls = PuzzleManager.getPuzzleClass(p_cls.id)
            s_cls = PuzzleManager.getSolverClass(p_cls.id, variant)

            puzzle = p_cls.generateStartPosition(variant)
            solver = s_cls(puzzle, dir_path=app.config['DATABASE_DIR'])

            if os.path.exists(solver.path): 
                puzzle_solved_variants[p_cls.id][variant] = solver
Example #7
0
def puzzle(puzzle_id):
    validate(puzzle_id)
    puzzlecls = PuzzleManager.getPuzzleClass(puzzle_id)
    response = {
        "gameId":           puzzle_id,
        "name":             puzzlecls.name,
        "author":           puzzlecls.auth,
        "description":      puzzlecls.desc,
        "date_created":     puzzlecls.date,
        "variants":         [{
            "description": variant_id,
            "startPosition": puzzlecls.generateStartPosition(variant_id).toString(),
            "status": check_available(puzzle_id, variant_id),
            "variantId": variant_id
        } for variant_id in puzzlecls.variants]
    }
    return format_response(response)
Example #8
0
def check_available(puzzle_id, variant=None):

    if puzzle_id not in puzzle_solved_variants:
        puzzle_solved_variants[puzzle_id] = {}
        if variant is None: return "unknown"
    elif len(puzzle_solved_variants[puzzle_id]) == 0:
        return "unavailable"
    elif variant is None or variant in puzzle_solved_variants[puzzle_id]:
        return "available"

    p_cls = PuzzleManager.getPuzzleClass(puzzle_id)
    s_cls = PuzzleManager.getSolverClass(p_cls.id, variant)

    puzzle = p_cls.generateStartPosition(variant)
    solver = s_cls(puzzle, dir_path=app.config['DATABASE_DIR'])

    import os
    if os.path.exists(solver.path): 
        puzzle_solved_variants[puzzle_id][variant] = solver
        return "available"
    return "not available"
Example #9
0
def puzzle_position(puzzle_id, variant_id, position):
    validate(puzzle_id, variant_id, position)
    puzzle = PuzzleManager.getPuzzleClass(puzzle_id).fromString(position)
    solver_cls = PuzzleManager.getSolverClass(puzzle_id, variant_id,
                                              app.config['TESTING'])
    s = solver_cls(puzzle, dir_path=app.config['DATABASE_DIR'])
    moves = generateMovePositions(puzzle)
    response = {
        "position": puzzle.toString(),
        "remoteness": s.getRemoteness(puzzle),
        "value": s.getValue(puzzle),
        "moves": {
            str(move[0]): {
                "position": move[1].toString(),
                "remoteness": s.getRemoteness(move[1]),
                "value": s.getValue(move[1])
            }
            for move in moves
        }
    }
    return format_response(response)
Example #10
0
def puzzle_position(puzzle_id, variant_id, position):
    validate(puzzle_id, variant_id, position)
    puzzle = PuzzleManager.getPuzzleClass(puzzle_id).fromString(position)
    s = puzzle_solved_variants[puzzle_id][variant_id]
    moves = generateMovePositions(puzzle)
    
    this_remoteness = s.getRemoteness(puzzle)

    response = {
        "position": puzzle.toString(mode="minimal"),
        "remoteness": this_remoteness 
        if this_remoteness != PuzzleValue.MAX_REMOTENESS
        else -1,
        "positionValue": s.getValue(puzzle),
    }
    move_attr = []
    for move in moves:
        next_remoteness = s.getRemoteness(move[1])
        move_attr.append(
            {
                "position": move[1].toString(mode="minimal"),
                "positionValue": s.getValue(move[1]),
                "move": str(move[0]),
                "moveValue": PuzzleValue.SOLVABLE
                if this_remoteness > next_remoteness
                else PuzzleValue.UNDECIDED
                if this_remoteness == next_remoteness
                else PuzzleValue.UNSOLVABLE,
                "deltaRemoteness": this_remoteness - next_remoteness,
                "remoteness": next_remoteness
                if next_remoteness != PuzzleValue.MAX_REMOTENESS
                else -1,
            }
        )
        response["moves"] = move_attr

    return format_response(response)
Example #11
0
                        "--auto",
                        action="store_true",
                        help="Puzzle plays itself")
    parser.add_argument("-l",
                        "--list",
                        action="store_true",
                        help="Lists puzzles and their ids")

    args = parser.parse_args()

    if not PuzzleManager.hasPuzzleId(args.puzzleid):
        print("Possible puzzles:")
        print("\n".join(PuzzleManager.getPuzzleIds()))
        raise Exception("Puzzleid is not recorded in PuzzleList")

    p_cls = PuzzleManager.getPuzzleClass(args.puzzleid)

    puzzle = None
    if args.variant:
        puzzle = p_cls.generateStartPosition(args.variant)
    if args.position:
        puzzle = p_cls.deserialize(args.position)
    if not puzzle:
        puzzle = p_cls()

    if args.info or args.auto:
        s_cls = PuzzleManager.getSolverClass(args.puzzleid, args.variant)
        solver = s_cls(puzzle)
    else:
        solver = None
Example #12
0
def puzzle_variant(puzzle_id, variant_id):
    validate(puzzle_id, variant_id)
    puzzle = PuzzleManager.getPuzzleClass(puzzle_id).generateStartPosition(
        variant_id)
    response = {"starting_pos": puzzle.toString()}
    return format_response(response)