Parse an expression. Args: expression: the expression to be parsed. Returns: The result of the evaluation. Raises: ValueError: If the value of one or more of the debug tensors in the expression are not available.
(self, expression)
| 116 | self._cached_tensor_values = {} |
| 117 | |
| 118 | def evaluate(self, expression): |
| 119 | """Parse an expression. |
| 120 | |
| 121 | Args: |
| 122 | expression: the expression to be parsed. |
| 123 | |
| 124 | Returns: |
| 125 | The result of the evaluation. |
| 126 | |
| 127 | Raises: |
| 128 | ValueError: If the value of one or more of the debug tensors in the |
| 129 | expression are not available. |
| 130 | """ |
| 131 | dump_tensors_iter = re.finditer(_DUMP_TENSOR_PATTERN, expression) |
| 132 | rewritten_expression = expression |
| 133 | for match in reversed(list(dump_tensors_iter)): |
| 134 | tensor_name = match.group(0)[1:-1].strip() |
| 135 | device_name, node_name, output_slot, debug_op, exec_index = ( |
| 136 | _parse_debug_tensor_name(tensor_name)) |
| 137 | if tensor_name not in self._cached_tensor_values: |
| 138 | try: |
| 139 | value = self._dump.get_tensors( |
| 140 | node_name, output_slot, debug_op, |
| 141 | device_name=device_name)[exec_index] |
| 142 | except debug_data.WatchKeyDoesNotExistInDebugDumpDirError: |
| 143 | raise ValueError( |
| 144 | "Eval failed due to the value of %s:%d:DebugIdentity being " |
| 145 | "unavailable" % (node_name, output_slot)) |
| 146 | self._cached_tensor_values[tensor_name] = value |
| 147 | rewritten_expression = ( |
| 148 | rewritten_expression[:match.start(0)] + |
| 149 | "self._cached_tensor_values['" + tensor_name + "']" + |
| 150 | rewritten_expression[match.end(0):]) |
| 151 | |
| 152 | return eval(rewritten_expression) # pylint: disable=eval-used |