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

Reply via email to