Skip to content

Commit

Permalink
Fixed estimated parameters not written to document
Browse files Browse the repository at this point in the history
  • Loading branch information
JR-1991 committed Mar 1, 2022
1 parent 7e43ca1 commit e647e5f
Showing 1 changed file with 24 additions and 11 deletions.
35 changes: 24 additions & 11 deletions pyenzyme/thinlayers/TL_Pysces.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@
Copyright (c) 2021 Stellenbosch University
"""

import copy
import numpy as np
import pandas as pd
import os

from typing import Union, Optional
from pyenzyme.thinlayers.TL_Base import BaseThinLayer
from pyenzyme.enzymeml.core.exceptions import SpeciesNotFoundError

_PYSCES_IMPORT_ERROR = None
try:
Expand All @@ -25,6 +27,7 @@
{}
""".format(e)


class ThinLayerPysces(BaseThinLayer):

def __init__(
Expand Down Expand Up @@ -54,22 +57,25 @@ def optimize(self, method='leastsq'):
"""

# Initialize the model parameters
self._initialize_parameters()
parameters = self._initialize_parameters()

# Perform optimization
self.minimizer = lmfit.Minimizer(
self._calculate_residual, self.parameters
self._calculate_residual, parameters
)

# Set estiomated parameters to self
self.parameters = parameters

return self.minimizer.minimize(method=method)

def write(self):
"""Writes the estimated parameters to a copy of the EnzymeMLDocument"""

nu_enzmldoc = self.enzmldoc.copy(deep=True)
parameters = self.parameters.valuesdict()
results = self.minimizer.result.params.valuesdict()

for name, value in parameters.items():
for name, value in results.items():
# names contain information about reaction and parameter
# Pattern: rX_name

Expand All @@ -78,7 +84,12 @@ def write(self):
parameter_id = "_".join(splitted[1::])

# Fetch reaction and parameter
reaction = nu_enzmldoc.getReaction(reaction_id)
try:
reaction = nu_enzmldoc.getReaction(reaction_id)
except SpeciesNotFoundError:
global_param = nu_enzmldoc.global_parameters.get(name)
global_param.value = value
continue

if reaction.model:
parameter = reaction.model.getParameter(parameter_id)
Expand All @@ -91,27 +102,27 @@ def write(self):
return nu_enzmldoc

# ! Helper methods
def _initialize_parameters(self) -> None:
def _initialize_parameters(self):
"""Adds all parameters to an lmfit Parameters instance.
Raises:
ValueError: Raised when parameter posesses neither an initial value or value attribute
"""

# Initialize lmfit parameters
self.parameters = lmfit.Parameters()
parameters = lmfit.Parameters()

# Add global parameters
for global_param in self.global_parameters.values():

if global_param.value:
self.parameters.add(
parameters.add(
f"{global_param.name}", global_param.value, vary=not global_param.constant,
min=global_param.lower, max=global_param.upper
)

elif global_param.initial_value:
self.parameters.add(
parameters.add(
f"{global_param.name}", global_param.initial_value, vary=not global_param.constant,
min=global_param.lower, max=global_param.upper
)
Expand All @@ -131,12 +142,12 @@ def _initialize_parameters(self) -> None:
continue

if parameter.value:
self.parameters.add(
parameters.add(
f"{reaction_id}_{parameter.name}", parameter.value, vary=not parameter.constant,
min=parameter.lower, max=parameter.upper
)
elif parameter.initial_value:
self.parameters.add(
parameters.add(
f"{reaction_id}_{parameter.name}", parameter.initial_value, vary=not parameter.constant,
min=parameter.lower, max=parameter.upper
)
Expand All @@ -145,6 +156,8 @@ def _initialize_parameters(self) -> None:
f"Neither initial_value nor value given for parameter {parameter.name} in reaction {reaction_id}"
)

return parameters

def _get_experimental_data(self):
"""Extract measurement data from the EnzymeML document"""

Expand Down

0 comments on commit e647e5f

Please sign in to comment.