Ejemplo n.º 1
0
 def update_allocation_metrics(self, allocation_time):
     allocation_info = self.auctioneer.winning_bid.get_allocation_info()
     task = Task.get_task(allocation_info.new_task.task_id)
     self.performance_tracker.update_allocation_metrics(task, allocation_time)
     if allocation_info.next_task:
         task = Task.get_task(allocation_info.next_task.task_id)
         self.performance_tracker.update_allocation_metrics(task, only_constraints=True)
Ejemplo n.º 2
0
    def task_status_cb(self, msg):
        payload = msg['payload']
        timestamp = TimeStamp.from_str(
            msg["header"]["timestamp"]).to_datetime()
        task_status = TaskStatus.from_payload(payload)

        if self.robot_id == task_status.robot_id:

            task = Task.get_task(task_status.task_id)
            self.logger.debug("Received task status %s for task %s",
                              task_status.task_status, task.task_id)

            self.logger.debug("Sending task status %s for task %s",
                              task_status.task_status, task.task_id)
            self.api.publish(msg, groups=["TASK-ALLOCATION"])

            if task_status.task_status == TaskStatusConst.ONGOING:
                self.update_timetable(task, task_status.task_progress,
                                      timestamp)

            elif task_status.task_status == TaskStatusConst.COMPLETED:
                self.logger.debug("Completing execution of task %s",
                                  task.task_id)
                self.task = None

            task.update_status(task_status.task_status)
Ejemplo n.º 3
0
 def get_earliest_task(self):
     task_id = self.stn.get_earliest_task_id()
     if task_id:
         try:
             task = Task.get_task(task_id)
             return task
         except DoesNotExist:
             self.logger.warning("Task %s is not in db or its first node is not the start node", task_id)
Ejemplo n.º 4
0
 def get_r_time_previous_task(self,
                              insertion_point,
                              node_type,
                              earliest=True):
     task_id = self.stn.get_task_id(insertion_point - 1)
     previous_task = Task.get_task(task_id)
     return self.dispatchable_graph.get_time(previous_task.task_id,
                                             node_type, earliest)
Ejemplo n.º 5
0
 def previous_task_is_frozen(self, insertion_point):
     task_id = self.stn.get_task_id(insertion_point - 1)
     previous_task = Task.get_task(task_id)
     if previous_task.status.status in [
             TaskStatusConst.DISPATCHED, TaskStatusConst.ONGOING
     ]:
         return True
     return False
Ejemplo n.º 6
0
 def get_next_task(self, task):
     task_last_node = self.stn.get_task_node_ids(task.task_id)[-1]
     if self.stn.has_node(task_last_node + 1):
         next_task_id = self.stn.nodes[task_last_node + 1]['data'].task_id
         try:
             next_task = Task.get_task(next_task_id)
         except DoesNotExist:
             self.logger.warning("Task %s is not in db", next_task_id)
             next_task = Task.create_new(task_id=next_task_id)
         return next_task
Ejemplo n.º 7
0
    def get_task(self, position):
        """ Returns the task in the given position

        :param position: (int) position in the STN
        :return: (Task) task
        """
        task_id = self.stn.get_task_id(position)
        if task_id:
            try:
                return Task.get_task(task_id)
            except DoesNotExist:
                self.logger.warning("Task %s is not in db", task_id)
                raise DoesNotExist
        else:
            raise TaskNotFound(position)
Ejemplo n.º 8
0
    def task_status_cb(self, msg):
        payload = msg['payload']
        timestamp = TimeStamp.from_str(
            msg["header"]["timestamp"]).to_datetime()
        task_status = TaskStatus.from_payload(payload)

        if self.robot_id == task_status.robot_id:
            task = Task.get_task(task_status.task_id)
            self.logger.debug("Received task status %s for task %s",
                              task_status.task_status, task.task_id)

            if task_status.task_status == TaskStatusConst.ONGOING:
                self._update_timetable(task, task_status.task_progress,
                                       timestamp)
                task.update_status(task_status.task_status)
