Another optimization request :-)
andrew cooke
andrew at acooke.org
Wed Feb 11 21:56:52 EST 2009
sorry, that was stupid. there is no inversion (apart from 1/m), just the
integration.
still, improving the integration would allow larger steps.
andrew
andrew cooke wrote:
>
> why are you dong this point by point? surely you can express the physics
> as a set of equations and invert the matrix? wouldn't that be a lot
> faster? you'd replace the iteration over all combinations of points with
> a faster matrix inversion.
>
> see for example
> http://www.medwelljournals.com/fulltext/ajit/2006/324-338.pdf page 331
> onwards.
>
> there's a very nice into to the verlet integration mentioned here -
> http://teknikus.dk/tj/gdc2001.htm
>
> andrew
>
>
> jeffg wrote:
>> If anyone wants to take this on... I would really really like to have
>> the spring_layout modified to support multi-threading if at all
>> possible.
>> My test data is 20,000, which makes this process 20,000 x 20,000 or
>> 400,000,000 (400 million) calculations. This is taking somewhere
>> between 2-3 hours an iteration.
>> I plan to plot out over 1,000,000 data points or more, which would put
>> this at 1,000,000,000,000 (1 trillion) calculations. Any help in
>> making this more efficient would be much appreciated.
>>
>> def spring_layout(G, iterations=50, dim=2, node_pos=None,
>> verbose=False):
>> """Spring force model layout"""
>> if node_pos==None : # set the initial positions randomly in 1x1
>> box
>> vpos=random_layout(G, dim=dim)
>> else:
>> vpos=node_pos
>> if iterations==0:
>> return vpos
>> if G.order()==0:
>> k=1.0
>> else:
>> k=N.sqrt(1.0/G.order()) # optimal distance between nodes
>> disp={} # displacements
>>
>> # initial "temperature" (about .1 of domain area)
>> # this is the largest step allowed in the dynamics
>> # linearly step down by dt on each iteration so
>> # on last iteration it is size dt.
>> t=0.1
>> dt=0.1/float(iterations+1)
>> for i in range(0,iterations):
>> for v in G:
>> if verbose==True:
>> print("Interation: " + str(i + 1) + ", Calculating: "
>> + str(v.encode('iso-8859-15', "replace")))
>> disp[v]=N.zeros(dim)
>> for u in G:
>> delta=vpos[v]-vpos[u]
>> dn=max(sqrt(N.dot(delta,delta)),0.01)
>> # repulsive force between all
>> deltaf=delta*k**2/dn**2
>> disp[v]=disp[v]+deltaf
>> # attractive force between neighbors
>> if G.has_edge(v,u):
>> deltaf=-delta*dn**2/(k*dn)
>> disp[v]=disp[v]+deltaf
>>
>> # update positions
>> for v in G:
>> l=max(sqrt(N.dot(disp[v],disp[v])),0.01)
>> vpos[v]=vpos[v]+ disp[v]*t/l
>> t-=dt
>> return vpos
>> --
>> http://mail.python.org/mailman/listinfo/python-list
>>
>>
>
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>
>
More information about the Python-list
mailing list