@@ -64,6 +64,7 @@ const fill_limit = 0.5
64
64
65
65
import Combinatorics: combinations
66
66
67
+ combo_calc (k,g) = collect (combinations (1 : k,g))
67
68
const combo_cache = Vector{Vector{Vector{Int}}}[]
68
69
const combo_extra = Vector{Vector{Vector{Int}}}[]
69
70
function combo (n:: Int ,g:: Int ):: Vector{Vector{Int}}
@@ -77,53 +78,53 @@ function combo(n::Int,g::Int)::Vector{Vector{Int}}
77
78
@inbounds for k ∈ length (combo_extra[N])+ 1 : g
78
79
@inbounds push! (combo_extra[N],Vector{Int}[])
79
80
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))
81
82
@inbounds combo_extra[N][g]
82
83
else
83
84
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]))
86
86
end
87
87
@inbounds combo_cache[n][g]
88
88
end
89
89
end
90
90
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)[]
93
94
@pure function binomsum (n:: Int , i:: Int ):: Int
94
95
if n> sparse_limit
95
96
N= n- sparse_limit
96
97
for k ∈ length (binomsum_extra)+ 1 : N
97
- push! (binomsum_extra,Int[] )
98
+ push! (binomsum_extra,SVector {0, Int} () )
98
99
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) )
100
101
@inbounds binomsum_extra[N][i+ 1 ]
101
102
else
102
103
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) )
104
105
end
105
106
@inbounds binomsum_cache[n+ 1 ][i+ 1 ]
106
107
end
107
108
end
108
- @pure function binomsum_set (n:: Int ):: Vector{ Int}
109
+ @pure function binomsum_set (n:: Int ):: (SVector{N, Int} where N)
109
110
if n> sparse_limit
110
111
N= n- sparse_limit
111
112
for k ∈ length (binomsum_extra)+ 1 : N
112
- push! (binomsum_extra,Int[] )
113
+ push! (binomsum_extra,SVector {0, Int} () )
113
114
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) )
115
116
@inbounds binomsum_extra[N]
116
117
else
117
118
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) )
119
120
end
120
121
@inbounds binomsum_cache[n+ 1 ]
121
122
end
122
123
end
123
124
124
125
@pure function bladeindex_calc (d,k)
125
126
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 )))
127
128
end
128
129
const bladeindex_cache = Vector{Int}[]
129
130
const bladeindex_extra = Vector{Int}[]
@@ -143,7 +144,7 @@ const bladeindex_extra = Vector{Int}[]
143
144
else
144
145
j = length (bladeindex_cache)+ 1
145
146
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)) )
147
148
GC. gc ()
148
149
end
149
150
@inbounds bladeindex_cache[n][s]
@@ -176,6 +177,8 @@ const basisindex_extra = Vector{Int}[]
176
177
end
177
178
end
178
179
180
+ index2int (k,c) = bit2int (indexbits (k,c))
181
+ indexbasis_calc (k,G) = index2int .(k,combo (k,G))
179
182
const indexbasis_cache = Vector{Vector{UInt}}[]
180
183
const indexbasis_extra = Vector{Vector{UInt}}[]
181
184
@pure function indexbasis (n:: Int ,g:: Int ):: Vector{UInt}
@@ -188,12 +191,12 @@ const indexbasis_extra = Vector{Vector{UInt}}[]
188
191
@inbounds push! (indexbasis_extra[N],UInt[])
189
192
end
190
193
@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)
192
195
end
193
196
@inbounds indexbasis_extra[N][g]
194
197
else
195
198
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) )
197
200
end
198
201
@inbounds g> 0 ? indexbasis_cache[n][g] : [zero (UInt)]
199
202
end
0 commit comments