def reduce(self, store_results=True): # Terminaison (leaf) node return results if not self.children: return self.load_state(name="results") # 1) Build sub-aggregates over children children_results = [child.reduce(store_results=False) for child in self.children] result_set = ResultSet(*children_results) if not self.reducer: return result_set # Group by key, without consideration of the fold/permutation number # which is the head of the key # use OrderedDict to preserve runing order from collections import OrderedDict groups = OrderedDict() for result in result_set: # remove the head of the key _, key_tail = key_pop(result["key"], index=0) result["key"] = key_tail key_tail = result["key"] if not key_tail in groups: groups[key_tail] = list() groups[key_tail].append(result) # For each key, stack results reduced = ResultSet() for key in groups: result_stacked = Result.stack(*groups[key]) reduced.add(self.reducer.reduce(result_stacked)) return reduced
def reduce(self, store_results=True): # Terminaison (leaf) node return results if not self.children: return self.load_results() # 1) Build sub-aggregates over children children_results = [ child.reduce(store_results=False) for child in self.children ] result_set = ResultSet(*children_results) if not self.reducer: return result_set if not self.need_group_key: reduced = ResultSet() reduced.add(self.reducer.reduce(result_set)) return reduced # Group by key, without consideration of the fold/permutation number # which is the head of the key # use OrderedDict to preserve runing order from collections import OrderedDict groups = OrderedDict() for result in result_set: # remove the head of the key _, key_tail = key_pop(result["key"], index=0) result["key"] = key_tail if not key_tail in groups: groups[key_tail] = list() groups[key_tail].append(result) # For each key, stack results reduced = ResultSet() for key in groups: result_stacked = Result.stack(*groups[key]) reduced.add(self.reducer.reduce(result_stacked)) return reduced