Skip to content

ODEModel with constraints gives error #282

@JohnGoertz

Description

@JohnGoertz

Adding constraints to the fitting of an ODEModel raises an error, __init__() missing 1 required positional argument: 'initial'

Taking the simple coupled ODE model from the docs and adding an equality constraint to the variables (one that will necessarily be true anyways) gives the following output:

tdata = np.array([10, 26, 44, 70, 120])
adata = 10e-4 * np.array([44, 34, 27, 20, 14])
a, b, t = sf.variables('a, b, t')
k = sf.Parameter('k', 0.1)
a0 = 54 * 10e-4

model_dict = {
    sf.D(a, t): - k * a**2,
    sf.D(b, t): k * a**2,
}

ode_model = sf.ODEModel(model_dict, initial={t: 0.0, a: a0, b: 0.0})

constraints = [sf.Eq(a+b,0.055)]

fit = sf.Fit(ode_model, t=tdata, a=adata, b=None, constraints=constraints)
fit_result = fit.execute()
print(fit_result)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-133-bcdec22720dd> in <module>
     14 constraints = [sf.Eq(a+b,0.055)]
     15 
---> 16 fit = sf.Fit(ode_model, t=tdata, a=adata, b=None, constraints=constraints)
     17 fit_result = fit.execute()
     18 print(fit_result)

C:\ProgramData\Anaconda3\envs\sf_env\lib\site-packages\symfit\core\support.py in wrapped_func(*args, **kwargs)
    421                     else:
    422                         bound_args.arguments[param.name] = param.default
--> 423             return func(*bound_args.args, **bound_args.kwargs)
    424         return wrapped_func
    425 

C:\ProgramData\Anaconda3\envs\sf_env\lib\site-packages\symfit\core\fit.py in __init__(self, model, *ordered_data, **named_data)
    374 
    375         self.constraints = self._init_constraints(constraints=constraints,
--> 376                                                   model=self.model)
    377 
    378         # Bind as much as possible the provided arguments.

C:\ProgramData\Anaconda3\envs\sf_env\lib\site-packages\symfit\core\fit.py in _init_constraints(self, constraints, model)
    565                 else:
    566                     con_models.append(
--> 567                         model.__class__.as_constraint(constraint, model)
    568                     )
    569         return con_models

C:\ProgramData\Anaconda3\envs\sf_env\lib\site-packages\symfit\core\models.py in as_constraint(cls, constraint, model, constraint_type, **init_kwargs)
    157         instance = cls.with_dependencies(constraint,
    158                                          dependency_model=model,
--> 159                                          **init_kwargs)
    160 
    161         # Check if the constraint_type is allowed, and flip the sign if needed

C:\ProgramData\Anaconda3\envs\sf_env\lib\site-packages\symfit\core\models.py in with_dependencies(cls, model_expr, dependency_model, **init_kwargs)
    207         :return: A stand-alone :class:`~symfit.core.models.BaseModel` subclass.
    208         """
--> 209         model = cls(model_expr, **init_kwargs)  # Initiate model instance.
    210         if any(var in dependency_model for var in model.independent_vars):
    211             # This model depends on the output of the dependency_model,

TypeError: __init__() missing 1 required positional argument: 'initial'

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions