Beispiel #1
0
class TestTree(unittest.TestCase):
    def setUp(self):
        self.tree = Tree(5)

    def test_init(self):
        self.assertEqual(self.tree.root.value, 5)

    def test_add_child(self):
        self.assertTrue(self.tree.add_child(5, 4))
        self.assertFalse(self.tree.add_child(6, 3))

    def test_find(self):
        self.tree.add_child(5, 4)
        self.tree.add_child(4, 3)
        self.assertTrue(self.tree.find(4))
        self.assertFalse(self.tree.find(6))

    def test_height(self):
        self.tree.add_child(5, 4)
        self.tree.add_child(4, 3)
        self.assertEqual(self.tree.height(), 2)

    def test_tree_levels(self):
        self.tree.add_child(5, 4)
        self.tree.add_child(4, 3)
        self.assertEqual(self.tree.tree_levels(), [[5], [4], [3]])

    def test_DFS(self):
        self.tree.add_child(5, 4)
        self.tree.add_child(5, 7)
        self.tree.add_child(7, 8)
        self.tree.add_child(4, 3)
        self.tree.add_child(4, 6)
        self.assertEqual(self.tree.DFS(self.tree.root), [5, 7, 8, 4, 6, 3])
Beispiel #2
0
    def test_exceptions(self):
        with self.assertRaises(ValueError):
            t = Tree("t", "T")
            t.insert('t', "T")

        with self.assertRaises(KeyError):
            t = Tree('t', "T")
            t.find('z')        
Beispiel #3
0
 def test_tree_find(self):
     'Verify find method, with data and without'
     t = Tree('D')
     for c, i in (('F', [6,7,8]),('C', 3), ('G', dict(one=1, two=2)), ('A', 1), ('E', 5), ('B', 2)):
         t.insert(c, i)
     self.assertEqual(t.find('D'), None)
     self.assertEqual(t.find('A'), 1)
     self.assertEqual(t.find('F'), [6,7,8])
     self.assertEqual(t.find('G'), {'one':1, 'two':2})
     self.assertRaises(KeyError, t.find, 'Z')
Beispiel #4
0
	def arvoreminima(self):
		"""
			Opera apenas em grafos não-direcionados e conectados
			{"arvoreminima":{"arestas":[(1,2),(2,0),(1,0)], "custo":21}}
		"""

		copy = self.matriz
		edges = []
		menor = [-1,-1,-1]

		teste = False

		out = []
		weight = ''
		for k in range (self.edge/2):
			for i in range (self.size):
				for j in range (i):
					if (copy[i][j] > -1):
						if (int(menor[2]) > int(-1)):
							if (int(copy[i][j]) < int(menor[2])):
								menor = [j,i,copy[i][j]]
								teste = True
						else:
							menor = [j,i,copy[i][j]]
							teste = True

			copy[menor[1]][menor[0]] = -1
			edges += [menor]
			menor = [-1,-1,-1]

		if teste:
			connected = Tree(self.size)
			aux = edges.pop(0)

			weight = aux[2]
			tree = [[aux[0],aux[1]]]

			while (len(tree) < self.size - 1):
				aux = edges.pop(0)

				if (connected.find(aux[0]) != connected.find(aux[1])):
					weight += aux[2]
					tree += [[aux[0],aux[1]]]
					connected.merge(aux[0],aux[1])

			out = "["
			for i in range(len(tree)):
				out += str("(")+str(tree[i][0])+","+str(tree[i][1])+")"
				if (i < (len(tree) - 1)):
					out += str(',')
			out += "]"

		return "{\"arvoreminima\":{\"arestas\":"+str(out)+", \"custo\":"+str(weight)+"}}"
Beispiel #5
0
def test_find2():
    tree = Tree()
    l = [38, 13, 51, 10, 25, 40, 84, 12, 37, 66, 89, 95]
    length = len(l)
    while len(l) > 0:
        key = l.pop(0)
        value = chr(key)
        tree.insert(key, value)

    assert tree.find(100) == None
    assert tree.find(50) == None
    assert tree.find(15) == None
    assert tree.find(39) == None
Beispiel #6
0
def dfs(board_state):
    'Uses Depth First Search to search for solution'

    startTime = time.time()
    tree = Tree()
    tree.add(Node(board_state, None, None))
    tree.frontier.append(tree.find(board_state))

    result = None

    while tree.has_frontier():
        current_node = tree.frontier.pop(0)

        if current_node.reached_goal():
            tree.result = current_node
            break

        children = current_node.children()

        for child in children[::-1]:
            if tree.already_added(child) == False:
                tree.add(child)
                tree.frontier.insert(0, child)

        tree.expanded.append(current_node)

    elapsed_time = time.time() - startTime

    tree.total_time = elapsed_time
    build_file(tree)
