def sample_prior_unique_object()

in dvd_generation/filters/dialogue_filters.py [0:0]


def sample_prior_unique_object(dialogue, template, cutoff): #, turn_dependencies, metadata):
    if len(dialogue)==0:
        template['prior_unique_obj'] = -1 
        return 
    
    last_turn = dialogue[-1]
    prior_state = last_turn['state']
    last_template = last_turn['template']
    prior_obj = last_template['unique_obj'] 
    all_prior_objs = last_template['all_unique_objs']
    prior_ans_obj = last_template['answer_obj']
    used_objects = template['used_objects']
    
    # Case 1: previous dialogue turn is an exist (e.g. Is there...) or count (e.g. How many...)
    if prior_ans_obj is not None:
        if template['sampled_ans_object']!=-1: 
            template['prior_unique_obj'] = template['sampled_ans_object']
            template['prior_unique_obj_attr'] = template['sampled_ans_object_attr']
            return 
        
        # ask further about resulting object if count question result is 1/ exist question result is True
        # else, there is no prior unique obj
        template['prior_unique_obj'], template['prior_unique_obj_attr'], _ = find_unique_answer_obj(
            last_turn, prior_state, prior_ans_obj, used_objects)
        return

    # Case 2: the only unique object came from temporal dependency
    if prior_obj is None and len(all_prior_objs)==0:
        # temporal phrase is not during/before/after/among
        if last_template['interval_type']!='none' and 'none' in last_turn['turn_dependencies']['temporal']:
            e1, e2 = last_template['used_periods'][-1] 
            # interval that involves more than one object 
            if e1 is not None and e2 != cutoff and e1[0] != e2[0]:
                template['prior_unique_obj'] = -1
                return 
            if e1 is not None:
                template['prior_unique_obj'], template['prior_unique_obj_attr'] = e1[0], used_objects[e1[0]]
                return
            elif e2 != cutoff:
                template['prior_unique_obj'], template['prior_unique_obj_attr'] = e2[0], used_objects[e2[0]]
                return 
            else:
                template['prior_unique_obj'] = -1 
                return
        else:
            template['prior_unique_obj'] = -1 
            return
    
    if prior_obj is None:
        template['prior_unique_obj'] = -1 
        return 
    
    # Only one prior object (nonambiguous) from the last turn 
    template['prior_unique_obj'], template['prior_unique_obj_attr'] = find_unique_obj(
        last_turn, prior_state, prior_obj, used_objects)
    return