import itertools from enum import Enum class GraphType(Enum): NONE = 'N' FATALITY = 'F' ACCIDENT = 'A' class VehicleType(Enum): CAR = 'C' BIKE = 'B' def is_string(value): if isinstance(value, str): return value raise Exception("Scenario attribute must be instance of str") def is_integer(value): if isinstance(value, int): return value raise Exception("Scenario attribute must be instance of int") def is_boolean(value): if isinstance(value, bool): return value raise Exception("Scenario attribute must be instance of bool") def is_graph_type(value): if isinstance(value, GraphType): return value raise Exception("Scenario attribute must be instance of GraphType") class Scenario: scenario_ids = itertools.count() def __init__(self, people_left: int, people_right: int, people_middle: int, vehicle_left: VehicleType = VehicleType.CAR, vehicle_right: VehicleType = VehicleType.CAR, graph1: GraphType = GraphType.NONE, graph2: GraphType = GraphType.NONE, swapped_graphs: bool = False, swapped_people: bool = False, scenario_id: int = None): self.scenario_id = scenario_id if (scenario_id is not None) else next(Scenario.scenario_ids) # init vehicle self.people_left: int = is_integer(people_left) self.people_right: int = is_integer(people_right) self.people_middle: int = is_integer(people_middle) self.vehicle_left: VehicleType = vehicle_left self.vehicle_right: VehicleType = vehicle_right self.swapped_people = swapped_people # init graphs self.graph1 = is_graph_type(graph1) self.graph2 = is_graph_type(graph2) self.swapped_graphs = swapped_graphs def __str__(self): return f"Scenario {self.scenario_id}\n" \ f" People Left: {self.people_left}\n" \ f" People Right: {self.people_right}\n" \ f" People Swapped: {self.swapped_people}\n" \ f" People Middle: {self.people_middle}\n" \ f" Vehicle Left: {self.vehicle_left.value}\n" \ f" Vehicle Right: {self.vehicle_right.value}\n" \ f" Graph 1: {self.graph1.name}\n" \ f" Graph 2: {self.graph2.name}\n" \ f" Graphs Swapped: {self.swapped_graphs}\n\n" \ def set_graphs(self, graph1: GraphType, graph2: GraphType = GraphType.NONE): self.graph1 = graph1 self.graph2 = graph2 return self def get_nr_graphs(self) -> int: return len([x for x in [self.graph1, self.graph2] if x != GraphType.NONE]) def swap_people(self): """ this method swaps the nr of people of the object """ if self.vehicle_right != VehicleType.BIKE: # in bike scenarios, people are not swapped self.people_left, self.people_right = self.people_right, self.people_left self.vehicle_left, self.vehicle_right = self.vehicle_right, self.vehicle_left self.swapped_people = not self.swapped_people return self def swap_graphs(self): """ this method swaps the graph1 and graph2 of the object """ if self.get_nr_graphs() == 2: self.graph1, self.graph2 = self.graph2, self.graph1 self.swapped_graphs = not self.swapped_graphs return self def get_treatment_name(self): return self.vehicle_left.value + str(self.people_left) + "-C" + str(self.people_middle) + "-" + self.vehicle_right.value + str(self.people_right) + "-" + self.graph1.value + "-" + self.graph2.value def copy(self): return Scenario(people_left=self.people_left, people_right=self.people_right, people_middle=self.people_middle, vehicle_right=self.vehicle_right, vehicle_left=self.vehicle_left, scenario_id=self.scenario_id, graph1=self.graph1, graph2=self.graph2, swapped_graphs=self.swapped_graphs)