def getNonExecutable(self, belief, lastSystemAction): ''' Set of rules defining the mask over the action set, given the current belief state :param belief: the current master belief :type belief: dict :param lastSystemAction: the system action of the previous turn :type lastSystemAction: string :return: list of non-executable (masked) actions ''' array_slot_summary = SummaryUtils.arraySlotSummary(belief, self.domainString) array_slot_summary_rel = SummaryUtilsRel.arraySlotSummaryRel(belief, self.domainString) global_summary = SummaryUtils.globalSummary(belief, self.domainString) if global_summary['GLOBAL_BYALTERNATIVES'] and not global_summary['GLOBAL_THANKYOU'] and not global_summary['GLOBAL_ACK']: self.alternatives_requested = True nonexec = ['pass'] for action in self.action_names: mask_action = False if 'rel' in action: if "request_" in action: nonexec.append(action) # pass # if mask_action and self.request_mask: # nonexec.append(action) elif "select_" in action: slot_summary = array_slot_summary_rel['_'.join(action.split('_')[2:])] top_prob = slot_summary['TOPHYPS'][0][1] sec_prob = slot_summary['TOPHYPS'][1][1] if top_prob == 0 or sec_prob == 0: mask_action = True if mask_action and self.request_mask: nonexec.append(action) elif "confirm_" in action: slot_summary = array_slot_summary_rel['_'.join(action.split('_')[2:])] top_prob = slot_summary['TOPHYPS'][0][1] if top_prob == 0: mask_action = True if mask_action and self.request_mask: nonexec.append(action) else: if action == "inform": acceptance_list = SummaryUtils.getTopBeliefs(belief, domainString=self.domainString) discriminable = SummaryUtils.acceptanceListCanBeDiscriminated(acceptance_list, self.domainString) if not global_summary['GLOBAL_BYCONSTRAINTS']: mask_action = True if global_summary['GLOBAL_COUNTACCEPTED'] < self.inform_count_accepted and discriminable: mask_action = True if mask_action and self.inform_mask: nonexec.append(action) elif action == "inform_byname": if not global_summary['GLOBAL_BYNAME']: mask_action = True if belief['features']['lastInformedVenue'] == '' \ and SummaryUtils.getTopBelief(belief['beliefs']['name'])[0] == '**NONE**' : mask_action = True if mask_action and self.inform_mask: nonexec.append(action) elif action == "inform_alternatives": if not self.alternatives_requested: mask_action = True if belief['features']['lastInformedVenue'] == '': mask_action = True if mask_action and self.inform_mask: nonexec.append(action) elif action == "bye": if not global_summary['GLOBAL_FINISHED']: mask_action = True if mask_action and self.bye_mask: nonexec.append(action) elif action == "repeat": if not global_summary['GLOBAL_REPEAT'] or lastSystemAction is None: mask_action = True mask_action = True # ic340: this action is "deactivated" because simuser doesnt know how to react to it if mask_action: nonexec.append(action) elif action == "reqmore": if belief['features']['lastInformedVenue'] == '': mask_action = True if mask_action and self.request_mask: nonexec.append(action) elif action == "restart": if not global_summary['GLOBAL_RESTART']: mask_action = True mask_action = True # ic340: this action is "deactivated" because simuser doesnt know how to react to it if mask_action: nonexec.append(action) elif "request_" in action: pass if mask_action and self.request_mask: nonexec.append(action) elif "select_" in action: slot_summary = array_slot_summary[action.split("_")[1]] top_prob = slot_summary['TOPHYPS'][0][1] sec_prob = slot_summary['TOPHYPS'][1][1] if top_prob == 0 or sec_prob == 0: mask_action = True if mask_action and self.request_mask: nonexec.append(action) elif "confirm_" in action: slot_summary = array_slot_summary[action.split("_")[1]] top_prob = slot_summary['TOPHYPS'][0][1] if top_prob == 0: mask_action = True if mask_action and self.request_mask: nonexec.append(action) elif "confreq_" in action: slot_summary = array_slot_summary[action.split("_")[1]] top_prob = slot_summary['TOPHYPS'][0][1] if top_prob == 0: mask_action = True if mask_action and self.request_mask: nonexec.append(action) logger.dial('masked inform actions:' + str([act for act in nonexec if 'inform' in act])) return nonexec
def getInformByName(self, belief): requested_slots = SummaryUtilsRel.getRequestedSlots(belief) name = SummaryUtils.getTopBelief(belief['beliefs']['name'])[0] if name == '**NONE**': name = belief['features']['lastInformedVenue'] return SummaryUtilsRel.getInformRequestedSlots(requested_slots, name, self.domainString)
def getGlobalAction(belief, globalact, domainString): '''**Method for global action:** returns action :param belief: full belief state :type belief: dict :param globalact: - str of globalActionName, e.g. 'INFORM_REQUESTED' :type globalact: int :param domainString: domain tag :type domainString: str :returns: (str) action ''' # First get the name for the name goal. topvalue, topbelief = SummaryUtils.getTopBelief(belief['beliefs']['name']) toptwo, _ = SummaryUtils.getTopBeliefsExcludingNone(belief['beliefs']['name']) if topvalue == '**NONE**' or topvalue == 'dontcare' or topbelief < 0.8: topnamevalue = '' else: topnamevalue = toptwo[0][0] lastInformedVenue = belief['features']['lastInformedVenue'] informedVenueSinceNone = belief['features']['informedVenueSinceNone'] acceptanceList = SummaryUtils.getTopBeliefs(belief, domainString=domainString) inform_threshold = 0 if Settings.config.has_option("policy", "informthreshold"): inform_threshold = float(Settings.config.get('policy','informthreshold')) if inform_threshold > 0: acceptanceList80 = SummaryUtils.getTopBeliefs(belief, inform_threshold, domainString=domainString) else: acceptanceList80 = acceptanceList requestedSlots = SummaryUtils.getRequestedSlots(belief) # logger.debug('topnamevalue = %s, lastInformedVenue = %s' % (topnamevalue, lastInformedVenue)) if topnamevalue == '' and lastInformedVenue != '': # logger.debug('topnamevalue is None, but copy lastInformedVenue') topnamevalue = lastInformedVenue if globalact == 'INFORM_REQUESTED': if topnamevalue != '': return _getInformRequestedSlots(acceptanceList80, requestedSlots, topnamevalue, domainString) else: return _getInformRequestedSlots(acceptanceList80, requestedSlots, 'none', domainString) elif globalact == 'INFORM_ALTERNATIVES': #if lastInformedVenue == '': # print 'Cant inform alternatives no last informed venue' # return 'null()' #else: return _getInformAlternativeEntities(acceptanceList, acceptanceList80, informedVenueSinceNone, domainString) elif globalact == 'INFORM_MORE': #ic340: is this ever used? if len(informedVenueSinceNone) > 0 and topnamevalue != '': return _getInformMoreEntity(topnamevalue, domainString) else: return _getInformMoreEntity('none', domainString) elif globalact == 'INFORM_BYNAME': return _getInformAlternativeEntities(acceptanceList, acceptanceList80, [], domainString) elif globalact == 'INFORM_REPEAT': return 'null()' elif globalact == 'REQMORE': if lastInformedVenue != '': return 'reqmore()' else: return 'null()' elif globalact == 'BYE': return 'bye()' elif globalact == 'RESTART': return 'null()' else: logger.warning('Invalid global summary action name: ' + globalact) return 'null()'