def compute_traffic_scores(self):  # Computes traffic scores
        self.classes_time = {
        }  # contains class num as key and time of use as its value
        for r in self.rooms:
            time = {}
            for d in self.days:
                time[d] = []
            for course in self.parsed_info.values():
                if r in course.values():
                    for x in course:
                        if x in self.days and course[x] not in time[x]:
                            time[x].append(course[x])
            self.classes_time[r] = time
        # ==== Removes time after 19:00
        for day in self.classes_time.values():
            for time in day.values():
                time.sort()
                for hour in time:
                    if hour >= "19:00-24:00":
                        time.remove(hour)
        # ==== Block of code that computes the traffic scores
        classes_traffic_num = {
        }  # contains class num as key and its traffic num
        for cla in self.classes_time:
            day_hour = {}
            for d in self.days:
                day_hour[d] = 0
            for day in self.classes_time[cla]:
                for time in self.classes_time[cla][day]:
                    uncut_time = time.split('-')
                    start_hour = uncut_time[0].split(":")[0]
                    end_hour = uncut_time[1].split(":")[0]
                    difference_hours = int(end_hour) - int(start_hour)
                    sum_hours = day_hour[day] + difference_hours
                    day_hour[day] = sum_hours
            classes_traffic_num[cla] = day_hour
        for cla, day_time in classes_traffic_num.items():
            for day in day_time:
                if day_time[day] == 0:
                    day_time[day] = 0.1
                traffic_num = day_time[day] / (19.0 - 9.0)
                day_time[day] = traffic_num
            normalized_dict = mysearchengine.normalizescores(day_time)
            for x in normalized_dict:
                rounded_num = round(normalized_dict[x], 4)
                normalized_dict[x] = rounded_num
            classes_traffic_num[cla] = normalized_dict

        for buildings in self.buildings_objects.values():
            for cla_object in buildings.classroom_objects:
                for cla in classes_traffic_num:
                    if cla in cla_object.room_number:
                        for day in classes_traffic_num[cla]:
                            cla_object.traffic_score[
                                day] = classes_traffic_num[cla][
                                    day]  # (updates the classroom
 def compute_closeness_scores(self, building, room_num):
     current_class = ''  # to keep selected class
     closeness = {}  # to keep closeness scores
     self.normalized_closenes = {}
     for classes in self.buildings[building].classrooms:
         if classes.room_num == room_num:  # if classes room number == selected room number
             current_class = classes  # set current objdect
     for name, build in self.buildings.items():
         for another_class in build.classrooms:  # find closeness score using another classes
             closeness[str(another_class.building_num) + str(
                 another_class.room_num)] = current_class.get_distance_from(
                     another_class)
     self.normalized_closenes = mysearchengine.normalizescores(
         closeness, smallIsBetter=True)
 def compute_traffic_scores(self, day):
     dict_ = {}  # to keep class_num and result of traffic score calculation
     self.normalized_traffic = {}  # to keep normalized traffic score
     for name, build in self.buildings.items():
         for class_ in build.classrooms:
             if day not in class_.traffic_score:  # if day not exists in traffic score
                 class_.traffic_score[day] = 0  # set its traffic score as 0
             score = class_.traffic_score[
                 day]  # take class traffic score for corresponding day
             result = float(score) / 10  # traffic calculations
             if result == 0.0:  # if result 0 replace it with 0.1
                 result = 0.1
             class_.traffic_score[day] = result  # set class traffic score
             class_num = str(class_.building_num) + str(class_.room_num)
             dict_[
                 class_num] = result  # and add them in dict_ dictionary to normalize
     self.normalized_traffic = mysearchengine.normalizescores(
         dict_, smallIsBetter=True)
 def compute_closeness_scores(self, location,
                              room):  # Computes closeness score
     # ====== Block of code that computes the closeness scores
     chosen_building_num = location.get().split()[2]
     chosen_room = chosen_building_num + room.get()
     closeness = {}
     for building in self.buildings_objects.values():
         for cla_obj in building.classroom_objects:
             if chosen_room == cla_obj.room_number:
                 current_room = cla_obj
     for building in self.buildings_objects.values():
         for cla_obj in building.classroom_objects:
             closeness[
                 cla_obj.room_number] = current_room.get_distance_from(
                     cla_obj)
     normalized_closeness = mysearchengine.normalizescores(closeness)
     for cla, score in normalized_closeness.items():
         self.search_results_items.append(
             SearchResultItem(cla, round(score, 4)))
    def compute_availability_scores(self, start_time, end_time, day):
        self.search_items = {
        }  # to keep class number as a key and SearchResultItem objects as value
        self.normalized_availability = {
        }  # to keep normalized availability score
        for time, list_ in self.days[day].time_slots.items():
            for class_obj in list_:
                class_num = str(class_obj.building_num) + str(
                    class_obj.room_num)  # class num like 4302
                self.search_items.setdefault(
                    class_num, SearchResultItem(
                        class_obj))  # class num and SearchRes. obj
                self.search_items[class_num].available_slots.add(
                    time)  # add in available_slots

        for class_ in self.search_items:
            self.search_items[class_].compute_availability_score(
                start_time, end_time, day)  # to compute availability
            self.normalized_availability[class_] = self.search_items[
                class_].availability_score

        self.normalized_availability = mysearchengine.normalizescores(
            self.normalized_availability,
            smallIsBetter=False)  # to keep normalized values
 def compute_availability(
         self, start_time, end_time,
         day):  # Computes available time in each class and availability
     selected_start_time = start_time.get()  # scores
     selected_end_time = end_time.get()
     selected_day = day.get()
     no_class_hours = {}
     # ========= Block of code that determines when the class is empty and adds it to the avaialability_slots
     for cla in self.classes_time:
         no_class_hours[cla] = []
         for day in self.classes_time[cla]:
             if day == selected_day and len(
                     self.classes_time[cla][day]) > 1:
                 for hour_class in range(
                         len(self.classes_time[cla][day]) - 1):
                     first_hour_split = self.classes_time[cla][day][
                         hour_class].split("-")[1]
                     second_hour_split = self.classes_time[cla][day][
                         hour_class + 1].split("-")[0]
                     if first_hour_split != second_hour_split:
                         no_class_hour = first_hour_split + "-" + second_hour_split
                         no_class_hours[cla].append(no_class_hour)
             elif day == selected_day and len(
                     self.classes_time[cla][day]) == 0:
                 no_class_hours[cla].append("09:00-19:00")
             elif day == selected_day and len(
                     self.classes_time[cla][day]) == 1:
                 first_hour = self.classes_time[cla][day][0].split("-")[0]
                 second_hour = self.classes_time[cla][day][0].split("-")[1]
                 no_class_hours[cla].append('09:00-' + first_hour)
                 no_class_hours[cla].append(second_hour + "-19:00")
             if day == selected_day and len(no_class_hours[cla]) == 0:
                 first_hour = self.classes_time[cla][day][0].split("-")[0]
                 second_hour = self.classes_time[cla][day][
                     len(self.classes_time[cla][day]) - 1].split("-")[1]
                 if first_hour != "9:00":
                     no_class_hours[cla].append("09:00-" + first_hour)
                 no_class_hours[cla].append(second_hour + "-19:00")
     # ==== Block of code that gets the available scores
     for cla, hour_list in no_class_hours.items():
         if len(hour_list) > 0 and "09:00" not in hour_list[0]:
             morning_no_class = "09:00-" + hour_list[0].split('-')[0]
             hour_list.insert(0, morning_no_class)
         if len(hour_list) > 0 and "19:00" not in hour_list[len(hour_list) -
                                                            1]:
             afternoon_no_class = hour_list[len(hour_list) -
                                            1].split('-')[1] + "-19:00"
             hour_list.insert(len(hour_list), afternoon_no_class)
     for cla in no_class_hours:
         if "09:00-09:00" in no_class_hours[cla]:
             no_class_hours[cla].pop(0)
         for result in self.search_results_items:
             if result.classroom == cla:
                 for time_interval in no_class_hours[cla]:
                     result.available_slots.append(time_interval)
     for result in self.search_results_items:  # removes 21:00 from list
         if result.classroom == "3001" or "7029":
             for time_interval in result.available_slots:
                 if "21:00" in time_interval:
                     result.available_slots.pop(
                         len(result.available_slots) - 1)
     normalizer = {}  # Contains normalized scores
     for result in self.search_results_items:
         result.compute_availability_scores(selected_start_time,
                                            selected_end_time)
         normalizer[result.classroom] = result.availability
     normalized = mysearchengine.normalizescores(
         normalizer)  # Normalizes the scores
     for cla, score in normalized.items():
         for result in self.search_results_items:
             if cla == result.classroom:
                 result.availability = abs(round(score, 4))