@@ -35,7 +35,7 @@ Base.keys(a::Tensorizer) = oneto(length(a))
35
35
36
36
function start (a:: TrivialTensorizer{d} ) where {d}
37
37
# ((block_dim_1, block_dim_2,...), (itaration_number, iterator, iterator_state)), (itemssofar, length)
38
- block = SVector {d} ( Ones {Int} (d) )
38
+ block = ntuple (one, d )
39
39
return (block, (0 , nothing , nothing )), (0 ,length (a))
40
40
end
41
41
@@ -64,7 +64,7 @@ function next(a::TrivialTensorizer{d}, iterator_tuple) where {d}
64
64
65
65
# increase block, or initialize new block
66
66
_res, iter_state = iterate (iterator, iter_state)
67
- res = SVector {d} (_res)
67
+ res = Tuple ( SVector {d} (_res) )
68
68
block = res.+ 1
69
69
j = j+ 1
70
70
79
79
80
80
81
81
# (blockrow,blockcol), (subrow,subcol), (rowshift,colshift), (numblockrows,numblockcols), (itemssofar, length)
82
- start (a:: Tensorizer2D ) = _start (a:: Tensorizer2D )
83
- start (a:: TrivialTensorizer{2} ) = _start (a:: Tensorizer2D )
82
+ start (a:: Tensorizer2D ) = _start (a)
83
+ start (a:: TrivialTensorizer{2} ) = _start (a)
84
84
85
85
_start (a) = (1 ,1 ), (1 ,1 ), (0 ,0 ), (a. blocks[1 ][1 ],a. blocks[2 ][1 ]), (0 ,length (a))
86
86
@@ -171,10 +171,22 @@ block(::TrivialTensorizer{2},n::Int) =
171
171
Block (floor (Integer,sqrt (2 n) + 1 / 2 ))
172
172
173
173
function block (:: TrivialTensorizer{d} ,n:: Int ) where {d}
174
- order:: Int = 0
174
+ binomial (d, d) >= n && return Block (1 )
175
+ order = 1
175
176
while binomial (order+ d, d) < n
176
- order = order + 1
177
+ order *= 2
177
178
end
179
+ searchords = order÷ 2 : order
180
+ # perform a binary search
181
+ while length (searchords) > 1
182
+ midpt = searchords[length (searchords)÷ 2 ]
183
+ if binomial (midpt+ d, d) < n
184
+ searchords = (midpt + 1 ): last (searchords)
185
+ else
186
+ searchords = first (searchords): midpt
187
+ end
188
+ end
189
+ order = searchords[]
178
190
return Block (order+ 1 )
179
191
end
180
192
0 commit comments