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

Reply via email to