def make_query_action_handler()

in dvd_generation/simulators/temporal_question_engine.py [0:0]


def make_query_action_handler(attribute):
    def query_action_handler(scene_struct, inputs, side_inputs, period_idx, period_relation='during'):
        assert len(inputs) == 1
        if len(side_inputs) != 0 and attribute not in ['action_order', 'action_freq']:
            pdb.set_trace()
        idx = inputs[0]
        obj = scene_struct['objects'][idx]
        if attribute == 'action': 
            period_idx = period_idx = convert_to_compositional_period_idx(scene_struct, period_idx)
            all_moves = scene_struct['_action_list'][period_idx][period_relation][idx]
            all_moves = remove_contained_act(all_moves)
            if all_moves is not None: 
                assert len(all_moves)==1
                return next(iter(all_moves))
            return 'no action'
            #all_moves = get_action_by_moment(scene_struct, idx, period_idx, include_moving=False)
            #assert len(all_moves)==1
            #if  list(all_moves)[0] == 'static' or  list(all_moves)[0] == 'stationary':
            #    return 'no action'
            #return list(all_moves)[0]
        elif attribute == 'action_set':
            all_moves = scene_struct['_action_list'][period_idx][period_relation][idx]
            all_moves = remove_contained_act(all_moves)
            if all_moves is not None: 
                return ','.join(sorted(set(all_moves)))
            return 'no action'
        elif attribute == 'action_seq':
            all_moves = scene_struct['_action_list'][period_idx][period_relation][idx]
            all_moves = remove_contained_act(all_moves)
            if all_moves is not None: 
                return ','.join(all_moves)
            return 'no action'
        elif attribute == 'action_order':
            all_moves = scene_struct['_action_list'][period_idx][period_relation][idx]
            all_moves = remove_contained_act(all_moves)
            if all_moves is not None: 
                assert len(all_moves)>0
                if side_inputs[0] == 'last':
                    return all_moves[-1]
                else:
                    order = reverse_ordinal_map[side_inputs[0]]
                    if len(all_moves)>=order:
                        return all_moves[order-1]
            return 'no action'
        elif attribute == 'action_freq':
            all_moves = scene_struct['_action_list'][period_idx][period_relation][idx]
            all_moves = remove_contained_act(all_moves)
            out = []
            if all_moves is not None: 
                assert len(all_moves)>0
                all_freqs = Counter(all_moves)
                if side_inputs[0] == 'the most': 
                    freq = max(all_freqs.values())
                elif side_inputs[0] == 'the least':
                    freq = min(all_freqs.values())
                else:
                    freq = frequency_to_number[side_inputs[0]]
                for k,v in all_freqs.items():
                    if v == freq:
                        out.append(k)
            if len(out)>0:
                return ','.join(sorted(set(out)))
            return 'no action'
        else:
            pdb.set_trace()

    return query_action_handler