def _scan_params_job(settings):
    return Simulation(single=True, **settings)

def scan_params(dir, IVs, **params):
    values = [np.atleast_1d(p) for p in params.values()]
    res = np.empty(tuple(p.size for p in values), dtype=object)
    jobs = [dict(zip(params, comb)) for comb in itertools.product(*values)]
    for job in jobs:
        job['dir'] = dir
        job['currents'] = IVs

    ans = exe_map()(_scan_params_job, jobs)
    res.flat = ans
    return res

def scan_missing(dir, group):
    IVs = group[0].injection
    params = group[0].params.keys()
    values, _ = convert_to_values(group, None, None, *params)
    missing = utilities.find_missing(values)
    res = np.empty((values.shape[0],), dtype=object)
    jobs = [dict(zip(params, comb)) for comb in missing]
    for job in jobs:
        job['dir'] = dir
        job['currents'] = IVs

    ans = exe_map()(_scan_params_job, jobs)
    res.flat = ans
    return res