def GenerateMaze(self, width, height, weights=None):
        if weights is None:
            use_weights = False
            weights = [1, 1, 1, 1]
        else:
            use_weights = True
        theMaze = Maze()
        theMaze.SetDimensions(width, height)

        # REWRITTEN AS OF 6/23
        # I wrote this from a cell list which prevented me from using bias terms and weights. I've rectified that
        used_cells = np.zeros([height, width])
        walls = []

        # choose a start cell
        current_cell = [
            np.random.randint(0, theMaze.height),
            np.random.randint(0, theMaze.width)
        ]
        used_cells[current_cell[0], current_cell[1]] = 1

        # create adjacency list
        borders = theMaze.GetBorders(current_cell)
        for index in xrange(len(borders)):
            if borders[index] == 0:
                new_cell = deepcopy(current_cell)
                if index == 0:
                    new_cell[0] -= 1
                elif index == 1:
                    new_cell[1] += 1
                elif index == 2:
                    new_cell[0] += 1
                elif index == 3:
                    new_cell[1] -= 1
                walls.append([weights[index], current_cell, new_cell, index])

        # print "FIRST SET", adjacent_cells, maze_cells
        while len(walls) > 0:
            # choose a wall to open
            if use_weights == False:
                wall_idx = randint(0, len(walls) - 1)
                wall = walls[wall_idx]
                walls.pop(wall_idx)

            else:
                index, wall = ValueFromHeap(walls)

            if self.mVerbosity > 0:
                print "active wall (weight, from, to, direction): ", wall

            # ensure the cell this wall refers to is not in the maze
            prior_cell = wall[1]
            current_cell = wall[2]

            if used_cells[current_cell[0], current_cell[1]] == 1:
                if self.mVerbosity > 0:
                    print "    to cell in maze"
                continue

            used_cells[current_cell[0], current_cell[1]] = 1

            # open the wall
            wallToOpen = wall[3]
            rWallToOpen = (wallToOpen + 2) % 4
            theMaze.cells[prior_cell[0], prior_cell[1], wallToOpen] = 1
            theMaze.cells[current_cell[0], current_cell[1], rWallToOpen] = 1

            # create adjacency list
            borders = theMaze.GetBorders(current_cell)
            for index in xrange(len(borders)):
                if borders[index] == 0:
                    new_cell = deepcopy(current_cell)
                    if index == 0:
                        new_cell[0] -= 1
                    elif index == 1:
                        new_cell[1] += 1
                    elif index == 2:
                        new_cell[0] += 1
                    elif index == 3:
                        new_cell[1] -= 1
                    walls.append(
                        [weights[index], current_cell, new_cell, index])

        theMaze.end_cell = [0, 0]
        theMaze.start_cell = [theMaze.height - 1, theMaze.width - 1]
        return theMaze
    def GenerateMaze(self, width, height, weights=None):
        # force weights to null for now

        if weights is None:
            use_weights = False
            weights = [1, 1, 1, 1]
        else:
            use_weights = True

        theMaze = Maze()
        theMaze.SetDimensions(width, height)

        # REWRITTEN AS OF 6/23
        used_cells = np.zeros([height, width])
        walls = []

        # depth first starts at top left
        current_cell = [0, 0]
        used_cells[current_cell[0], current_cell[1]] = 1

        # create adjacency list
        next_walls = []
        borders = theMaze.GetBorders(current_cell)
        for index in xrange(len(borders)):
            if borders[index] == 0:
                new_cell = deepcopy(current_cell)
                if index == 0:
                    new_cell[0] -= 1
                elif index == 1:
                    new_cell[1] += 1
                elif index == 2:
                    new_cell[0] += 1
                elif index == 3:
                    new_cell[1] -= 1
                next_walls.append(
                    [weights[index], current_cell, new_cell, index])

        if not use_weights:
            while len(next_walls) > 0:
                wall_idx = randint(0, len(next_walls) - 1)
                wall = next_walls[wall_idx]
                next_walls.pop(wall_idx)
                walls.append(wall)
        else:
            next_walls_heaped = []
            while len(next_walls) > 0:
                index, wall = ValueFromHeap(next_walls)
                next_walls_heaped.append(wall)
            next_walls_heaped.reverse()
            walls += next_walls_heaped
        # print "FIRST SET", adjacent_cells, maze_cells
        while len(walls) > 0:
            wall = walls[-1]
            walls = walls[:-1]

            if self.mVerbosity > 0:
                print "active wall (weight, from, to, direction): ", wall

            # ensure the cell this wall refers to is not in the maze
            prior_cell = wall[1]
            current_cell = wall[2]

            if used_cells[current_cell[0], current_cell[1]] == 1:
                if self.mVerbosity > 0:
                    print "    to cell in maze"
                continue

            used_cells[current_cell[0], current_cell[1]] = 1

            # open the wall
            wallToOpen = wall[3]
            rWallToOpen = (wallToOpen + 2) % 4
            theMaze.cells[prior_cell[0], prior_cell[1], wallToOpen] = 1
            theMaze.cells[current_cell[0], current_cell[1], rWallToOpen] = 1

            # create adjacency list
            next_walls = []
            borders = theMaze.GetBorders(current_cell)
            for index in xrange(len(borders)):
                if borders[index] == 0:
                    new_cell = deepcopy(current_cell)
                    if index == 0:
                        new_cell[0] -= 1
                    elif index == 1:
                        new_cell[1] += 1
                    elif index == 2:
                        new_cell[0] += 1
                    elif index == 3:
                        new_cell[1] -= 1
                    next_walls.append(
                        [weights[index], current_cell, new_cell, index])

            if not use_weights:
                while len(next_walls) > 0:
                    wall_idx = randint(0, len(next_walls) - 1)
                    wall = next_walls[wall_idx]
                    next_walls.pop(wall_idx)
                    walls.append(wall)
            else:
                next_walls_heaped = []
                while len(next_walls) > 0:
                    index, wall = ValueFromHeap(next_walls)
                    next_walls_heaped.append(wall)
                next_walls_heaped.reverse()
                walls += next_walls_heaped

        theMaze.end_cell = [0, 0]
        theMaze.start_cell = [theMaze.height - 1, theMaze.width - 1]
        return theMaze