Beispiel #7
0
def test_remove():
    tree = Tree()
    l = [38, 13, 51, 10, 25, 40, 84, 12, 37, 66, 89, 95]
    length = len(l)
    while len(l) > 0:
        key = l.pop(0)
        value = chr(key)
        tree.insert(key, value)

    tree.remove(38)
    assert tree.root.key == 37
    assert tree.find(38) == None

    tree.remove(89)
    print(tree.in_order())
    p, c = tree.find_parent_croot(95)
    assert p.key == 84
    assert c.key == 95

    tree.remove(13)
    print(tree.in_order())
    p, c = tree.find_parent_croot(10)
    assert p.key == 12
    assert c.key == 10

    tree.remove(10)
    print(tree.in_order())
    tree.remove(15)
    print(tree.in_order())
    p, c = tree.find_parent_croot(25)
    assert p.key == 12
    assert c.key == 25
Beispiel #8
0
def ast(board_state):
    'Uses A* to search for solution'

    startTime = time.time()
    tree = Tree()
    tree.add(NodeHeuristic(board_state, None, None))
    tree.frontier = Queue.PriorityQueue()
    tree.frontier.put(tree.find(board_state))

    result = None

    while tree.frontier.empty() == False:
        current_node = tree.frontier.get()

        if current_node.reached_goal():
            tree.result = current_node
            break

        children = current_node.children()

        for child in children:
            if tree.already_added(child) == False:
                tree.add(child)
                tree.frontier.put(child)

        tree.expanded.append(current_node)

    elapsed_time = time.time() - startTime

    tree.total_time = elapsed_time
    build_file(tree)
Beispiel #9
0
def test_find_returns_node_with_the_specified_value_when_such_exists():
    t = Tree("a")
    t.add_child("b")
    t.add_child("c").add_child("d").add_child("e")

    node = t.find("d")

    assert_that(node.children[0].value, is_("e"))
  def test_does_not_find_key_in_the_tree_with_depth_two(self):
    root_node = Node([1, 3, 8])
    target_node = Node([5])
    root_node.add_right_middle_child(target_node)
    tree = Tree(root_node)
    result = tree.find(6)

    self.assertEqual(result, None)
Beispiel #11
0
def test_find():
    dict_depth = 7
    rnd_tree = Tree(get_random_dict(dict_depth))

    rnd_path = (get_random_path(rnd_tree.root))
    request = get_mixed_request(rnd_path)
    result = rnd_tree.find(request)
    # ToDo Fix error with depth level (at now: -1 level)
    pass
  def test_finds_key_in_the_tree_with_depth_two_with_two_keys_at_leaf(self):
    root_node = Node([1, 3, 8])
    target_node = Node([9])
    other_node = Node([5])
    root_node.add_right_middle_child(other_node)
    root_node.add_right_child(target_node)
    tree = Tree(root_node)
    result = tree.find(9)

    self.assertEqual(result, 9)
Beispiel #13
0
class Test(unittest.TestCase):


    def setUp(self):
        self.test = Tree("D", ord("D"))
        for c in "BJQKFAC":
            self.test.insert(c, ord(c)) 


    def testTree(self):
        self.assertEqual(self.test.answer(70), 'F')
        self.assertEqual(self.test.answer(81), 'Q')
        
    def testExceptions(self):
        self.assertRaises(KeyError, self.test.find(99))
Beispiel #14
0
def test_find():
    l = list()
    for i in range(97, 107):
        l.append(i)

    tree = Tree()
    random.shuffle(l)
    while len(l) > 0:
        key = l.pop()
        value = chr(key)
        tree.insert(key, value)

    for i in range(97, 107):
        key = i
        value = chr(key)
        croot = tree.find(key)
        assert croot.value == value
  def test_cannot_find_a_key_in_the_tree(self):
    root_node = Node([1, 3, 8])
    tree = Tree(root_node)
    result = tree.find(5)

    self.assertEqual(result, None)
Beispiel #16
0
 def test_find(self):
     t = Tree('t', "T")
     observed = t.find('t')
     expected = 'T'
     self.assertEqual(observed, expected)
  def test_finds_key_in_the_tree_with_depth_one_and_one_key_root(self):
    root_node = Node([1])
    tree = Tree(root_node)
    result = tree.find(1)

    self.assertEqual(result, 1)
