def set_transition_constrs(self): self.constrs['transition'] = [] for k in range(self.num_futures): for h in range(1, self.problem.horizon): xindices = [ self.var_to_idx[x, k, h - 1] for x in self.inst_params['xs'] ] aindices = [ self.var_to_idx[a, k, h - 1] for a in self.problem.actions ] num_xs = len(xindices) for x in self.inst_params['xs']: clique = MRFClique([self.var_to_idx[x, k, h]]) determinized_val = 1 if random.random() < 0.5 else 0 utils.append_function_entry(clique, 0, 0, determinized_val) utils.append_function_entry(clique, 1, 0, determinized_val) self.constrs['transition'].append(clique) for y in self.inst_params['ys']: var_indices = [ self.var_to_idx[y, k, h], self.var_to_idx[y, k, h - 1] ] var_indices.extend(xindices) var_indices.extend(aindices) clique = MRFClique(var_indices) for bitmask in range(2**len(var_indices)): if utils.is_set(bitmask, 1): utils.append_function_entry(clique, bitmask, 0, 1) continue matched = True for i in range(2, 2 + num_xs): if utils.is_set(bitmask, i) != utils.is_set( bitmask, i + num_xs): matched = False break if matched and random.random() < 0.49: utils.append_function_entry(clique, bitmask, 0, 1) else: utils.append_function_entry(clique, bitmask, 0, 0) self.constrs['transition'].append(clique) logger.info('set_transition_constraints')
def set_elevator_closed_transition(self, k, h): for elevator in self.inst_params['elevators']: var_indices = [self.get_elevator_closed_state(elevator), self.get_elevator_closed_state(elevator), self.get_open_door_action(elevator, 'up'), self.get_open_door_action(elevator, 'down'), self.get_close_door_action(elevator)] var_indices[0] = self.var_to_idx[var_indices[0], k, h] var_indices[1:] = [self.var_to_idx[v, k, h - 1] for v in var_indices[1:]] clique = MRFClique(var_indices) for bitmask in range(2**len(var_indices)): if utils.is_set(bitmask, 1) and not utils.is_set(bitmask, 2) \ and not utils.is_set(bitmask, 3) and utils.is_set(bitmask, 4): utils.append_function_entry(clique, bitmask, 0, 1) else: utils.append_function_entry(clique, bitmask, 0, 0) self.constrs['transition'].append(clique)
def set_elevator_dir_up_transition(self, k, h): for elevator in self.inst_params['elevators']: var_indices = [self.get_elevator_dir_state(elevator, 'up'), self.get_elevator_dir_state(elevator, 'up'), self.get_open_door_action(elevator, 'up'), self.get_open_door_action(elevator, 'down')] var_indices[0] = self.var_to_idx[var_indices[0], k, h] var_indices[1:] = [self.var_to_idx[v, k, h - 1] for v in var_indices[1:]] clique = MRFClique(var_indices) for bitmask in range(2**len(var_indices)): if utils.is_set(bitmask, 2): utils.append_function_entry(clique, bitmask, 0, 1) continue if utils.is_set(bitmask, 3): utils.append_function_entry(clique, bitmask, 0, 0) continue val = 1 if utils.is_set(bitmask, 1) else 0 utils.append_function_entry(clique, bitmask, 0, val) self.constrs['transition'].append(clique)
def set_elevator_at_floor_transition(self, k, h): for elevator in self.inst_params['elevators']: for floor in self.inst_params['floors']: adjacent_floors = [] upper_floor_idx = len(adjacent_floors) if floor in self.inst_params['ADJACENT-UP'] else None if upper_floor_idx is not None: adjacent_floors.append(self.inst_params['ADJACENT-UP'][floor]) lower_floor_idx = len(adjacent_floors) if floor in self.inst_params['ADJACENT-DOWN'] else None if lower_floor_idx is not None: adjacent_floors.append(self.inst_params['ADJACENT-DOWN'][floor]) elevator_at_floor = self.get_elevator_at_state(elevator, floor) elevator_closed = self.get_elevator_closed_state(elevator) elevator_dir_up = self.get_elevator_dir_state(elevator, 'up') move_cur_dir = self.get_move_current_dir_action(elevator) at_adjacent_floors = [self.get_elevator_at_state(elevator, fl) for fl in adjacent_floors] var_indices = [elevator_at_floor, elevator_at_floor, elevator_closed, elevator_dir_up, move_cur_dir] var_indices += at_adjacent_floors var_indices[0] = self.var_to_idx[var_indices[0], k, h] var_indices[1:] = [self.var_to_idx[v, k, h - 1] for v in var_indices[1:]] adjacent_floors_offset = 5 clique = MRFClique(var_indices) for bitmask in range(2**len(var_indices)): prev_val = utils.btoi(utils.is_set(bitmask, 1)) if not utils.is_set(bitmask, 2) or not utils.is_set(bitmask, 4): utils.append_function_entry(clique, bitmask, 0, prev_val) continue if utils.is_set(bitmask, 4) and utils.is_set(bitmask, 3): if lower_floor_idx is not None: if utils.is_set(bitmask, adjacent_floors_offset + lower_floor_idx): utils.append_function_entry(clique, bitmask, 0, 1) else: utils.append_function_entry(clique, bitmask, 0, 0) else: utils.append_function_entry(clique, bitmask, 0, prev_val) continue if utils.is_set(bitmask, 4) and not utils.is_set(bitmask, 3): if upper_floor_idx is not None: if utils.is_set(bitmask, adjacent_floors_offset + upper_floor_idx): utils.append_function_entry(clique, bitmask, 0, 1) else: utils.append_function_entry(clique, bitmask, 0, 0) else: utils.append_function_entry(clique, bitmask, 0, prev_val) continue utils.append_function_entry(clique, bitmask, 0, prev_val) self.constrs['transition'].append(clique)
def set_person_in_elevator_transition(self, k, h): for elevator in self.inst_params['elevators']: person_in_elevator_going_up = self.get_person_in_elevator_state(elevator, 'up') person_in_elevator_going_down = self.get_person_in_elevator_state(elevator, 'down') elevator_closed = self.get_elevator_closed_state(elevator) elevator_dir_up = self.get_elevator_dir_state(elevator, 'up') elevator_at_floor = [self.get_elevator_at_state(elevator, floor) for floor in self.inst_params['floors']] person_waiting_up = [self.get_person_waiting_state(floor, 'up') for floor in self.inst_params['floors']] person_waiting_down = [self.get_person_waiting_state(floor, 'down') for floor in self.inst_params['floors']] floor_offset = 4 waiting_offset = floor_offset + len(elevator_at_floor) common_indices = [(elevator_closed, k, h - 1), (elevator_dir_up, k, h - 1)] common_indices += [(v, k, h - 1) for v in elevator_at_floor] # Going up var_indices = [(person_in_elevator_going_up, k, h), (person_in_elevator_going_up, k, h - 1)] var_indices += common_indices + [(v, k, h - 1) for v in person_waiting_up] var_indices = [self.var_to_idx[v] for v in var_indices] elevator_at_top_floor_idx = 4 + self.inst_params['TOP-FLOOR'] clique = MRFClique(var_indices) for bitmask in range(2**len(var_indices)): if utils.is_set(bitmask, 1): if utils.is_set(bitmask, elevator_at_top_floor_idx): utils.append_function_entry(clique, bitmask, 0, 0) else: utils.append_function_entry(clique, bitmask, 0, 1) continue if utils.is_set(bitmask, 2): utils.append_function_entry(clique, bitmask, 0, 0) continue if not utils.is_set(bitmask, 3): utils.append_function_entry(clique, bitmask, 0, 0) continue done = False for i in range(len(elevator_at_floor)): if utils.is_set(bitmask, floor_offset + i) and utils.is_set(bitmask, waiting_offset + i): utils.append_function_entry(clique, bitmask, 0, 1) done = True break if not done: utils.append_function_entry(clique, bitmask, 0, 0) self.constrs['transition'].append(clique) # Going down var_indices = [(person_in_elevator_going_down, k, h), (person_in_elevator_going_down, k, h - 1)] var_indices += common_indices + [(v, k, h - 1) for v in person_waiting_down] var_indices = [self.var_to_idx[v] for v in var_indices] elevator_at_bottom_floor_idx = 4 + self.inst_params['BOTTOM-FLOOR'] clique = MRFClique(var_indices) for bitmask in range(2**len(var_indices)): if utils.is_set(bitmask, 1): if utils.is_set(bitmask, elevator_at_bottom_floor_idx): utils.append_function_entry(clique, bitmask, 0, 0) else: utils.append_function_entry(clique, bitmask, 0, 1) continue if utils.is_set(bitmask, 2): utils.append_function_entry(clique, bitmask, 0, 0) continue if utils.is_set(bitmask, 3): utils.append_function_entry(clique, bitmask, 0, 0) continue done = False for i in range(len(elevator_at_floor)): if utils.is_set(bitmask, floor_offset + i) and utils.is_set(bitmask, waiting_offset + i): utils.append_function_entry(clique, bitmask, 0, 1) done = True break if not done: utils.append_function_entry(clique, bitmask, 0, 0) self.constrs['transition'].append(clique)