I would definitely agree on that. That will save 10X computation time, with current implementation.
Best Troels 2014-08-25 16:31 GMT+02:00 Edward d'Auvergne <edw...@nmr-relax.com>: > 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 _______________________________________________ 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