def save_signs(self, plan): def __is_role(pm): chains = pm.spread_down_activity('meaning', 6) for chain in chains: if len(chain[-1].sign.significances[1].cause) != 0: break else: return False return True I_obj = None logging.info('Plan preparation to save...') if plan: logging.info('\tCleaning SWM...') pms_sit = [pm[0] for pm in plan[:-1]] pms_act = [pm[2] for pm in plan[:-1]] deleted = [] for name, s in self.signs.copy().items(): signif = list(s.significances.items()) if name.startswith(SIT_PREFIX): for index, pm in s.meanings.copy().items(): if pm not in pms_sit: s.remove_meaning(pm) # delete all situations deleted.append(pm) self.signs.pop(name) elif len(signif): if len(signif[0][1].cause) and len( signif[0][1].effect ): #delete action's meanings that are not in plan for index, pm in s.meanings.copy().items(): # if pm not in pms_act: # s.remove_meaning(pm) if __is_role( pm): # delete only fully signed actions break else: if pm not in pms_act: s.remove_meaning(pm) They_signs = [ con.in_sign for con in self.signs["They"].out_significances ] I_obj = [ con.in_sign for con in self.signs["I"].out_significances if con.out_sign.name == "I" ] for agent in itertools.chain(They_signs, I_obj): for connector in list(agent.out_meanings.copy()): pm = connector.in_sign.meanings[connector.in_index] if pm not in pms_act: if __is_role(pm): # delete only fully signed actions break else: agent.out_meanings.remove(connector) logging.info('\tSaving precedent...') self.start_situation.name += self.name self.goal_situation.name += self.name dm = self.start_situation.meanings[1].copy('meaning', 'image') self.start_situation.add_image(dm) dm = self.goal_situation.meanings[1].copy('meaning', 'image') self.goal_situation.add_image(dm) # in start and goal sit out_meanings insert connector to plan sign plan_sign = Sign(PLAN_PREFIX + self.name) plan_mean = plan_sign.add_meaning() connector = plan_mean.add_feature(self.start_situation.meanings[1]) self.start_situation.add_out_meaning(connector) conn = plan_mean.add_feature(self.goal_situation.meanings[1], effect=True) self.goal_situation.add_out_meaning(conn) plan_image = plan_sign.add_image() for _, name, cm, agent, _ in plan[:-1]: im = cm.sign.add_image() #im = cm.copy('meaning', 'image') connector = plan_image.add_feature(im) cm.sign.add_out_image( connector ) # add connector to plan_sign threw images to out_image self.signs[plan_sign.name] = plan_sign self.signs[self.start_situation.name] = self.start_situation self.signs[self.goal_situation.name] = self.goal_situation else: for name, sign in self.signs.copy().items(): if name.startswith(SIT_PREFIX): self.signs.pop(name) else: sign.meanings = {} sign.out_meanings = [] if I_obj: I_obj = "_" + I_obj[0].name else: I_obj = 'I' file_name = DEFAULT_FILE_PREFIX + datetime.datetime.now().strftime( '%m_%d_%H_%M') + I_obj + DEFAULT_FILE_SUFFIX logging.info('Start saving to {0}'.format(file_name)) logging.info('\tDumping SWM...') pickle.dump(self.signs, open(file_name, 'wb')) logging.info('\tDumping SWM finished') return file_name