Beispiel #18
0
class Tasks:
    ROOT_TASK_ID = 0

    def __init__(self, fileName=None, task_dir=None):
        try:
            if fileName is not None:
                task_dir = task_dir if task_dir is not None else ''
                self.fileName = task_dir + fileName
                self.fileDB = FileDB(self.fileName)
                self.taskObj = self.read()
            else:
                self.taskObj = Tree(Tasks.ROOT_TASK_ID)
                self.fileName = None
        except:
            self.taskObj = Tree(Tasks.ROOT_TASK_ID)

    def createId(self):
        return str(random.randint(1, 20000))

# create a tree obj based on the input prop and val and insert

    def addTask(self, taskId=None, parentTaskId=None, prop=None):
        if taskId is None:
            taskId = self.createId()
        elif taskId <= Tasks.ROOT_TASK_ID:
            raise Exception('Cannot create task with taskId ' + str(taskId))

        if parentTaskId is None:
            parentTaskId = Tasks.ROOT_TASK_ID
        elif parentTaskId < Tasks.ROOT_TASK_ID:
            raise Exception('Cannot create task with parentTaskId ' +
                            str(parentTaskId))

        if prop is None:
            prop = {}

        deb('Tasks: addTask- creating new task with id =' + str(taskId) +
            ', parent task id =' + str(parentTaskId))

        prop['completed'] = 0
        task = Tree(id=taskId, prop=prop)
        deb('Tasks: addTask- created task object. ' +
            'Now inserting it into the tree')
        self.taskObj.insert(task, parentTaskId)

        # update the file
        self.write()

    # create a tasks object from a dictionary
    # we expect the dictionary to be in a certain way.
    # Need some checks in place to make sure that is obeyed
    def dictToTask(self, inputDict):
        if inputDict == {}:
            raise Exception('could not read Json file, or the file was empty!')

        resDict = {}
        parentId = ''
        for key, value in inputDict.items():
            deb('dictToTask: key is = ' + str(key))
            deb('dictToTask: value is = ' + str(value))
            t = Tree(id=key)
            # if resDict has the object already use that
            if key in resDict:
                t = resDict[key]

            # set the other properties
            t.prop = value['prop']
            if str(value['parentId']) != str(key):
                deb('dictToTask: ParentId = ' + str(value['parentId']) +
                    ', key:' + str(key))

                if value['parentId'] in resDict:
                    deb('dictToTask: key=' + str(key) +
                        ', parentId in resDict. ParentId:' +
                        str(value['parentId']))
                    parent = resDict[value['parentId']]
                    t.parent = parent
                    parent.children.append(t)
                else:
                    deb('dictToTask: key=' + str(key) +
                        ', parentId not in resDict. ParentId:' +
                        str(value['parentId']))
                    pTree = Tree(value['parentId'])
                    t.parent = pTree
                    pTree.children.append(t)
                    resDict[value['parentId']] = pTree
            else:
                deb('dictToTask: found root. ParentId = ' +
                    str(value['parentId']) + ', key:' + str(key))
                t.parent = t
                parentId = value['parentId']

            resDict[key] = t

        if parentId == '':
            raise Exception('no top level task present in the json file')
        return resDict[parentId]

    # read from json file.
    def read(self):
        if self.fileName is None:
            return
        data = self.fileDB.readAll()
        return self.dictToTask(data)

    # create an object dictionary
    # similar to a serialization operation
    def taskToDict(self, tasks):
        if tasks is None:
            return {}
        deb('Tasks: createDict for taskId= ' + str(tasks.id))

        resDict = {}
        tasksDict = {}
        tasksDict['children'] = [cObj.id for cObj in tasks.children] \
                                if tasks.children is not None else []
        tasksDict['parentId'] = tasks.parent.id if tasks.parent is not None \
                                else Tasks.ROOT_TASK_ID
        tasksDict['prop'] = tasks.prop
        if 'completed' not in tasksDict['prop']:
            tasksDict['prop']['completed'] = 0
        resDict[tasks.id] = tasksDict

        if tasks.children is not None:
            for childObj in tasks.children:
                cDict = self.taskToDict(childObj)
                resDict.update(cDict)
        deb('Tasks: createDict- taskId' + str(tasks.id) +
            ', final dictionary is:' + str(resDict))
        return resDict

    def write(self):
        if self.fileName is None:
            return
        taskDict = self.taskToDict(self.taskObj)
        self.fileDB.writeAll(taskDict)

