diff --git a/docs/pyerrors/linalg.html b/docs/pyerrors/linalg.html index 377b0907..84e6b0db 100644 --- a/docs/pyerrors/linalg.html +++ b/docs/pyerrors/linalg.html @@ -146,7 +146,7 @@ n_obs = len(raveled_data) new_names = sorted(set([y for x in [o.names for o in raveled_data] for y in x])) - is_merged = len(list(filter(lambda o: o.is_merged is True, raveled_data))) > 0 + is_merged = {name: (len(list(filter(lambda o: o.is_merged.get(name, False) is True, raveled_data))) > 0) for name in new_names} reweighted = len(list(filter(lambda o: o.reweighted is True, raveled_data))) > 0 new_idl_d = {} for name in new_names: @@ -156,8 +156,8 @@ if tmp is not None: idl.append(tmp) new_idl_d[name] = _merge_idx(idl) - if not is_merged: - is_merged = (1 != len(set([len(idx) for idx in [*idl, new_idl_d[name]]]))) + if not is_merged[name]: + is_merged[name] = (1 != len(set([len(idx) for idx in [*idl, new_idl_d[name]]]))) if data.ndim == 1: values = np.array([o.value for o in data]) @@ -204,17 +204,19 @@ new_samples = [] new_means = [] new_idl = [] - if is_merged: - filtered_names, filtered_deltas, filtered_idl_d = _filter_zeroes(new_names, new_deltas, new_idl_d) - else: - filtered_names = new_names - filtered_deltas = new_deltas - filtered_idl_d = new_idl_d - for name in filtered_names: + filtered_deltas = {} + filtered_idl_d = {} + for name in new_names: + if is_merged[name]: + filtered_deltas[name], filtered_idl_d[name] = _filter_zeroes(new_deltas[name], new_idl_d[name]) + else: + filtered_deltas[name] = new_deltas[name] + filtered_idl_d[name] = new_idl_d[name] + for name in new_names: new_samples.append(filtered_deltas[name]) new_means.append(new_r_values[name][i_val]) new_idl.append(filtered_idl_d[name]) - final_result[i_val] = Obs(new_samples, filtered_names, means=new_means, idl=new_idl) + final_result[i_val] = Obs(new_samples, new_names, means=new_means, idl=new_idl) final_result[i_val]._value = new_val final_result[i_val].is_merged = is_merged final_result[i_val].reweighted = reweighted @@ -757,7 +759,7 @@ n_obs = len(raveled_data) new_names = sorted(set([y for x in [o.names for o in raveled_data] for y in x])) - is_merged = len(list(filter(lambda o: o.is_merged is True, raveled_data))) > 0 + is_merged = {name: (len(list(filter(lambda o: o.is_merged.get(name, False) is True, raveled_data))) > 0) for name in new_names} reweighted = len(list(filter(lambda o: o.reweighted is True, raveled_data))) > 0 new_idl_d = {} for name in new_names: @@ -767,8 +769,8 @@ if tmp is not None: idl.append(tmp) new_idl_d[name] = _merge_idx(idl) - if not is_merged: - is_merged = (1 != len(set([len(idx) for idx in [*idl, new_idl_d[name]]]))) + if not is_merged[name]: + is_merged[name] = (1 != len(set([len(idx) for idx in [*idl, new_idl_d[name]]]))) if data.ndim == 1: values = np.array([o.value for o in data]) @@ -815,17 +817,19 @@ new_samples = [] new_means = [] new_idl = [] - if is_merged: - filtered_names, filtered_deltas, filtered_idl_d = _filter_zeroes(new_names, new_deltas, new_idl_d) - else: - filtered_names = new_names - filtered_deltas = new_deltas - filtered_idl_d = new_idl_d - for name in filtered_names: + filtered_deltas = {} + filtered_idl_d = {} + for name in new_names: + if is_merged[name]: + filtered_deltas[name], filtered_idl_d[name] = _filter_zeroes(new_deltas[name], new_idl_d[name]) + else: + filtered_deltas[name] = new_deltas[name] + filtered_idl_d[name] = new_idl_d[name] + for name in new_names: new_samples.append(filtered_deltas[name]) new_means.append(new_r_values[name][i_val]) new_idl.append(filtered_idl_d[name]) - final_result[i_val] = Obs(new_samples, filtered_names, means=new_means, idl=new_idl) + final_result[i_val] = Obs(new_samples, new_names, means=new_means, idl=new_idl) final_result[i_val]._value = new_val final_result[i_val].is_merged = is_merged final_result[i_val].reweighted = reweighted diff --git a/docs/pyerrors/obs.html b/docs/pyerrors/obs.html index b283b2e9..5a93288f 100644 --- a/docs/pyerrors/obs.html +++ b/docs/pyerrors/obs.html @@ -438,7 +438,7 @@ raise Exception('Incompatible samples and idx for %s: %d vs. %d' % (name, len(sample), self.shape[name])) self.r_values[name] = np.mean(sample) self.deltas[name] = sample - self.r_values[name] - self.is_merged = False + self.is_merged = {} self.N = sum(list(self.shape.values())) self._value = 0 @@ -1267,44 +1267,33 @@ return np.array([ret[new_idx[i] - new_idx[0]] for i in range(len(new_idx))]) -def _filter_zeroes(names, deltas, idl, eps=Obs.filter_eps): +def _filter_zeroes(deltas, idx, eps=Obs.filter_eps): """Filter out all configurations with vanishing fluctuation such that they do not - contribute to the error estimate anymore. Returns the new names, deltas and - idl according to the filtering. + contribute to the error estimate anymore. Returns the new deltas and + idx according to the filtering. A fluctuation is considered to be vanishing, if it is smaller than eps times the mean of the absolute values of all deltas in one list. Parameters ---------- - names : list - List of names - deltas : dict - Dict lists of fluctuations - idx : dict - Dict of lists or ranges of configs on which the deltas are defined. - Has to be a subset of new_idx. + deltas : list + List of fluctuations + idx : list + List or ranges of configs on which the deltas are defined. eps : float Prefactor that enters the filter criterion. """ - new_names = [] - new_deltas = {} - new_idl = {} - for name in names: - nd = [] - ni = [] - maxd = np.mean(np.fabs(deltas[name])) - for i in range(len(deltas[name])): - if not np.isclose(0.0, deltas[name][i], atol=eps * maxd): - nd.append(deltas[name][i]) - ni.append(idl[name][i]) - if nd: - new_names.append(name) - new_deltas[name] = np.array(nd) - new_idl[name] = ni - if new_names: - return (new_names, new_deltas, new_idl) + new_deltas = [] + new_idx = [] + maxd = np.mean(np.fabs(deltas)) + for i in range(len(deltas)): + if abs(deltas[i]) > eps * maxd: + new_deltas.append(deltas[i]) + new_idx.append(idx[i]) + if new_idx: + return np.array(new_deltas), new_idx else: - return (names, deltas, idl) + return deltas, idx def derived_observable(func, data, **kwargs): @@ -1354,7 +1343,7 @@ n_obs = len(raveled_data) new_names = sorted(set([y for x in [o.names for o in raveled_data] for y in x])) - is_merged = len(list(filter(lambda o: o.is_merged is True, raveled_data))) > 0 + is_merged = {name: (len(list(filter(lambda o: o.is_merged.get(name, False) is True, raveled_data))) > 0) for name in new_names} reweighted = len(list(filter(lambda o: o.reweighted is True, raveled_data))) > 0 new_idl_d = {} for name in new_names: @@ -1364,8 +1353,8 @@ if tmp is not None: idl.append(tmp) new_idl_d[name] = _merge_idx(idl) - if not is_merged: - is_merged = (1 != len(set([len(idx) for idx in [*idl, new_idl_d[name]]]))) + if not is_merged[name]: + is_merged[name] = (1 != len(set([len(idx) for idx in [*idl, new_idl_d[name]]]))) if data.ndim == 1: values = np.array([o.value for o in data]) @@ -1430,17 +1419,17 @@ new_samples = [] new_means = [] new_idl = [] - if is_merged: - filtered_names, filtered_deltas, filtered_idl_d = _filter_zeroes(new_names, new_deltas, new_idl_d) - else: - filtered_names = new_names - filtered_deltas = new_deltas - filtered_idl_d = new_idl_d - for name in filtered_names: - new_samples.append(filtered_deltas[name]) + for name in new_names: + if is_merged[name]: + filtered_deltas, filtered_idl_d = _filter_zeroes(new_deltas[name], new_idl_d[name]) + else: + filtered_deltas = new_deltas[name] + filtered_idl_d = new_idl_d[name] + + new_samples.append(filtered_deltas) + new_idl.append(filtered_idl_d) new_means.append(new_r_values[name][i_val]) - new_idl.append(filtered_idl_d[name]) - final_result[i_val] = Obs(new_samples, filtered_names, means=new_means, idl=new_idl) + final_result[i_val] = Obs(new_samples, new_names, means=new_means, idl=new_idl) final_result[i_val]._value = new_val final_result[i_val].is_merged = is_merged final_result[i_val].reweighted = reweighted @@ -1562,7 +1551,7 @@ new_idl.append(obs_a.idl[name]) o = Obs(new_samples, sorted(obs_a.names), idl=new_idl) - o.is_merged = obs_a.is_merged or obs_b.is_merged + o.is_merged = {name: (obs_a.is_merged.get(name, False) or obs_b.is_merged.get(name, False)) for name in o.names} o.reweighted = obs_a.reweighted or obs_b.reweighted return o @@ -1923,7 +1912,7 @@ names = sorted(new_dict.keys()) o = Obs([new_dict[name] for name in names], names, idl=[idl_dict[name] for name in names]) - o.is_merged = np.any([oi.is_merged for oi in list_of_obs]) + o.is_merged = {name: np.any([oi.is_merged.get(name, False) for oi in list_of_obs]) for name in o.names} o.reweighted = np.max([oi.reweighted for oi in list_of_obs]) return o @@ -2052,7 +2041,7 @@ raise Exception('Incompatible samples and idx for %s: %d vs. %d' % (name, len(sample), self.shape[name])) self.r_values[name] = np.mean(sample) self.deltas[name] = sample - self.r_values[name] - self.is_merged = False + self.is_merged = {} self.N = sum(list(self.shape.values())) self._value = 0 @@ -2807,7 +2796,7 @@ this overwrites the standard value for that ensemble. raise Exception('Incompatible samples and idx for %s: %d vs. %d' % (name, len(sample), self.shape[name])) self.r_values[name] = np.mean(sample) self.deltas[name] = sample - self.r_values[name] - self.is_merged = False + self.is_merged = {} self.N = sum(list(self.shape.values())) self._value = 0 @@ -4428,7 +4417,7 @@ should agree with samples from a full jackknife analysis up to O(1/N). n_obs = len(raveled_data) new_names = sorted(set([y for x in [o.names for o in raveled_data] for y in x])) - is_merged = len(list(filter(lambda o: o.is_merged is True, raveled_data))) > 0 + is_merged = {name: (len(list(filter(lambda o: o.is_merged.get(name, False) is True, raveled_data))) > 0) for name in new_names} reweighted = len(list(filter(lambda o: o.reweighted is True, raveled_data))) > 0 new_idl_d = {} for name in new_names: @@ -4438,8 +4427,8 @@ should agree with samples from a full jackknife analysis up to O(1/N). if tmp is not None: idl.append(tmp) new_idl_d[name] = _merge_idx(idl) - if not is_merged: - is_merged = (1 != len(set([len(idx) for idx in [*idl, new_idl_d[name]]]))) + if not is_merged[name]: + is_merged[name] = (1 != len(set([len(idx) for idx in [*idl, new_idl_d[name]]]))) if data.ndim == 1: values = np.array([o.value for o in data]) @@ -4504,17 +4493,17 @@ should agree with samples from a full jackknife analysis up to O(1/N). new_samples = [] new_means = [] new_idl = [] - if is_merged: - filtered_names, filtered_deltas, filtered_idl_d = _filter_zeroes(new_names, new_deltas, new_idl_d) - else: - filtered_names = new_names - filtered_deltas = new_deltas - filtered_idl_d = new_idl_d - for name in filtered_names: - new_samples.append(filtered_deltas[name]) + for name in new_names: + if is_merged[name]: + filtered_deltas, filtered_idl_d = _filter_zeroes(new_deltas[name], new_idl_d[name]) + else: + filtered_deltas = new_deltas[name] + filtered_idl_d = new_idl_d[name] + + new_samples.append(filtered_deltas) + new_idl.append(filtered_idl_d) new_means.append(new_r_values[name][i_val]) - new_idl.append(filtered_idl_d[name]) - final_result[i_val] = Obs(new_samples, filtered_names, means=new_means, idl=new_idl) + final_result[i_val] = Obs(new_samples, new_names, means=new_means, idl=new_idl) final_result[i_val]._value = new_val final_result[i_val].is_merged = is_merged final_result[i_val].reweighted = reweighted @@ -4676,7 +4665,7 @@ on the configurations in obs[i].idl. new_idl.append(obs_a.idl[name]) o = Obs(new_samples, sorted(obs_a.names), idl=new_idl) - o.is_merged = obs_a.is_merged or obs_b.is_merged + o.is_merged = {name: (obs_a.is_merged.get(name, False) or obs_b.is_merged.get(name, False)) for name in o.names} o.reweighted = obs_a.reweighted or obs_b.reweighted return o @@ -5272,7 +5261,7 @@ name of the ensemble the samples are defined on. names = sorted(new_dict.keys()) o = Obs([new_dict[name] for name in names], names, idl=[idl_dict[name] for name in names]) - o.is_merged = np.any([oi.is_merged for oi in list_of_obs]) + o.is_merged = {name: np.any([oi.is_merged.get(name, False) for oi in list_of_obs]) for name in o.names} o.reweighted = np.max([oi.reweighted for oi in list_of_obs]) return o