fixed indexing in fit functions

This commit is contained in:
Dominik Demuth 2024-01-21 17:56:41 +01:00
parent 625af5ec71
commit 9e3a3cc6f3
2 changed files with 43 additions and 21 deletions

View File

@ -275,7 +275,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
func_dict = {}
for model_name, model_parameter in self.models.items():
func, order, param_len = ModelFactory.create_from_list(model_parameter)
func, order, param_len, _ = ModelFactory.create_from_list(model_parameter)
multiple_funcs = isinstance(func, MultiModel)
if func is None:
continue
@ -387,7 +387,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
func_dict = {}
for k, mod in self.models.items():
func, order, param_len = ModelFactory.create_from_list(mod)
func, order, param_len, _ = ModelFactory.create_from_list(mod)
multiple_funcs = isinstance(func, MultiModel)
if k in data:

View File

@ -9,7 +9,13 @@ from inspect import signature, Parameter
class ModelFactory:
@staticmethod
def create_from_list(funcs: list, left=None, func_order=None, param_len=None, left_cnt=None):
def create_from_list(
funcs: list,
left=None,
func_order: list[int] = None,
param_len: list[int] = None,
left_cnt: int = 0,
):
if func_order is None:
func_order = []
@ -20,37 +26,50 @@ class ModelFactory:
if not func['active']:
continue
if func['children']:
f = func.copy()
f['children'] = []
right, _, _, right_cnt = ModelFactory.create_from_list(
[f] + func['children'],
left_cnt=func['pos'],
func_order=func_order,
param_len=param_len,
)
else:
right = func['func']
right_cnt = func['cnt']
func_order.append(func['cnt'])
param_len.append(len(func['func'].params))
if func['children']:
right, _, _ = ModelFactory.create_from_list(func['children'], left_cnt=func['pos'],
func_order=func_order, param_len=param_len)
if right is None:
right = func['func']
right_cnt = func['cnt']
else:
right_cnt = None
right = MultiModel(func['func'], right, func['children'][0]['op'], left_idx=func['cnt'], right_idx=None)
else:
right = func['func']
right_cnt = func['cnt']
if left is None:
left = right
left_cnt = right_cnt
else:
left = MultiModel(left, right, func['op'],
left_idx=left_cnt, right_idx=right_cnt)
left = MultiModel(left, right, func['op'], left_idx=left_cnt, right_idx=right_cnt)
return left, func_order, param_len
return left, func_order, param_len, left_cnt
class MultiModel:
op_repr = {operator.add: ' + ', operator.mul: ' * ', operator.sub: ' - ', operator.truediv: ' / '}
str_op = {'+': operator.add, '*': operator.mul, '-': operator.sub, '/': operator.truediv}
int_op = {0: operator.add, 1: operator.mul, 2: operator.sub, 3: operator.truediv}
op_repr = {
operator.add: ' + ',
operator.mul: ' * ',
operator.sub: ' - ',
operator.truediv: ' / ',
}
str_op = {
'+': operator.add,
'*': operator.mul,
'-': operator.sub,
'/': operator.truediv,
}
int_op = {
0: operator.add,
1: operator.mul,
2: operator.sub,
3: operator.truediv,
}
def __init__(self,
left: Any,
@ -74,6 +93,9 @@ class MultiModel:
if self._op is None:
raise ValueError('Invalid binary operator.')
if right_idx is None:
right_idx = left_idx + 1
self.name = '('
self.params = []
self.bounds = []