| #!/usr/bin/env python3 |
| # -*- coding: utf-8 -*- |
| # |
| # Copyright (C) 2017-2020 The Project X-Ray Authors. |
| # |
| # Use of this source code is governed by a ISC-style |
| # license that can be found in the LICENSE file or at |
| # https://opensource.org/licenses/ISC |
| # |
| # SPDX-License-Identifier: ISC |
| """ Math models are used to represent abstract operations for the timing models. |
| This is useful for creating excel workbooks that can update dynamically, or |
| generating a model with symbolic constants to be backsolved. |
| """ |
| |
| |
| class ExcelMathModel(object): |
| """ Math model used for outputting to an dyanmic Excel sheet. """ |
| |
| def __init__(self): |
| pass |
| |
| def sum(self, elems): |
| sum_val = '(' + ' + '.join(elems) + ')' |
| if sum_val == '()': |
| return '0' |
| else: |
| return sum_val |
| |
| def product(self, elems): |
| sum_val = '(' + ' * '.join(elems) + ')' |
| if sum_val == '()': |
| return '1' |
| else: |
| return sum_val |
| |
| def plus(self, a, b): |
| return self.sum((a, b)) |
| |
| def divide(self, a, b): |
| return '({}/{})'.format(a, b) |
| |
| def multiply(self, a, b): |
| return '({}*{})'.format(a, b) |
| |
| def eval(self, elem): |
| return '=' + elem |
| |
| |
| def PythonMathModel(object): |
| """ Math model used for outputting values equalated immediately. """ |
| |
| def __init__(self): |
| pass |
| |
| def sum(self, elems): |
| return sum(elems) |
| |
| def product(self, elems): |
| v = 1.0 |
| for elem in elems: |
| v *= elem |
| return v |
| |
| def divide(self, a, b): |
| return a / b |
| |
| def plus(self, a, b): |
| return a + b |
| |
| def multiply(self, a, b): |
| return a * b |
| |
| def eval(self, elem): |
| return elem |