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
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