#update a task

    def updateTask(self,
                   taskId,
                   parentId=None,
                   prop=None,
                   updateSubtasks=False):
        if taskId == Tasks.ROOT_TASK_ID:
            raise Exception('Cannot update task with taskId: ' + taskId)

        # raise an exception if not found
        currTask = self.taskObj.find(taskId)
        if currTask is None:
            raise Exception('Cannot find task with task id = ' + taskId)

        if self.__isArchived(currTask):
            raise Exception('Cannot update archived task')

        # nothing to update
        if prop is None and parentId is None:
            return

        if parentId is not None:
            deb('Tasks: updateTask- new parent id is: ' + str(parentId))
            currParent = currTask.parent
            deb('updateTask: current parent is:' + str(currParent.id))

            if parentId != currParent.id:
                if parentId == currTask.id:
                    newParentId = Tasks.ROOT_TASK_ID

                newParent = self.taskObj.find(parentId)

                if newParent is not None:
                    currParent.children.remove(currTask)

                    # we don't append in children list if the new parent is
                    # the current task but that condition is checked before
                    # we reach here so don't need an if condition
                    newParent.children.append(currTask)
                    currTask.parent = newParent

        if prop is not None:
            deb('Tasks - updateTask: before updating currTask prop ' +
                str(currTask.prop))
            if updateSubtasks:
                self.__updateSubtasks(currTask, prop)
            else:
                currTask.prop.update(prop)

            deb('Tasks - updateTask: after updating currTask prop' +
                str(currTask.prop))

        # update the file
        self.write()

    # this routine updates the task and all associated subtasks
    # with the provided properties
    def __updateSubtasks(self, currTask, prop):
        currTask.prop.update(prop)

        for ch in currTask.children:
            self.__updateSubtasks(ch.id, prop)

    def archiveTask(self, taskId):
        task = self.taskObj.find(taskId)
        if task is None:
            raise Exception('Could not find task with task id :' + taskId)

        if self.__isArchived(task):
            return
        completionDict = {
            'completed': 1,
            'completion_time': str(datetime.datetime.now())
        }
        self.__updateSubtasks(task, completionDict)
        # update the file
        self.write()

    # is completed
    def __isArchived(self, task):
        if 'completed' not in task.prop:
            return false
        return task.prop['completed'] == 1
Beispiel #19
0
class TicTacToe(object):
    def __init__(self):
        self.tree = None
        self.xplayer = False  #True if human player
        self.oplayer = False  #True if human player
        self.gameover = False
        self.xturn = True  #False if oturn
        self.template = StateTemplate([0, 1, 2, 3, 4, 5, 6, 7, 8])
        self.startState = [-1, -1, -1, -1, -1, -1, -1, -1, -1]

    def setupTree(self):
        '''Set up the full tree which shows all of the game states'''
        self.tree = Tree()
        self.tree.root.data = GameState(self.startState)
        node = self.tree.root
        while node is not None:
            if -1 in node.data.state:
                nodestate = deepcopy(node.data.state)
                index = nodestate.index(-1)
                node.data.state[index] = -2
                node = self.tree.addNode(node)
                #node = self.tree.findNode(nodeid)
                if len([k for k in nodestate if k == -1 or k == -2]) % 2:
                    #if len(node.id) % 2 == 0:
                    nodestate[index] = 'X'
                else:
                    nodestate[index] = 'O'

                for i in range(len(nodestate)):
                    if nodestate[i] == -2:
                        nodestate[i] = -1
                node.data = GameState(nodestate)
                #node.depth = len(node.id)-1 #depth is 0-based
            else:
                node = node.parent

        self.tree.prune(self.tree.root,
                        filters())  #prune the tree with the filters

    def checkEndGame(self):
        '''Return true if the current node has no children'''
        if len(self.tree.root.children) == 0:
            return True
        return False

    def humanFirstTurn(self):
        return int(raw_input("Enter an 'X' at location: (0-8) "))

    def humanTurn(self, symbol):
        '''Gets called when it is a humans turn.  symbol is either "X" or "O"'''
        i = int(raw_input("Enter an '" + symbol + "' at location: (0-8) "))
        data = self.tree.root.data.copy()
        if not data.setData(symbol, i):
            print("Cannot place '" + symbol + "' there.  Try again")
            self.humanTurn(symbol)
        else:
            node = self.tree.find(data)
            self.tree.setRoot(node.id)

    #def aiTurn(self, symbol, index):
    #    '''The ai at this point has chosen the best path as given by the index'''
    #    data = self.tree.root.data.copy() #get a copy of root GameState
    #    #data.setData(symbol, index)
    #    node = self.tree.find(data)
    #    self.tree.setRoot(node.id)

    def makeMoveAI(self, index):
        node = self.tree.root.children[index]
        self.tree.setRoot(node.id)