rusandris / StateTransitionNetworks.jl

Toolkit for dynamics on state transition networks
1 stars 0 forks source link

Performance tweaks on `timeseries_to_grid` #19

Closed rusandris closed 3 months ago

rusandris commented 5 months ago

using StateTransitionNetworks, DynamicalSystems Extra allocations make timeseries_to_grid! slow when using Matrix :


a::Float64 = 0.9
b0::Float64 = -0.6
c::Float64 = 2.0
d::Float64 = 0.5

p::Vector{Float64} = [a,b0,c,d]
const u0::Vector{Float64} = [0.0,0.1]

tinkerbell_map(u,p,n) = SVector(u[1]^2-u[2]^2+p[1]*u[1]+p[2]*u[2],2*u[1]*u[2]+p[3]*u[1]+p[4]*u[2])
ds = DeterministicIteratedMap(tinkerbell_map,u0,p);

orbit,t = trajectory(ds,10^8;Ttr=1000) #orbit is a StateSpaceSet
sts_container::Vector{Int64} = zeros(Int64,length(orbit))
orbit_container::Matrix{Float64} = zeros(Float64,length(sts_container),2)

These are the runtimes:


#StateSpaceSet
@time timeseries_to_grid!(sts_container,orbit,20;grid_edges=[-2.0,-2.0,1.0,1.0])
  0.408147 seconds (2 allocations: 112 bytes)

#Matrix
@time timeseries_to_grid!(sts_container,orbit_container,20;grid_edges=[-2.0,-2.0,1.0,1.0])
  4.781223 seconds (100.00 M allocations: 7.451 GiB, 21.31% gc time)

After 47cfc81 , these are the times:

using timeseries_to_grid! on orbit (StateSpaceSet):

#StateSpaceSet
@time timeseries_to_grid!(sts_container,orbit,20;grid_edges=[-2.0,-2.0,1.0,1.0])
  0.400138 seconds (2 allocations: 112 bytes)

using timeseries_to_grid! on orbit_container (Matrix):

#Matrix
@time timeseries_to_grid!(sts_container,orbit_container,20;grid_edges=[-2.0,-2.0,1.0,1.0])
  0.424535 seconds (1 allocation: 96 bytes)
rusandris commented 3 months ago

Passes tests of e317379