Module pacai.core.actions

Classes

class Actions

A collection of static methods for manipulating move actions. An action is just a Directions.

Expand source code
class Actions:
    """
    A collection of static methods for manipulating move actions.
    An action is just a `pacai.core.directions.Directions`.
    """

    # Directions
    _directions = {
        Directions.NORTH: (0, 1),
        Directions.SOUTH: (0, -1),
        Directions.EAST: (1, 0),
        Directions.WEST: (-1, 0),
        Directions.STOP: (0, 0),
    }

    _directionsAsList = sorted(list(_directions.items()))

    TOLERANCE = 0.001

    @staticmethod
    def reverseDirection(action):
        if (action == Directions.NORTH):
            return Directions.SOUTH
        elif (action == Directions.SOUTH):
            return Directions.NORTH
        elif (action == Directions.EAST):
            return Directions.WEST
        elif (action == Directions.WEST):
            return Directions.EAST
        else:
            return action

    @staticmethod
    def vectorToDirection(vector):
        dx, dy = vector
        if (dy > 0):
            return Directions.NORTH
        elif (dy < 0):
            return Directions.SOUTH
        elif (dx < 0):
            return Directions.WEST
        elif (dx > 0):
            return Directions.EAST
        else:
            return Directions.STOP

    @staticmethod
    def directionToVector(direction, speed = 1.0):
        dx, dy = Actions._directions[direction]
        return (dx * speed, dy * speed)

    @staticmethod
    def getPossibleActions(position, direction, walls):
        x, y = position
        x_int, y_int = int(x + 0.5), int(y + 0.5)

        # In between grid points, all agents must continue straight.
        if (abs(x - x_int) + abs(y - y_int) > Actions.TOLERANCE):
            return [direction]

        possible = []
        for dir, vec in Actions._directionsAsList:
            dx, dy = vec
            next_y = y_int + dy
            next_x = x_int + dx

            if (not walls[next_x][next_y]):
                possible.append(dir)

        return possible

    @staticmethod
    def getLegalNeighbors(position, walls):
        x, y = position
        x_int, y_int = int(x + 0.5), int(y + 0.5)

        neighbors = []
        for dir, vec in Actions._directionsAsList:
            dx, dy = vec
            next_x = x_int + dx
            if (next_x < 0 or next_x == walls.getWidth()):
                continue

            next_y = y_int + dy
            if (next_y < 0 or next_y == walls.getHeight()):
                continue

            if (not walls[next_x][next_y]):
                neighbors.append((next_x, next_y))

        return neighbors

    @staticmethod
    def getSuccessor(position, action):
        dx, dy = Actions.directionToVector(action)
        x, y = position
        return (x + dx, y + dy)

Class variables

var TOLERANCE

Static methods

def directionToVector(direction, speed=1.0)
def getLegalNeighbors(position, walls)
def getPossibleActions(position, direction, walls)
def getSuccessor(position, action)
def reverseDirection(action)
def vectorToDirection(vector)