Skip to content

Commit

Permalink
bugfix fractional parameters and adde fitted_and_linked_parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
rutgerfick committed Feb 23, 2018
1 parent af9a353 commit 5abd7b9
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 12 deletions.
16 changes: 16 additions & 0 deletions dmipy/core/fitted_modeling_framework.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@ def fitted_parameters(self):
return self.model.parameter_vector_to_parameters(
self.fitted_parameters_vector)

@property
def fitted_and_linked_parameters(self):
"Returns the fitted and linked parameters as a dictionary."
fitted_parameters = self.model.parameter_vector_to_parameters(
self.fitted_parameters_vector)
return self.model.add_linked_parameters_to_parameters(
fitted_parameters)

def fod(self, vertices, visual_odi_lower_bound=0.):
"""
Returns the Fiber Orientation Distribution if it is available.
Expand Down Expand Up @@ -241,6 +249,14 @@ def fitted_parameters(self):
return self.model.parameter_vector_to_parameters(
self.fitted_parameters_vector)

@property
def fitted_and_linked_parameters(self):
"Returns the fitted and linked parameters as a dictionary."
fitted_parameters = self.model.parameter_vector_to_parameters(
self.fitted_parameters_vector)
return self.model.add_linked_parameters_to_parameters(
fitted_parameters)

def predict(self, acquisition_scheme=None, S0=None, mask=None):
"""
simulates the dMRI signal of the fitted MultiCompartmentModel for the
Expand Down
55 changes: 43 additions & 12 deletions dmipy/core/modeling_framework.py
Original file line number Diff line number Diff line change
Expand Up @@ -558,17 +558,9 @@ def set_fractional_parameter(self,
raise ValueError(msg)
# append new parameter to parameters
new_parameter_name = parameter1_smaller_equal_than + '_fraction'
self.parameter_ranges.update({new_parameter_name: [0., 1.]})
self.parameter_scales.update({new_parameter_name: 1.})
self.parameter_cardinality.update({new_parameter_name: 1})
self.parameter_types.update({new_parameter_name: 'normal'})

self._parameter_map.update({new_parameter_name: (None, 'fraction')})
self._inverted_parameter_map.update(
{(None, 'fraction'): new_parameter_name})
self.parameter_optimization_flags.update({new_parameter_name: True})

# add parmeter link to fractional parameter
self._add_optimization_parameter(
new_parameter_name, [0., 1.], 1., 1, 'normal', True)
model, name = self._parameter_map[parameter1_smaller_equal_than]
self.parameter_links.append([model, name, fractional_parameter, [
self._parameter_map[new_parameter_name],
Expand All @@ -581,6 +573,45 @@ def set_fractional_parameter(self,
del self.parameter_types[parameter1_smaller_equal_than]
del self.parameter_optimization_flags[parameter1_smaller_equal_than]

def _add_optimization_parameter(
self,
parameter_name,
parameter_range,
parameter_scale,
parameter_card,
parameter_type,
parameter_flag):
"""
Creates new ordered dictionaries for model properties with the
optimization parameter on top.
"""
old_parameter_ranges = self.parameter_ranges
old_parameter_scales = self.parameter_scales
old_parameter_cardinality = self.parameter_cardinality
old_parameter_types = self.parameter_types
old_optimization_flags = self.parameter_optimization_flags

self.parameter_ranges = OrderedDict({parameter_name: parameter_range})
self.parameter_scales = OrderedDict({parameter_name: parameter_scale})
self.parameter_cardinality = OrderedDict(
{parameter_name: parameter_card})
self.parameter_types = OrderedDict({parameter_name: parameter_type})
self.parameter_optimization_flags = OrderedDict(
{parameter_name: parameter_flag})

for name, _ in old_parameter_ranges.items():
self.parameter_ranges.update({name: old_parameter_ranges[name]})
self.parameter_scales.update({name: old_parameter_scales[name]})
self.parameter_cardinality.update(
{name: old_parameter_cardinality[name]})
self.parameter_types.update({name: old_parameter_types[name]})
self.parameter_optimization_flags.update(
{name: old_optimization_flags[name]})

self._parameter_map.update({parameter_name: (None, 'fraction')})
self._inverted_parameter_map.update(
{(None, 'fraction'): parameter_name})


class MultiCompartmentModel(MultiCompartmentModelProperties):
r'''
Expand Down Expand Up @@ -714,7 +745,7 @@ def fit(self, acquisition_scheme, data, parameter_initial_guess=None,
# estimate S0
self.scheme = acquisition_scheme
data_ = np.atleast_2d(data)
if self.scheme.TE is None: # if no TE is given
if self.scheme.TE is None or len(np.unique(self.scheme.TE)) == 1:
S0 = np.mean(data_[..., self.scheme.b0_mask], axis=-1)
else: # if multiple TE are in the data
S0 = np.ones_like(data_)
Expand Down Expand Up @@ -1071,7 +1102,7 @@ def fit(self, acquisition_scheme, data, parameter_initial_guess=None,
# estimate S0
self.scheme = acquisition_scheme
data_ = np.atleast_2d(data)
if self.scheme.TE is None: # if no TE is given
if self.scheme.TE is None or len(np.unique(self.scheme.TE)) == 1:
S0 = np.mean(data_[..., self.scheme.b0_mask], axis=-1)
else: # if multiple TE are in the data
S0 = np.ones(np.r_[data_.shape[:-1],
Expand Down

0 comments on commit 5abd7b9

Please sign in to comment.