def precompute_obj_identifiers_with_action()

in cater_preprocessing/utils.py [0:0]


def precompute_obj_identifiers_with_action(scene_struct, period_idx, interval_type, relation):
    if interval_type=='atomic':
        filter_options = scene_struct['_action_filter_options'][period_idx]
        all_identifiers = scene_struct['_object_identifiers_with_action']
        min_identifiers = scene_struct['_minimal_object_identifiers_with_action']
    elif interval_type == 'compositional':
        filter_options = scene_struct['_actions_filter_options'][period_idx][relation]
        all_identifiers = scene_struct['_object_identifiers_with_actions']
        min_identifiers = scene_struct['_minimal_object_identifiers_with_actions']
    out = {}
    duplicate_objs = False 
    for k,v in filter_options.items(): 
        #if k[0] is None: continue 
        if len(v) != 1: continue 
        obj = list(v)[0]
        if obj not in out: out[obj] = []
        out[obj].append(k)
    #pdb.set_trace()
    if len(out) != len(scene_struct['objects']): duplicate_objs = True  
    output = [None] * len(scene_struct['objects'])
    num_not_nones = [None] * len(scene_struct['objects'])
    for k,v in out.items():
        output[k] = v 
        num_not_none = []
        for i in v: 
            num_not_none.append(int(i[0]!=None)+int(i[1]!=None)+int(i[2]!=None)+int(i[3]!=None)+int(i[4]!=None))
        num_not_nones[k] = num_not_none
    minimal_output = [None] * len(output) 
    for i, os in enumerate(output): 
        if os == None: continue 
        m = min(num_not_nones[i])
        identifiers = []
        for j, o in enumerate(os): 
            if num_not_nones[i][j] == m: 
                identifiers.append(o)
        minimal_output[i] = identifiers 
    #only include identifiers with action as !None 
    action_minimal_output = [None] * len(output) 
    for k,vs in enumerate(minimal_output):
        act_vs = []
        if vs is None: continue 
        for v in vs:
            if v[0] is None: continue 
            act_vs.append(v)
        if len(act_vs)>0:
            action_minimal_output[k] = act_vs
    if interval_type=='atomic':
        all_identifiers[period_idx] = output 
        min_identifiers[period_idx] = action_minimal_output 
    elif interval_type == 'compositional':
        if period_idx not in all_identifiers:
            all_identifiers[period_idx] = {} 
            min_identifiers[period_idx] = {}
        all_identifiers[period_idx][relation] = output 
        min_identifiers[period_idx][relation] = action_minimal_output 
    return duplicate_objs