Ejemplo n.º 9
0
    def task_status_cb(self, msg):
        while self.deleting_task:
            time.sleep(0.1)

        self.processing_task = True

        payload = msg['payload']
        timestamp = TimeStamp.from_str(
            msg["header"]["timestamp"]).to_datetime()
        task_status = TaskStatus.from_payload(payload)
        task_progress = task_status.task_progress
        task = Task.get_task(task_status.task_id)
        self.logger.debug("Received task status %s for task %s by %s",
                          task_status.task_status, task_status.task_id,
                          task_status.robot_id)

        if task_status.task_status == TaskStatusConst.ONGOING:
            self._update_progress(task, task_progress, timestamp)
            self.update_timetable(task, task_status.robot_id, task_progress,
                                  timestamp)
            self._update_task_schedule(task, task_progress, timestamp)
            task.update_status(task_status.task_status)

        elif task_status.task_status == TaskStatusConst.COMPLETED:
            self.logger.debug("Adding task %s to tasks to remove",
                              task.task_id)
            self.tasks_to_remove.append((task, task_status.task_status))

        elif task_status.task_status == TaskStatusConst.UNALLOCATED:
            self.re_allocate(task)

        elif task_status.task_status == TaskStatusConst.PREEMPTED:
            if task.status.status == TaskStatusConst.PREEMPTED:
                self.logger.warning("Task %s is already preempted",
                                    task_status.task_id)
                return
            try:
                self._remove_task(task, task_status.task_status)
            except TaskNotFound:
                return

        self.processing_task = False
Ejemplo n.º 10
0
    def allocate_to_robot(self, task_id):
        allocation_info = self.bid_placed.get_allocation_info()
        self.timetable.add_stn_task(allocation_info.new_task)
        if allocation_info.next_task:
            self.timetable.add_stn_task(allocation_info.next_task)

        self.timetable.stn = allocation_info.stn
        self.timetable.dispatchable_graph = allocation_info.dispatchable_graph
        self.timetable.store()

        self.logger.debug("Robot %s allocated task %s", self.robot_id, task_id)
        self.logger.debug("STN: \n %s", self.timetable.stn)
        self.logger.debug("Dispatchable graph: \n %s",
                          self.timetable.dispatchable_graph)

        tasks = [task for task in self.timetable.get_tasks()]

        self.logger.debug("Tasks allocated to robot %s:%s", self.robot_id,
                          tasks)
        task = Task.get_task(task_id)
        task.update_status(TaskStatusConst.ALLOCATED)
        task.assign_robots([self.robot_id])
Ejemplo n.º 11
0
    def get_smallest_bid(bids):
        """ Get the bid with the smallest cost among all bids.

        :param bids: list of bids
        :return: the bid with the smallest cost
        """
        smallest_bid = None

        for bid in bids:
            # Do not consider bids for tasks that were dispatched after the bid computation
            task = Task.get_task(bid.task_id)
            if task.status.status in [
                    TaskStatusConst.DISPATCHED, TaskStatusConst.ONGOING
            ]:
                continue

            if smallest_bid is None or\
                    bid < smallest_bid or\
                    (bid == smallest_bid and bid.task_id < smallest_bid.task_id):

                smallest_bid = copy.deepcopy(bid)

        return smallest_bid
Ejemplo n.º 12
0
 def get_previous_task(self, task):
     task_first_node = self.stn.get_task_node_ids(task.task_id)[0]
     if task_first_node > 1 and self.stn.has_node(task_first_node - 1):
         prev_task_id = self.stn.nodes[task_first_node - 1]['data'].task_id
         prev_task = Task.get_task(prev_task_id)
         return prev_task
Ejemplo n.º 13
0
 def remove_task_cb(self, msg):
     payload = msg['payload']
     remove_task = RemoveTaskFromSchedule.from_payload(payload)
     task = Task.get_task(remove_task.task_id)
     self._remove_task(task, remove_task.status)