예제 #1
0
파일: base.py 프로젝트: lqiang2003cn/dps
def nested_sample(param_dist, n_samples=1):
    """ Generate all samples from a distribution.

    Distribution must be specified as a dictionary mapping
    from names to either a list of possible values or a distribution
    (i.e. has a method `rvs`).

    """
    assert isinstance(param_dist, dict)
    config = Config(param_dist)
    flat = config.flatten()
    other = {}
    samples = []

    sampled_keys = []

    for k in sorted(flat.keys()):
        v = flat[k]
        try:
            samples.append(list(np.random.choice(list(v), size=n_samples)))
        except (TypeError, ValueError):
            if hasattr(v, 'rvs'):
                samples.append(v.rvs(n_samples))
                sampled_keys.append(k)
            else:
                other[k] = v
        else:
            sampled_keys.append(k)

    samples = sorted(zip(*samples))

    configs = []
    for sample in samples:
        new = Config(deepcopy(other.copy()))
        for k, s in zip(sampled_keys, sample):
            new[k] = s
        configs.append(type(param_dist)(new))
    return configs
예제 #2
0
파일: base.py 프로젝트: lqiang2003cn/dps
def generate_all(param_dist):
    """ Generate all samples from a parameter distribution.

    Distribution must be specified as a dictionary mapping
    from names to lists of possible values.

    """
    assert isinstance(param_dist, dict)
    config = Config(param_dist)
    flat = config.flatten()
    other = {}

    sampled_keys = []
    lists = []

    for k in sorted(flat.keys()):
        v = flat[k]
        try:
            lists.append(list(v))
        except (TypeError, ValueError):
            if hasattr(v, 'rvs'):
                raise Exception(
                    "Attempting to generate all samples, but element {} "
                    "with key {} is a continuous distribution.".format(v, k))
            other[k] = v
        else:
            sampled_keys.append(k)

    param_sets = sorted(product(*lists))

    configs = []
    for pset in param_sets:
        new = Config(deepcopy(other.copy()))
        for k, p in zip(sampled_keys, pset):
            new[k] = p
        configs.append(type(param_dist)(new))
    return configs