Skip to content

Commit f76020f

Browse files
committed
refactored cached utilities
1 parent b3215e7 commit f76020f

File tree

2 files changed

+20
-17
lines changed

2 files changed

+20
-17
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "DirectSum"
22
uuid = "22fd7b30-a8c0-5bf2-aabe-97783860d07c"
33
authors = ["Michael Reed"]
4-
version = "0.5.6"
4+
version = "0.5.7"
55

66
[deps]
77
ComputedFieldTypes = "459fdd68-db75-56b8-8c15-d717a790f88e"

src/utilities.jl

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const fill_limit = 0.5
6464

6565
import Combinatorics: combinations
6666

67+
combo_calc(k,g) = collect(combinations(1:k,g))
6768
const combo_cache = Vector{Vector{Vector{Int}}}[]
6869
const combo_extra = Vector{Vector{Vector{Int}}}[]
6970
function combo(n::Int,g::Int)::Vector{Vector{Int}}
@@ -77,53 +78,53 @@ function combo(n::Int,g::Int)::Vector{Vector{Int}}
7778
@inbounds for k length(combo_extra[N])+1:g
7879
@inbounds push!(combo_extra[N],Vector{Int}[])
7980
end
80-
@inbounds isempty(combo_extra[N][g]) && (combo_extra[N][g]=collect(combinations(1:n,g)))
81+
@inbounds isempty(combo_extra[N][g]) && (combo_extra[N][g]=combo_calc(n,g))
8182
@inbounds combo_extra[N][g]
8283
else
8384
for k length(combo_cache)+1:min(n,sparse_limit)
84-
z = 1:k
85-
push!(combo_cache,[collect(combinations(z,q)) for q z])
85+
push!(combo_cache,([combo_calc(k,q) for q 1:k]))
8686
end
8787
@inbounds combo_cache[n][g]
8888
end
8989
end
9090

91-
const binomsum_cache = [[0],[0,1]]
92-
const binomsum_extra = Vector{Int}[]
91+
binomsum_calc(n) = SVector{n+2,Int}([0;cumsum([binomial(n,q) for q=0:n])])
92+
const binomsum_cache = (SVector{N,Int} where N)[SVector(0),SVector(0,1)]
93+
const binomsum_extra = (SVector{N,Int} where N)[]
9394
@pure function binomsum(n::Int, i::Int)::Int
9495
if n>sparse_limit
9596
N=n-sparse_limit
9697
for k length(binomsum_extra)+1:N
97-
push!(binomsum_extra,Int[])
98+
push!(binomsum_extra,SVector{0,Int}())
9899
end
99-
@inbounds isempty(binomsum_extra[N]) && (binomsum_extra[N]=[0;cumsum([binomial(n,q) for q=0:n])])
100+
@inbounds isempty(binomsum_extra[N]) && (binomsum_extra[N]=binomsum_calc(n))
100101
@inbounds binomsum_extra[N][i+1]
101102
else
102103
for k=length(binomsum_cache):n+1
103-
push!(binomsum_cache, [0;cumsum([binomial(k,q) for q=0:k])])
104+
push!(binomsum_cache,binomsum_calc(k))
104105
end
105106
@inbounds binomsum_cache[n+1][i+1]
106107
end
107108
end
108-
@pure function binomsum_set(n::Int)::Vector{Int}
109+
@pure function binomsum_set(n::Int)::(SVector{N,Int} where N)
109110
if n>sparse_limit
110111
N=n-sparse_limit
111112
for k length(binomsum_extra)+1:N
112-
push!(binomsum_extra,Int[])
113+
push!(binomsum_extra,SVector{0,Int}())
113114
end
114-
@inbounds isempty(binomsum_extra[N]) && (binomsum_extra[N]=[0;cumsum([binomial(n,q) for q=0:n])])
115+
@inbounds isempty(binomsum_extra[N]) && (binomsum_extra[N]=binomsum_calc(n))
115116
@inbounds binomsum_extra[N]
116117
else
117118
for k=length(binomsum_cache):n+1
118-
push!(binomsum_cache, [0;cumsum([binomial(k,q) for q=0:k])])
119+
push!(binomsum_cache,binomsum_calc(k))
119120
end
120121
@inbounds binomsum_cache[n+1]
121122
end
122123
end
123124

124125
@pure function bladeindex_calc(d,k)
125126
H = indices(UInt(d),k)
126-
findall(x->x==H,combo(k,length(H)))[1]
127+
findfirst(x->x==H,combo(k,count_ones(d)))
127128
end
128129
const bladeindex_cache = Vector{Int}[]
129130
const bladeindex_extra = Vector{Int}[]
@@ -143,7 +144,7 @@ const bladeindex_extra = Vector{Int}[]
143144
else
144145
j = length(bladeindex_cache)+1
145146
for k j:min(n,cache_limit)
146-
push!(bladeindex_cache,[bladeindex_calc(d,k) for d 1:1<<k-1])
147+
push!(bladeindex_cache,(bladeindex_calc.(1:1<<k-1,k)))
147148
GC.gc()
148149
end
149150
@inbounds bladeindex_cache[n][s]
@@ -176,6 +177,8 @@ const basisindex_extra = Vector{Int}[]
176177
end
177178
end
178179

180+
index2int(k,c) = bit2int(indexbits(k,c))
181+
indexbasis_calc(k,G) = index2int.(k,combo(k,G))
179182
const indexbasis_cache = Vector{Vector{UInt}}[]
180183
const indexbasis_extra = Vector{Vector{UInt}}[]
181184
@pure function indexbasis(n::Int,g::Int)::Vector{UInt}
@@ -188,12 +191,12 @@ const indexbasis_extra = Vector{Vector{UInt}}[]
188191
@inbounds push!(indexbasis_extra[N],UInt[])
189192
end
190193
@inbounds if isempty(indexbasis_extra[N][g])
191-
@inbounds indexbasis_extra[N][g] = [bit2int(indexbits(n,combo(n,g)[q])) for q 1:binomial(n,g)]
194+
@inbounds indexbasis_extra[N][g] = indexbasis_calc(n,g)
192195
end
193196
@inbounds indexbasis_extra[N][g]
194197
else
195198
for k length(indexbasis_cache)+1:n
196-
push!(indexbasis_cache,[[bit2int(indexbits(k,@inbounds(combo(k,G)[q]))) for q 1:binomial(k,G)] for G 1:k])
199+
push!(indexbasis_cache,indexbasis_calc.(k,1:k))
197200
end
198201
@inbounds g>0 ? indexbasis_cache[n][g] : [zero(UInt)]
199202
end

0 commit comments

Comments
 (0)