Well! Of course!
It is essential just one value, with no dimensions. Cheers! 2014-06-10 15:21 GMT+02:00 Edward d'Auvergne <[email protected]>: > I have the end target_functions/relax_disp.py file from the > 'disp_spin_speed' branch open as I make the comments. The elimination > of pA_arr still holds. I changed the line: > > ## Back calculate the R2eff values. > r2eff_CR72(r20a=R20A_axis, r20b=R20B_axis, pA=pA_arr, > dw=dw_frq_a, kex=kex_arr, cpmg_frqs=self.cpmg_frqs_a, > back_calc=self.back_calc_a, num_points=self.num_disp_points_a) > > to: > > ## Back calculate the R2eff values. > r2eff_CR72(r20a=R20A_axis, r20b=R20B_axis, pA=pA, dw=dw_frq_a, > kex=kex_arr, cpmg_frqs=self.cpmg_frqs_a, back_calc=self.back_calc_a, > num_points=self.num_disp_points_a) > > Then changed the pA test in lib.dispersion.cr72 to be 'pA == 1.0'. > And deleted the line creating pA_arr. Running the > Relax_disp.test_cpmg_synthetic_ns3d_to_cr72_noise_cluster system test > changes from 11.6 seconds to 10.2. The test passes before and after > the test. I then did the same thing for kex, and the test dropped to > 8.9 seconds and still passed. There is no reason, that I can > currently see, why it needs to be an array where all elements are the > same pA value. This will be a big speed up and simplification. > > Regards, > > Edward > > On 10 June 2014 15:12, Troels Emtekær Linnet <[email protected]> wrote: >> Hi Ed. >> >> Lets take this again, when you are near the end. >> >> I don't these tests applies to the end result? >> >> Best >> troels >> >> 2014-06-10 15:05 GMT+02:00 Edward d'Auvergne <[email protected]>: >>> Removing the pA_arr and kex_arr structures will make this even faster: >>> >>> $ python -m timeit -n 100000 'import numpy as np; X = np.ones(100, >>> np.float64); pA = 0.9; pA*X' >>> 100000 loops, best of 3: 6.39 usec per loop >>> $ python -m timeit -n 100000 'import numpy as np; X = np.ones(100, >>> np.float64); pA = 0.9; pA_arr = np.array([pA]*100, np.float64); pA*X' >>> 100000 loops, best of 3: 14.2 usec per loop >>> $ python -m timeit -n 100000 'import numpy as np; X = np.ones(100, >>> np.float64); pA = 0.9; pA_arr = np.array([pA]*100, np.float64); >>> pA_arr*X' >>> 100000 loops, best of 3: 13.9 usec per loop >>> >>> So the first one where pA_arr is not created is more than half the >>> speed of the others. This will remove some of the overhead that makes >>> the single spin calculations slower. I'm getting close to the end of >>> the list of your changes now :) >>> >>> Regards, >>> >>> Edward >>> >>> On 10 June 2014 14:37, Troels Emtekær Linnet <[email protected]> wrote: >>>> Hi Edward. >>>> >>>> When you have digged your way through, you will see that I end up with: >>>> https://gna.org/task/?7807#comment56 >>>> >>>> Going from 32.247 seconds to 2 second for a 100 clustered calculation. >>>> >>>> ! BUM! >>>> >>>> 2014-06-10 14:33 GMT+02:00 Edward d'Auvergne <[email protected]>: >>>>> Hi, >>>>> >>>>> Maybe self.spins_a could be renamed as self.ones_array? And >>>>> self.not_spins_a could be self.zeros_array? Or maybe self.ones_struct >>>>> and self.zeros_struct? The spin part is only one dimension of 5, so >>>>> the name is confusing. The name needs to have something to do with >>>>> the ones and zeros, as well as the entire [ei][si][mi][oi][di] >>>>> structure. >>>>> >>>>> Anyway, I can now see that pA_arr is most definitely not needed ;) >>>>> Its removal will make the code much faster. Try and see what happens! >>>>> >>>>> Regards, >>>>> >>>>> Edward >>>>> >>>>> On 10 June 2014 14:25, Troels Emtekær Linnet <[email protected]> >>>>> wrote: >>>>>> Hi Edward. >>>>>> >>>>>> spins_a is the multi dimensional numpy array >>>>>> Of dimension [ei][si][mi][oi][di]. >>>>>> It consists of 1.0 on all places, where there are dispersion points. >>>>>> >>>>>> pA is just the float. >>>>>> >>>>>> So, I think we agree? >>>>>> >>>>>> The pA values has to end up in a multi dimensional array. >>>>>> >>>>>> All multiplications in the target functions has to broadcast to the same >>>>>> size. >>>>>> >>>>>> Numpy multiplication is elements vise. >>>>>> In all dimensions. >>>>>> >>>>>> >>>>>> >>>>>> 2014-06-10 13:45 GMT+02:00 Edward d'Auvergne <[email protected]>: >>>>>>> Hi, >>>>>>> >>>>>>> I don't think you even need the pA array. What is the variable >>>>>>> self.spins_a? Simply try using pA directly. Here is a demo: >>>>>>> >>>>>>> """ >>>>>>> from numpy import array, float64, ones >>>>>>> >>>>>>> a = ones(3) >>>>>>> pA = 0.9 >>>>>>> pA_array = pA * a >>>>>>> >>>>>>> b = array([1, 2, 3], float64) >>>>>>> >>>>>>> print("\nFloat times array:") >>>>>>> print(repr(pA * b)) >>>>>>> print("\nArray times array:") >>>>>>> print(repr(pA_array * b)) >>>>>>> """ >>>>>>> >>>>>>> If you run this, you will obtain the same result for both operations. >>>>>>> Is there a good reason, that I cannot see, why the second option is >>>>>>> required in the target functions? >>>>>>> >>>>>>> Cheers, >>>>>>> >>>>>>> Edward >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> On 10 June 2014 12:09, Troels Emtekær Linnet <[email protected]> >>>>>>> wrote: >>>>>>>> You are Correct !!! >>>>>>>> >>>>>>>> The final version is: >>>>>>>> pA_arr = pA*self.spins_a >>>>>>>> >>>>>>>> The "trick" was to make a numpy multi dimensional spin array in the >>>>>>>> __init__ function of the class. >>>>>>>> >>>>>>>> That is filled with 1.0 where there are dispersion points. >>>>>>>> >>>>>>>> This array essential replace the spin looping! >>>>>>>> >>>>>>>> Best >>>>>>>> Troels >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> 2014-06-10 11:56 GMT+02:00 Edward d'Auvergne <[email protected]>: >>>>>>>>> Hi Troels, >>>>>>>>> >>>>>>>>> From the dispersion equations, to me it looks like that you can keep >>>>>>>>> pA as a single value. Why have you converted it to an array >>>>>>>>> structure? You will have no problems as you can multiply any numpy >>>>>>>>> array with a single float. This should be the same for all model >>>>>>>>> parameters, excluding dw and R20. If you can use single values, that >>>>>>>>> should be much quicker for the target functions. >>>>>>>>> >>>>>>>>> Regards, >>>>>>>>> >>>>>>>>> Edward >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On 8 June 2014 19:48, <[email protected]> wrote: >>>>>>>>>> Author: tlinnet >>>>>>>>>> Date: Sun Jun 8 19:48:31 2014 >>>>>>>>>> New Revision: 23735 >>>>>>>>>> >>>>>>>>>> URL: http://svn.gna.org/viewcvs/relax?rev=23735&view=rev >>>>>>>>>> Log: >>>>>>>>>> Important fix for the creation of the multi dimensional pA numpy >>>>>>>>>> array. >>>>>>>>>> >>>>>>>>>> It should be created as numpy.zeros([ei][si][mi][oi]) instead of >>>>>>>>>> numpy.ones([ei][si][mi][oi]). >>>>>>>>>> >>>>>>>>>> This allows for rapid testing of all dimensions with np.allclose(pA, >>>>>>>>>> numpy.ones(dw.shape)). >>>>>>>>>> pA can have missing filled out values, when the number of dispersion >>>>>>>>>> points are different >>>>>>>>>> per spectrometer frequency. >>>>>>>>>> >>>>>>>>>> Task #7807 (https://gna.org/task/index.php?7807): Speed-up of >>>>>>>>>> dispersion models for Clustered analysis. >>>>>>>>>> >>>>>>>>>> Modified: >>>>>>>>>> branches/disp_spin_speed/target_functions/relax_disp.py >>>>>>>>>> >>>>>>>>>> Modified: branches/disp_spin_speed/target_functions/relax_disp.py >>>>>>>>>> URL: >>>>>>>>>> http://svn.gna.org/viewcvs/relax/branches/disp_spin_speed/target_functions/relax_disp.py?rev=23735&r1=23734&r2=23735&view=diff >>>>>>>>>> ============================================================================== >>>>>>>>>> --- branches/disp_spin_speed/target_functions/relax_disp.py >>>>>>>>>> (original) >>>>>>>>>> +++ branches/disp_spin_speed/target_functions/relax_disp.py Sun >>>>>>>>>> Jun 8 19:48:31 2014 >>>>>>>>>> @@ -411,7 +411,7 @@ >>>>>>>>>> # The number of disp point can change per spectrometer, >>>>>>>>>> so we make the maximum size. >>>>>>>>>> self.R20A_a = np.ones(back_calc_shape + >>>>>>>>>> [self.max_num_disp_points]) >>>>>>>>>> self.R20B_a = np.ones(back_calc_shape + >>>>>>>>>> [self.max_num_disp_points]) >>>>>>>>>> - self.pA_a = np.ones(back_calc_shape + >>>>>>>>>> [self.max_num_disp_points]) >>>>>>>>>> + self.pA_a = np.zeros(back_calc_shape + >>>>>>>>>> [self.max_num_disp_points]) >>>>>>>>>> self.dw_frq_a = np.ones(back_calc_shape + >>>>>>>>>> [self.max_num_disp_points]) >>>>>>>>>> self.kex_a = np.ones(back_calc_shape + >>>>>>>>>> [self.max_num_disp_points]) >>>>>>>>>> self.cpmg_frqs_a = np.ones(back_calc_shape + >>>>>>>>>> [self.max_num_disp_points]) >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> _______________________________________________ >>>>>>>>>> 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

