aboutsummaryrefslogtreecommitdiff
path: root/bart/common/Analyzer.py
diff options
context:
space:
mode:
Diffstat (limited to 'bart/common/Analyzer.py')
-rw-r--r--bart/common/Analyzer.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/bart/common/Analyzer.py b/bart/common/Analyzer.py
new file mode 100644
index 0000000..7bb55c9
--- /dev/null
+++ b/bart/common/Analyzer.py
@@ -0,0 +1,82 @@
+# Copyright 2015-2016 ARM Limited
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+"""Allow the user to assert various conditions
+based on the grammar defined in trappy.stats.grammar. The class is
+also intended to have aggregator based functionality. This is not
+implemented yet.
+"""
+
+from trappy.stats.grammar import Parser
+import warnings
+import numpy as np
+import pandas as pd
+
+# pylint: disable=invalid-name
+
+
+class Analyzer(object):
+
+ """
+ :param data: TRAPpy FTrace Object
+ :type data: :mod:`trappy.ftrace.FTrace`
+
+ :param config: A dictionary of variables, classes
+ and functions that can be used in the statements
+ :type config: dict
+ """
+
+ def __init__(self, data, config, **kwargs):
+ self._parser = Parser(data, config, **kwargs)
+
+ def assertStatement(self, statement, select=None):
+ """Solve the statement for a boolean result
+
+ :param statement: A string representing a valid
+ :mod:`trappy.stats.grammar` statement
+ :type statement: str
+
+ :param select: If the result represents a boolean
+ mask and the data was derived from a TRAPpy event
+ with a pivot value. The :code:`select` can be
+ used to select a particular pivot value
+ :type select: :mod:`pandas.DataFrame` column
+ """
+
+ result = self.getStatement(statement, select=select)
+
+ if isinstance(result, pd.DataFrame):
+ result = result.all().all()
+ elif not(isinstance(result, bool) or isinstance(result, np.bool_)): # pylint: disable=no-member
+ warnings.warn("solution of {} is not boolean".format(statement))
+
+ return result
+
+ def getStatement(self, statement, reference=False, select=None):
+ """Evaluate the statement"""
+
+ result = self._parser.solve(statement)
+
+ # pylint: disable=no-member
+ if np.isscalar(result):
+ return result
+ # pylint: enable=no-member
+
+ if select is not None and len(result):
+ result = result[select]
+ if reference:
+ result = self._parser.ref(result)
+
+ return result