:) Well, actually there is often only one failure point and I have identified those in most lib.dispersion.* modules for you already ;) I have spent a lot of time running these models, not only in the system tests but also in the test_suite/shared_data/dispersion/ directories, finding exactly what these failure points are! Therefore just look at the lib.dispersion.* modules in the relax trunk, and you will see the exact tests needed. I spend a lot of time and effort identifying and creating these. This hard work has been deleted in your disp_speed branch, but you can reintroduce it in a fast way. Most will be of the form "if x[i] == 0.0" which, for your branch, can be converted to "if numpy.min(numpy.abs(x)) == 0.0", replacing the "if not numpy.isfinite()" checks you have introduced.
The isfinite() checks are too late in the calculation, hence you see a numpy warning. The "== 0.0" check catches the problem before the numpy calculation which generates the values of infinity, so reintroducing these will solve the numpy problems that often confuse users. I have already done the hard part for you :) Regards, Edward On 19 May 2014 13:15, Troels Emtekær Linnet <[email protected]> wrote: > Hi Ed. > > The problem is, that 2-4 lines of code in a lib file can trigger a > math domain error. > > To figure out what each function is "sad" about, one would need a > little inspection per lib file, and > the code would get full of checkings and handlings. That slows it down... > > It should be, that in 95 percent of the time, the minimise function is > just happy and calculating. > Only at boundaries values, the math domain errors can get triggered. > > Rather that 5% of the time, it calculates to much, that 95% is full of > checking. > > Best > Troels > > > > > 2014-05-19 10:18 GMT+02:00 Edward d'Auvergne <[email protected]>: >> Hi Troels, >> >> There is actually a better way that is just as fast. That is to catch >> the value prior to the divide by zero, or what ever operation creates >> the Inf values. Then you can fill back_calc with 1e100 and return. >> That way the test will pass when running with --numpy-raise, and the >> user will not see all the numpy warning messages. Having the check >> earlier might even be a tiny bit faster. >> >> Regards, >> >> Edward >> >> >> >> >> On 19 May 2014 00:51, <[email protected]> wrote: >>> Author: tlinnet >>> Date: Mon May 19 00:51:20 2014 >>> New Revision: 23220 >>> >>> URL: http://svn.gna.org/viewcvs/relax?rev=23220&view=rev >>> Log: >>> Huge speed-up of model B14. >>> >>> task #7793: (https://gna.org/task/?7793) Speed-up of dispersion models. >>> >>> Time test for systemtests: >>> >>> test_baldwin_synthetic >>> 2.626s -> 1.990s >>> >>> test_baldwin_synthetic_full >>> 18.326s -> 13.742s >>> >>> This is won by not checking single values in the R2eff array for math domain >>> errors, but calculating all steps, and in one single round check for finite >>> values. >>> If just one non-finite value is found, the whole array is returned with a >>> large >>> penalty of 1e100. >>> >>> This makes all calculations be the fastest numpy array way. >>> >>> Modified: >>> branches/disp_speed/lib/dispersion/b14.py >>> >>> Modified: branches/disp_speed/lib/dispersion/b14.py >>> URL: >>> http://svn.gna.org/viewcvs/relax/branches/disp_speed/lib/dispersion/b14.py?rev=23220&r1=23219&r2=23220&view=diff >>> ============================================================================== >>> --- branches/disp_speed/lib/dispersion/b14.py (original) >>> +++ branches/disp_speed/lib/dispersion/b14.py Mon May 19 00:51:20 2014 >>> @@ -110,8 +110,7 @@ >>> """ >>> >>> # Python module imports. >>> -import numpy >>> -from numpy import arccosh, array, cos, cosh, in1d, log, nonzero, sin, >>> sinh, sqrt, power >>> +from numpy import arccosh, array, cos, cosh, isfinite, log, power, sin, >>> sinh, sqrt, sum >>> >>> # Repetitive calculations (to speed up calculations). >>> g_fact = 1/sqrt(2) >>> @@ -216,70 +215,31 @@ >>> # Real. The v_1c in paper. >>> v1c = F0 * cosh(E0) - F2 * cos(E2) >>> >>> - # Catch devision with zero in y, when v3 = 0. v3 is 0, when v1c = 1. >>> - # If no 1.0, perform normally. >>> - if not in1d(1.0, v1c): >>> - # Exact result for v2v3. >>> - v3 = sqrt(v1c**2 - 1.) >>> - >>> - y = power( (v1c - v3) / (v1c + v3), ncyc) >>> - >>> - Tog = 0.5 * (1. + y) + (1. - y) * v5 / (2. * v3 * N ) >>> - >>> - # Find where Tog has negative values. >>> - neg_index = nonzero(Tog.real < 0.0)[0] >>> - >>> - # Do normal calculation >>> - if len(neg_index) == 0: >>> - ## -1/Trel * log(LpreDyn). >>> - # Rpre = (r20a + r20b + kex) / 2.0 >>> - >>> - ## Carver and Richards (1972) >>> - # R2eff_CR72 = Rpre - inv_tcpmg * ncyc * arccosh(v1c.real) >>> - >>> - ## Baldwin final. >>> - # Estimate R2eff. relax_time = Trel = 1/inv_tcpmg. >>> - # R2eff = R2eff_CR72 - inv_tcpmg * log(Tog.real) >>> - >>> - # Fastest calculation. >>> - R2eff = (r20a + r20b + kex) / 2.0 - inv_tcpmg * ( ncyc * >>> arccosh(v1c.real) + log(Tog.real) ) >>> - >>> - # Loop over the time points, back calculating the R2eff values. >>> - for i in range(num_points): >>> - >>> - # Put values back. >>> - back_calc[i] = R2eff[i] >>> - >>> - else: >>> - # Loop over each point. >>> - for i in range(num_points): >>> - >>> - # Return large value >>> - if i in neg_index: >>> - back_calc[i] = 1e100 >>> - >>> - else: >>> - v3 = sqrt(v1c[i]**2 - 1.) >>> - y = power( (v1c[i] - v3) / (v1c[i] + v3), ncyc[i]) >>> - Tog = 0.5 * (1. + y) + (1. - y) * v5[i] / (2. * v3 * N >>> ) >>> - R2eff = (r20a + r20b + kex) / 2.0 - inv_tcpmg * ( >>> ncyc[i] * arccosh(v1c[i].real) + log(Tog.real) ) >>> - back_calc[i] = R2eff >>> - >>> - # This section is for catching math domain errors. >>> - else: >>> - # Find index where >>> - one_indexes = nonzero(v1c == 1.0)[0] >>> - >>> - # Loop over each point. >>> - for i in range(num_points): >>> - >>> - # Return large value >>> - if i in one_indexes: >>> - back_calc[i] = 1e100 >>> - >>> - else: >>> - v3 = sqrt(v1c[i]**2 - 1.) >>> - y = power( (v1c[i] - v3) / (v1c[i] + v3), ncyc[i]) >>> - Tog = 0.5 * (1. + y) + (1. - y) * v5[i] / (2. * v3 * N ) >>> - R2eff = (r20a + r20b + kex) / 2.0 - inv_tcpmg * ( ncyc[i] >>> * arccosh(v1c[i].real) + log(Tog.real) ) >>> - back_calc[i] = R2eff >>> + # Exact result for v2v3. >>> + v3 = sqrt(v1c**2 - 1.) >>> + >>> + y = power( (v1c - v3) / (v1c + v3), ncyc) >>> + >>> + Tog = 0.5 * (1. + y) + (1. - y) * v5 / (2. * v3 * N ) >>> + >>> + ## -1/Trel * log(LpreDyn). >>> + # Rpre = (r20a + r20b + kex) / 2.0 >>> + >>> + ## Carver and Richards (1972) >>> + # R2eff_CR72 = Rpre - inv_tcpmg * ncyc * arccosh(v1c.real) >>> + >>> + ## Baldwin final. >>> + # Estimate R2eff. relax_time = Trel = 1/inv_tcpmg. >>> + # R2eff = R2eff_CR72 - inv_tcpmg * log(Tog.real) >>> + >>> + # Fastest calculation. >>> + R2eff = (r20a + r20b + kex) / 2.0 - inv_tcpmg * ( ncyc * >>> arccosh(v1c.real) + log(Tog.real) ) >>> + >>> + # Catch errors, taking a sum over array is the fastest way to check for >>> + # +/- inf (infinity) and nan (not a number). >>> + if not isfinite(sum(R2eff)): >>> + R2eff = array([1e100]*num_points) >>> + >>> + # Parse back the value to update the back_calc class object. >>> + for i in range(num_points): >>> + back_calc[i] = R2eff[i] >>> >>> >>> _______________________________________________ >>> relax (http://www.nmr-relax.com) >>> >>> This is the relax-commits 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-commits >> >> _______________________________________________ >> 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

