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 = {} func_dict = {}
for model_name, model_parameter in self.models.items(): 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) multiple_funcs = isinstance(func, MultiModel)
if func is None: if func is None:
continue continue
@ -387,7 +387,7 @@ class QFitDialog(QtWidgets.QWidget, Ui_FitDialog):
func_dict = {} func_dict = {}
for k, mod in self.models.items(): 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) multiple_funcs = isinstance(func, MultiModel)
if k in data: if k in data:

View File

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