def do_predictor_rollout(predictor_args, initial_state, act_list, noise_list,
                         step):
    """act_list: list with num_rollout_per_cpu elements, each element is np.array with size (H, dim_u)"""
    # print('begin rollout...')
    predictor = Predictor(*predictor_args)
    print('predictor built successfully')
    paths = []
    N = len(act_list)
    H = act_list[0].shape[0]
    for i in range(N):
        predictor.catch_up(*initial_state)
        act = []
        noise = []
        obs = []
        cost = []
        for k in range(H):
            obs.append(predictor._get_obs())
            act.append(act_list[i][k])
            noise.append(noise_list[i][k])
            c = predictor.predict(act[-1], step)
            cost.append(c)

        path = dict(observations=np.array(obs),
                    actions=np.array(act),
                    costs=np.array(cost),
                    noise=np.array(noise))
        paths.append(path)

    return paths