From c265ad4455cfed54804ff59e45a0b48e41a46329 Mon Sep 17 00:00:00 2001 From: 23-58-20 Date: Sun, 19 Mar 2023 22:19:38 +0300 Subject: [PATCH] added first draft for grader mechanic --- dataset_gen/src/grader/grader.py | 74 +++++++++++++++++++++++++ dataset_gen/src/grader/grader_config.py | 7 +++ 2 files changed, 81 insertions(+) create mode 100644 dataset_gen/src/grader/grader.py create mode 100644 dataset_gen/src/grader/grader_config.py diff --git a/dataset_gen/src/grader/grader.py b/dataset_gen/src/grader/grader.py new file mode 100644 index 0000000..0d45e57 --- /dev/null +++ b/dataset_gen/src/grader/grader.py @@ -0,0 +1,74 @@ +from random import random + +from grader_config import dist_grade, metric, pos_coeff, photo_coeff + + +class Point: # stub + def __init__(self): + self.x = random() + self.y = random() + self.z = random() + + +class Grader: + def __init__(self, drones, task_id, grade_criteria): + self.drones = drones + self.task_id = task_id + self.grade_criteria = grade_criteria + self.metric = metric + self.pos_coeff = pos_coeff + self.photo_coeff = photo_coeff + + def __get_distance(self, p1: Point, p2: Point): + x = p1.x - p2.x + y = p1.y - p2.y + z = p1.z - p2.z + if self.metric == "chessboard": + return max(abs(x), abs(y), abs(z)) + elif self.metric == "taxicab": + return sum(abs(x) + abs(y) + abs(z)) + elif self.metric != "plane": + print("Unknown metric, proposed euqclidean") # raise? + return (x**2 + y**2 + z**2)**0.5 + + def __get_pos(self, drone): + return Point() # stub + + def __get_expected_pos(self, drone): + return Point() # stub + + def __get_photos_count(self, drone): + return int(random()*5) # stub + + def __get_expected_photos_count(self, drone): + return 5 # stub + + def __grade_position(self): + total_grade = 0 + for drone in self.drones: + pos = self.__get_pos(drone) + expected_pos = self.__get_expected_pos(drone) + dist = self.__get_distance(pos, expected_pos) + keys = list(filter(lambda key: dist <= key, dist_grade.keys())) + key = min(keys) if keys else None + grade = dist_grade[key] if key is not None else 0 + total_grade += grade + return total_grade/len(self.drones) # return avg + + def __grade_photo(self): + total_grade = 0 + for drone in self.drones: + count_photos = self.__get_photos_count(drone) + expected_photos = self.__get_expected_photos_count(drone) + grade = count_photos/expected_photos + total_grade += grade + return total_grade/len(self.drones) # return avg + + def grade(self): + used_pos_coeff = self.pos_coeff \ + if "position" in self.grade_criteria else 0 + used_photo_coeff = self.photo_coeff \ + if "photo" in self.grade_criteria else 0 + return (used_pos_coeff*self.__grade_position() + + used_photo_coeff*self.__grade_photo()) \ + / (used_pos_coeff + used_photo_coeff) diff --git a/dataset_gen/src/grader/grader_config.py b/dataset_gen/src/grader/grader_config.py new file mode 100644 index 0000000..0a8d15b --- /dev/null +++ b/dataset_gen/src/grader/grader_config.py @@ -0,0 +1,7 @@ +dist_grade = {1: 1, + 5: 0.9, + 10: 0.7, + 20: 0.4} +metric = "plane" # options: plane, chessboard, taxicab +pos_coeff = 1 +photo_coeff = 1