def test_vector_aggfunc_multiple_trigger(self): """TestAggregator: multi trigger vector aggfunc""" def aggfunc(series): return series.cumsum() filters = {"result": "fire"} event_class = self._trace.aim_and_fire value = 1 pivot = "identifier" trigger_fire = Trigger(self._trace, event_class, filters, value, pivot) filters = {"result": "blank"} value = -1 trigger_blank = Trigger(self._trace, event_class, filters, value, pivot) aggregator = MultiTriggerAggregator([trigger_fire, trigger_blank], self.topology, aggfunc=aggfunc) # There are three "fire" in total # The all level in topology looks like # [[0, 1]] result = aggregator.aggregate(level="all") expected_result = pd.Series([1.0, 0.0, 1.0, 0.0, 1.0, 0.0], index=pd.Index( [0.1, 0.2, 0.3, 0.4, 0.5, 0.6])) assert_series_equal(result[0], expected_result)
def test_default_aggfunc_multiple_trigger(self): """MultiTriggerAggregator with the default aggfunc""" trigger_fire = Trigger(self._trace, self._trace.aim_and_fire, filters={"result": "fire"}, pivot="identifier", value=1) trigger_blank = Trigger(self._trace, self._trace.aim_and_fire, filters={"result": "blank"}, pivot="identifier", value=2) aggregator = MultiTriggerAggregator([trigger_fire, trigger_blank], self.topology) results = aggregator.aggregate(level="cpu") expected_results = [ pd.Series([1., 2., 1., 0., 0., 0.], index=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]), pd.Series([0., 0., 0., 2., 1., 2.], index=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]), ] self.assertEqual(len(results), len(expected_results)) for result, expected in zip(results, expected_results): assert_series_equal(result, expected)
def test_vector_aggfunc_single_trigger(self): """TestAggregator: 1 trigger vector aggfunc""" def aggfunc(series): return series.cumsum() filters = { "result": "fire" } event_class = self._trace.aim_and_fire value = 1 pivot = "identifier" trigger = Trigger(self._trace, event_class, filters, value, pivot) aggregator = MultiTriggerAggregator([trigger], self.topology, aggfunc=aggfunc) # There are three "fire" in total # The all level in topology looks like # [[0, 1]] result = aggregator.aggregate(level="all") expected_result = pd.Series([1.0, 1.0, 2.0, 2.0, 3.0, 3.0], index=pd.Index([0.1, 0.2, 0.3, 0.4, 0.5, 0.6]) ) assert_series_equal(result[0], expected_result)
def test_scalar_aggfunc_single_trigger(self): """TestAggregator: 1 trigger scalar aggfunc""" def aggfunc(series): return series.sum() filters = {"result": "fire"} event_class = self._trace.aim_and_fire value = 1 pivot = "identifier" trigger = Trigger(self._trace, event_class, filters, value, pivot) aggregator = MultiTriggerAggregator([trigger], self.topology, aggfunc=aggfunc) # There are three "fire" in total # The all level in topology looks like # [[0, 1]] result = aggregator.aggregate(level="all") self.assertEqual(result, [3.0]) # There are two "fire" on the first node group and a # a single "fire" on the second node group at the cluster # level which looks like # [[0], [1]] result = aggregator.aggregate(level="cluster") self.assertEqual(result, [2.0, 1.0])
def test_default_aggfunc_multiple_trigger(self): """MultiTriggerAggregator with the default aggfunc""" trigger_fire = Trigger(self._trace, self._trace.aim_and_fire, filters={"result": "fire"}, pivot="identifier", value=1) trigger_blank = Trigger(self._trace, self._trace.aim_and_fire, filters={"result": "blank"}, pivot="identifier", value=2) aggregator = MultiTriggerAggregator([trigger_fire, trigger_blank], self.topology) results = aggregator.aggregate(level="cpu") expected_results = [ pd.Series([1., 2., 1., 0., 0., 0.], index=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]), pd.Series([0., 0., 0., 2., 1., 2.], index=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]), ] self.assertEquals(len(results), len(expected_results)) for result, expected in zip(results, expected_results): assert_series_equal(result, expected)
def _generate_matrix(self, run, reference_run, aggfunc): """Generate the Correlation Matrix""" reference_aggs = [] aggs = [] for idx in range(self._dimension): reference_aggs.append( MultiTriggerAggregator( sched_funcs.sched_triggers(reference_run, self._reference_pids[idx], trappy.sched.SchedSwitch), self._topology, aggfunc)) aggs.append( MultiTriggerAggregator( sched_funcs.sched_triggers(run, self._pids[idx], trappy.sched.SchedSwitch), self._topology, aggfunc)) agg_pair_gen = ((r_agg, agg) for r_agg in reference_aggs for agg in aggs) # pylint fails to recognize numpy members. # pylint: disable=no-member matrix = np.zeros((self._dimension, self._dimension)) # pylint: enable=no-member for (ref_result, test_result) in agg_pair_gen: i = reference_aggs.index(ref_result) j = aggs.index(test_result) corr = Correlator(ref_result, test_result, corrfunc=sched_funcs.binary_correlate, filter_gaps=True) _, total = corr.correlate(level="cluster") matrix[i][j] = total return matrix
def _aggregator(self, aggfunc): """ Returns an aggregator corresponding to the aggfunc, the aggregators are memoized for performance Args: aggfunc (function(pandas.Series)): Function parameter that accepts a pandas.Series object and returns a vector/scalar result """ if aggfunc not in self._aggs.keys(): self._aggs[aggfunc] = MultiTriggerAggregator( self._triggers, self._topology, aggfunc) return self._aggs[aggfunc]
def test_scalar_aggfunc_single_trigger(self): """TestAggregator: 1 trigger scalar aggfunc""" def aggfunc(series): return series.sum() filters = { "result": "fire" } event_class = self._trace.aim_and_fire value = 1 pivot = "identifier" trigger = Trigger(self._trace, event_class, filters, value, pivot) aggregator = MultiTriggerAggregator([trigger], self.topology, aggfunc=aggfunc) # There are three "fire" in total # The all level in topology looks like # [[0, 1]] result = aggregator.aggregate(level="all") self.assertEqual(result, [3.0]) # There are two "fire" on the first node group and a # a single "fire" on the second node group at the cluster # level which looks like # [[0], [1]] result = aggregator.aggregate(level="cluster") self.assertEqual(result, [2.0, 1.0])
def _aggregator(self, aggfunc): """ Return an aggregator corresponding to the aggfunc, the aggregators are memoized for performance :param aggfunc: Function parameter that accepts a :mod:`pandas.Series` object and returns a vector/scalar :type: function(:mod:`pandas.Series`) """ if aggfunc not in self._aggs.keys(): self._aggs[aggfunc] = MultiTriggerAggregator(self._triggers, self._topology, aggfunc) return self._aggs[aggfunc]