Hi Troels,

It's clear that the constraints are adding a lot of time.  And for
exponential curve-fitting, this is not needed at all.  I think we
should turn this off in the dispersion auto-analysis, for just the
'R2eff' model optimisation.  What do you think?

Regards,

Edward



On 22 August 2014 19:17,  <tlin...@nmr-relax.com> wrote:
> Author: tlinnet
> Date: Fri Aug 22 19:17:19 2014
> New Revision: 25227
>
> URL: http://svn.gna.org/viewcvs/relax?rev=25227&view=rev
> Log:
> Further extended the profiling script for curve fitting.
>
> Now profiling is in place for the implemented C code method in relax.
>
> A similar code should now be devised for numpy array for comparing.
>
> But this profiling shows that when contraints=True, is slowing down this 
> procedure by a factor 10 X !
>
> Modified:
>     
> trunk/test_suite/shared_data/curve_fitting/profiling/profiling_relax_fit.py
>
> Modified: 
> trunk/test_suite/shared_data/curve_fitting/profiling/profiling_relax_fit.py
> URL: 
> http://svn.gna.org/viewcvs/relax/trunk/test_suite/shared_data/curve_fitting/profiling/profiling_relax_fit.py?rev=25227&r1=25226&r2=25227&view=diff
> ==============================================================================
> --- 
> trunk/test_suite/shared_data/curve_fitting/profiling/profiling_relax_fit.py 
> (original)
> +++ 
> trunk/test_suite/shared_data/curve_fitting/profiling/profiling_relax_fit.py 
> Fri Aug 22 19:17:19 2014
> @@ -24,10 +24,11 @@
>  # Python module imports.
>  import cProfile
>  from os import getcwd, path, sep
> -from numpy import array, arange, int32, float64, pi, load
> +from numpy import array, arange, int32, float64, pi, load, sqrt, sum
>  import pstats
>  import sys
>  import tempfile
> +from minfx.generic import generic_minimise
>
>  # Python 3 support.
>  try:
> @@ -52,46 +53,171 @@
>
>  # relax module imports.
>  from status import Status; status = Status()
> +from target_functions.relax_fit import setup, func, dfunc, d2func, 
> back_calc_I
>
>
>  # Alter setup.
>  def main():
> -    param_key_list = [
> -        'r1rho_799.77739910_118.078_431.000',
> -        'r1rho_799.77739910_118.078_651.200',
> -        'r1rho_799.77739910_118.078_800.500',
> -        'r1rho_799.77739910_118.078_984.000',
> -        'r1rho_799.77739910_118.078_1341.110',
> -        'r1rho_799.77739910_118.078_1648.500',
> -        'r1rho_799.77739910_124.247_1341.110',
> -        'r1rho_799.77739910_130.416_800.500',
> -        'r1rho_799.77739910_130.416_1341.110',
> -        'r1rho_799.77739910_130.416_1648.500',
> -        'r1rho_799.77739910_142.754_800.500',
> -        'r1rho_799.77739910_142.754_1341.110',
> -        'r1rho_799.77739910_179.768_1341.110',
> -        'r1rho_799.77739910_241.459_1341.110'
> -    ]
> -
> -    # Define maximum dimensions.
> -    NE, NS, NM, NO, ND, NT = 1, 1, 1, 6, 6, 5
> -
> -    # Define path to data
> -    data_path = status.install_path + 
> sep+'test_suite'+sep+'shared_data'+sep+'curve_fitting'+sep+'profiling'+sep
> -
> -    values_arr = load(data_path + "values_arr.npy")
> -    errors_arr = load(data_path + "errors_arr.npy")
> -    times_arr = load(data_path + "times_arr.npy")
> -    struct_arr = load(data_path + "struct_arr.npy")
> +    v_cT_chi2_list = array(verify(constraints=True))
> +    v_cF_chi2_list = array(verify(constraints=False))
> +
> +    sum_root_squared = sum( sqrt( (v_cT_chi2_list - v_cF_chi2_list)**2 ) )
> +    print("The sum of the root squared differences are: %.3e" % 
> sum_root_squared)
> +
> +    lines_report = 15
> +
> +    if True:
> +        #################
> +        #  Verify, with constraints
> +        constraints = True
> +
> +        # Print statistics.
> +        verbose = True
> +
> +        # Calc for verify with constraints.
> +        v_cT_filename = tempfile.NamedTemporaryFile(delete=False).name
> +        # Profile for a single spin.
> +        cProfile.run('verify(constraints=%s)'%constraints, v_cT_filename)
> +
> +        # Read all stats files into a single object
> +        v_cT_stats = pstats.Stats(v_cT_filename)
> +
> +        # Clean up filenames for the report
> +        v_cT_stats.strip_dirs()
> +
> +        # Sort the statistics by the cumulative time spent in the function. 
> cumulative, time, calls
> +        v_cT_stats.sort_stats('cumulative')
> +
> +        # Print report for single.
> +        if verbose:
> +            v_cT_stats.print_stats(lines_report)
> +
> +    if True:
> +        #################
> +        #  Verify, without constraints
> +        constraints = False
> +
> +        # Print statistics.
> +        verbose = True
> +
> +        # Calc for verify with constraints.
> +        v_cF_filename = tempfile.NamedTemporaryFile(delete=False).name
> +        # Profile for a single spin.
> +        cProfile.run('verify(constraints=%s)'%constraints, v_cF_filename)
> +
> +        # Read all stats files into a single object
> +        v_cF_stats = pstats.Stats(v_cF_filename)
> +
> +        # Clean up filenames for the report
> +        v_cF_stats.strip_dirs()
> +
> +        # Sort the statistics by the cumulative time spent in the function. 
> cumulative, time, calls
> +        v_cF_stats.sort_stats('cumulative')
> +
> +        # Print report for single.
> +        if verbose:
> +            v_cF_stats.print_stats(lines_report)
> +
> +
> +class Profile:
> +    """
> +    Class Profile inherits the Dispersion container class object.
> +    """
> +
> +    def __init__(self):
> +
> +        # Define parameters
> +        self.param_key_list = [
> +            'r1rho_799.77739910_118.078_431.000',
> +            'r1rho_799.77739910_118.078_651.200',
> +            'r1rho_799.77739910_118.078_800.500',
> +            'r1rho_799.77739910_118.078_984.000',
> +            'r1rho_799.77739910_118.078_1341.110',
> +            'r1rho_799.77739910_118.078_1648.500',
> +            'r1rho_799.77739910_124.247_1341.110',
> +            'r1rho_799.77739910_130.416_800.500',
> +            'r1rho_799.77739910_130.416_1341.110',
> +            'r1rho_799.77739910_130.416_1648.500',
> +            'r1rho_799.77739910_142.754_800.500',
> +            'r1rho_799.77739910_142.754_1341.110',
> +            'r1rho_799.77739910_179.768_1341.110',
> +            'r1rho_799.77739910_241.459_1341.110'
> +        ]
> +
> +        # Define maximum dimensions.
> +        self.NE, self.NS, self.NM, self.NO, self.ND, self.NT = 1, 1, 1, 6, 
> 6, 5
> +
> +        # Define path to data
> +        self.data_path = status.install_path + 
> sep+'test_suite'+sep+'shared_data'+sep+'curve_fitting'+sep+'profiling'+sep
> +
> +        self.values_arr = load(self.data_path + "values_arr.npy")
> +        self.errors_arr = load(self.data_path + "errors_arr.npy")
> +        self.times_arr = load(self.data_path + "times_arr.npy")
> +        self.struct_arr = load(self.data_path + "struct_arr.npy")
> +
> +        #param_vector = array([ 0.,  0.])
> +        self.param_vector = array([  8.800000000000001e+00,   
> 2.000000000800000e+05])
> +        self.scaling_list = [1.0, 1.0]
> +        self.func_tol = 1e-25
> +        self.grad_tol = None
> +        self.max_iterations = 10000000
> +        self.verbosity = 0
> +
> +    def set_options(self, constraints=None):
> +        # Define which constraints should be used.
> +        self.constraints = constraints
> +
> +        if self.constraints:
> +            self.min_algor = 'Log barrier'
> +            self.min_options = ('simplex',)
> +            self.A = array([ [ 1.,  0.],
> +                        [-1.,  0.],
> +                        [ 0.,  1.]] )
> +            self.b = array([   0., -200.,    0.])
> +
> +        else:
> +            self.min_algor = 'simplex'
> +            self.min_options = ()
> +            self.A = None
> +            self.b = None
> +
> +
> +def verify(constraints=None):
> +    # Instantiate class.
> +    C = Profile()
> +
> +    # Set the minimising options.
> +    C.set_options(constraints=constraints)
> +
> +    chi2_list = []
>
>      # Print arrays.
> -    for ei in range(NE):
> -        for si in range(NS):
> -            for mi in range(NM):
> -                for oi in range(NO):
> -                    for di in range(ND):
> -                        print(ei, si, mi, oi, di, values_arr[ei, si, mi, oi, 
> di], struct_arr[ei, si, mi, oi, di])
> -
> +    for ei in range(C.NE):
> +        for si in range(C.NS):
> +            for mi in range(C.NM):
> +                for oi in range(C.NO):
> +                    for di in range(C.ND):
> +                        # Extract values
> +                        values = C.values_arr[ei, si, mi, oi, di]
> +                        errors = C.errors_arr[ei, si, mi, oi, di]
> +                        times = C.times_arr[ei, si, mi, oi, di]
> +                        struct = C.struct_arr[ei, si, mi, oi, di]
> +                        num_times = int( sum(struct) )
> +
> +                        if num_times == 0:
> +                            continue
> +
> +                        # Initialise the function to minimise.
> +                        setup(num_params=len(C.param_vector), 
> num_times=num_times, values=values, sd=errors, relax_times=times, 
> scaling_matrix=C.scaling_list)
> +
> +                        results = generic_minimise(func=func, dfunc=dfunc, 
> d2func=d2func, args=(), x0=C.param_vector, min_algor=C.min_algor, 
> min_options=C.min_options, func_tol=C.func_tol, grad_tol=C.grad_tol, 
> maxiter=C.max_iterations, A=C.A, b=C.b, full_output=True, 
> print_flag=C.verbosity)
> +
> +                        # Unpack
> +                        param_vector, chi2, iter_count, f_count, g_count, 
> h_count, warning = results
> +
> +                        chi2_list.append(chi2)
> +
> +    return chi2_list
>
>  # Execute main function.
>  if __name__ == "__main__":
>
>
> _______________________________________________
> relax (http://www.nmr-relax.com)
>
> This is the relax-commits mailing list
> relax-comm...@gna.org
>
> 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-commits

_______________________________________________
relax (http://www.nmr-relax.com)

This is the relax-devel mailing list
relax-devel@gna.org

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

Reply via email to