Hi, Exactly, but it would need to be in a branch (to keep the trunk stable) and then done for all analyses (to keep the API clean). I.e. the same steps as I mentioned before (http://thread.gmane.org/gmane.science.nmr.relax.devel/5987). You've already done half of the work with the changes at http://article.gmane.org/gmane.science.nmr.relax.devel/5986. But it must really be done for all analyses. The parameter_object is a major part of the specific analysis API. Most of the work is in the base parameter_object anyway, rather than in the specific analyses which just require hardcoded values shifted from specific_analyses/*/optimisation.py into specific_analyses/*/parameter_object.py which is simply 39 pairs of numbers:
$ grep lower.append specific_analyses/*/* | wc -l Regards, Edward On 28 May 2014 15:47, Troels Emtekær Linnet <[email protected]> wrote: > Hm. > > That is too much work. > > Can I write the default values into the > specific_analysis/relax_disp/parameter_object.py. > > So I can simply call: > > from specific_analyses.relax_disp.parameter_object import Relax_disp_params > PARAMS = Relax_disp_params() > PARAMS.default_value('pA') > PARAMS.grid_upper('pA') > > Then I wont touch the API. > > Best > Troels > > 2014-05-28 15:30 GMT+02:00 Edward d'Auvergne <[email protected]>: >> Hi, >> >> If you have the time and would like to implement this, such a change >> must be done for the entire specific API. It cannot be just for the >> relaxation dispersion analysis. The API change must be complete - >> otherwise the changes will not be accepted as that will result in huge >> amounts of maintenance work for me in the future, much more than the >> effort of making the API consistent for all analyses. Though if you >> set up one analysis type, the rest should be easy (half don't perform >> minimisation, so the grid limits are not defined). The best way to >> implement this would be: >> >> - Create a new svn branch from the trunk for the developments. >> - Add the self._grid_lower and self._grid_upper objects and >> corresponding arguments to specific_analyses.parameter_objects. >> - Go into specific_analyses, and run 'grep lower.append */*' to see >> all the places this needs changing. >> - Shift all of these hard coded values into the specific >> parameter_object modules. >> - Import the parameter_object singleton into the modules requiring the >> default bounds. >> - Replace all the hard coded values with the >> parameter_object.grid_lower() and parameter_object.grid_upper() >> function calls. Note the places where the limits are dynamically >> changed - these must remain. >> - Make sure the test suite passes. >> - Ask for the branch to be merged back. >> >> The API function grid_lower() should not be added, as these methods >> are really designed for use outside of the specific API. If you wish >> to do this, feel free. >> >> Regards, >> >> Edward >> >> >> >> >> On 28 May 2014 15:00, Troels Emtekær Linnet <[email protected]> wrote: >>> Hi Ed. >>> >>> I would like to collect the grid seach lower and upper bounds into the >>> table of >>> specific_analysis/relax_disp/parameter_object.py >>> >>> This is to make one place, where such details are collected. >>> >>> And the lower and upper bounds can be extracted for unit tests, and >>> for example dx.map more easily. >>> >>> I have worked it out for lower bounds of pA, and tested it. >>> >>> --- a/specific_analyses/api_base.py >>> +++ b/specific_analyses/api_base.py >>> @@ -314,6 +314,22 @@ class API_base(object): >>> raise RelaxImplementError('grid_search') >>> >>> >>> + def grid_lower(self, param): >>> + """Return the default lower bounds of paramater for the grid >>> search. >>> + >>> + This basic method will first search for a global parameter >>> and, if not found, then a spin parameter. >>> + >>> + >>> + @param param: The specific analysis parameter. >>> + @type param: str >>> + @return: The default value. >>> + @rtype: float >>> + """ >>> + >>> + # Return the value. >>> + return self._PARAMS.grid_lower(param) >>> + >>> + >>> def has_errors(self): >>> """Test if errors exist for the current data pipe. >>> >>> diff --git a/specific_analyses/parameter_object.py >>> b/specific_analyses/parameter_object.py >>> index b626a83..8e7abab 100644 >>> --- a/specific_analyses/parameter_object.py >>> +++ b/specific_analyses/parameter_object.py >>> @@ -54,6 +54,7 @@ class Param_list(object): >>> self._scope = {} >>> self._string = {} >>> self._defaults = {} >>> + self._grid_lowers = {} >>> self._units = {} >>> self._desc = {} >>> self._py_types = {} >>> @@ -92,7 +93,7 @@ class Param_list(object): >>> return cls._instance >>> >>> >>> - def _add(self, name, scope=None, string=None, default=None, >>> units=None, desc=None, py_type=None, set='all', conv_factor=None, >>> grace_string=None, err=False, sim=False): >>> + def _add(self, name, scope=None, string=None, default=None, >>> grid_lower=None, units=None, desc=None, py_type=None, set='all', >>> conv_factor=None, grace_string=None, err=False, sim=False): >>> """Add a parameter to the list. >>> >>> @param name: The name of the parameter. This will >>> be used as the variable name. >>> @@ -103,6 +104,8 @@ class Param_list(object): >>> @type string: None or str >>> @keyword default: The default value of the parameter. >>> @type default: anything >>> + @keyword grid_lower: The default lower bounds of the grid >>> search. >>> + @type grid_lower: float >>> @keyword units: A string representing the parameters units. >>> @type units: None or str >>> @keyword desc: The text description of the parameter. >>> @@ -134,6 +137,7 @@ class Param_list(object): >>> self._names.append(name) >>> self._scope[name] = scope >>> self._defaults[name] = default >>> + self._grid_lowers[name] = grid_lower >>> self._units[name] = units >>> self._desc[name] = desc >>> self._py_types[name] = py_type >>> @@ -540,6 +544,22 @@ class Param_list(object): >>> return self._grace_string[name] >>> >>> >>> + def grid_lower(self, name): >>> + """Return the default lower bounds of paramater for the grid >>> search. >>> + >>> + @param name: The name of the parameter. >>> + @type name: str >>> + @return: The default value. >>> + @rtype: None or str >>> + """ >>> + >>> + # Parameter check. >>> + self.check_param(name) >>> + >>> + # Return the default value. >>> + return self._grid_lowers[name] >>> + >>> + >>> def is_spin_param(self, name): >>> """Determine whether the given parameter is spin specific. >>> >>> diff --git a/specific_analyses/relax_disp/optimisation.py >>> b/specific_analyses/relax_disp/optimisation.py >>> index a92922e..82bd364 100644 >>> --- a/specific_analyses/relax_disp/optimisation.py >>> +++ b/specific_analyses/relax_disp/optimisation.py >>> @@ -38,6 +38,7 @@ from lib.errors import RelaxError >>> from lib.text.sectioning import subsection >>> from multi import Memo, Result_command, Slave_command >>> from pipe_control.mol_res_spin import spin_loop >>> +from specific_analyses.api import return_api >>> from specific_analyses.relax_disp.checks import check_disp_points, >>> check_exp_type, check_exp_type_fixed_time >>> from specific_analyses.relax_disp.data import average_intensity, >>> count_spins, find_intensity_keys, has_exponential_exp_type, >>> has_proton_mmq_cpmg, loop_exp, loop_exp_frq_offset_point, >>> loop_exp_frq_offset_point_time, loop_frq, loop_offset, loop_time, >>> pack_back_calc_r2eff, return_cpmg_frqs, return_offset_data, >>> return_param_key_from_data, return_r1_data, return_r2eff_arrays, >>> return_spin_lock_nu1 >>> from specific_analyses.relax_disp.parameters import >>> assemble_param_vector, assemble_scaling_matrix, >>> disassemble_param_vector, linear_constraints, loop_parameters, >>> param_conversion, param_num >>> @@ -296,6 +297,9 @@ def grid_search_setup(spins=None, spin_ids=None, >>> param_vector=None, lower=None, >>> elif isinstance(inc, int): >>> inc = [inc]*n >>> >>> + # The specific analysis API object. >>> + api = return_api() >>> + >>> # Set up the default bounds. >>> if not lower: >>> # Init. >>> @@ -357,7 +361,9 @@ def grid_search_setup(spins=None, spin_ids=None, >>> param_vector=None, lower=None, >>> if spins[si].model == MODEL_M61B: >>> lower.append(0.85) >>> else: >>> - lower.append(0.5) >>> + #lower.append(0.5) >>> + lower.append(api.grid_lower('pA')) >>> + #lower.append(api.default_value('pA')) >>> upper.append(1.0) >>> >>> # The population of state B (for 3-site exchange). >>> diff --git a/specific_analyses/relax_disp/parameter_object.py >>> b/specific_analyses/relax_disp/parameter_object.py >>> index 936d2b1..21dfe99 100644 >>> --- a/specific_analyses/relax_disp/parameter_object.py >>> +++ b/specific_analyses/relax_disp/parameter_object.py >>> @@ -61,7 +61,7 @@ class Relax_disp_params(Param_list): >>> self._add('r2', scope='spin', default=10.0, desc='The >>> transversal relaxation rate', set='params', py_type=dict, >>> grace_string='\\qR\\s2\\N\\Q (rad.s\\S-1\\N)', err=True, sim=True) >>> self._add('r2a', scope='spin', default=10.0, desc='The >>> transversal relaxation rate for state A in the absence of exchange', >>> set='params', py_type=dict, grace_string='\\qR\\s2,A\\N\\Q >>> (rad.s\\S-1\\N)', err=True, sim=True) >>> self._add('r2b', scope='spin', default=10.0, desc='The >>> transversal relaxation rate for state B in the absence of exchange', >>> set='params', py_type=dict, grace_string='\\qR\\s2,B\\N\\Q >>> (rad.s\\S-1\\N)', err=True, sim=True) >>> - self._add('pA', scope='spin', default=0.90, desc='The >>> population for state A', set='params', py_type=float, >>> grace_string='\\qp\\sA\\N\\Q', err=True, sim=True) >>> + self._add('pA', scope='spin', default=0.90, grid_lower=0.6, >>> desc='The population for state A', set='params', py_type=float, >>> grace_string='\\qp\\sA\\N\\Q', err=True, sim=True) >>> self._add('pB', scope='spin', default=0.5, desc='The >>> population for state B', set='params', py_type=float, >>> grace_string='\\qp\\sB\\N\\Q', err=True, sim=True) >>> self._add('pC', scope='spin', default=0.5, desc='The >>> population for state C', set='params', py_type=float, >>> grace_string='\\qp\\sC\\N\\Q', err=True, sim=True) >>> self._add('phi_ex', scope='spin', default=5.0, desc='The >>> phi_ex = pA.pB.dw**2 value (ppm^2)', set='params', py_type=float, >>> grace_string='\\xF\\B\\sex\\N = \\q >>> p\\sA\\N.p\\sB\\N.\\xDw\\B\\S2\\N\\Q (ppm\\S2\\N)', err=True, >>> sim=True) >>> >>> Best >>> Troels >>> >>> _______________________________________________ >>> relax (http://www.nmr-relax.com) >>> >>> This is the relax-devel mailing list >>> [email protected] >>> >>> To unsubscribe from this list, get a password >>> reminder, or change your subscription options, >>> visit the list information page at >>> https://mail.gna.org/listinfo/relax-devel _______________________________________________ relax (http://www.nmr-relax.com) This is the relax-devel mailing list [email protected] To unsubscribe from this list, get a password reminder, or change your subscription options, visit the list information page at https://mail.gna.org/listinfo/relax-devel

