11import Base: cat
22import Random: MersenneTwister, rand!, randn!
33export partition
4- import LinearAlgebra: UniformScaling
54
65mutable struct AllocateArray{T,N} <: ArrayOp{T,N}
76 eltype:: Type{T}
@@ -177,7 +176,6 @@ Base.zeros(p::BlocksOrAuto, dims::Dims; assignment::AssignmentType = :arbitrary)
177176Base. zeros (:: AutoBlocks , T:: Type , dims:: Dims ; assignment:: AssignmentType = :arbitrary ) =
178177 zeros (auto_blocks (dims), T, dims; assignment)
179178
180-
181179function Base. zero (x:: DArray{T,N} ) where {T,N}
182180 dims = ntuple (i-> x. domain. indexes[i]. stop, N)
183181 sd = first (x. subdomains)
@@ -198,60 +196,6 @@ function LinearAlgebra._zeros(::Type{T}, B::DMatrix, n::Integer) where T
198196 return zeros (auto_blocks (sz), T, sz)
199197end
200198
201- function _allocate_diag (i,T, _dims, domain, p)
202- sA = zeros (T, _dims)
203- dom_idx = indexes (domain)
204- chunk_counts = ntuple (j -> cld (length (dom_idx[j]), p. blocksize[j]), length (dom_idx))
205- subinds_idx = CartesianIndices (ntuple (j -> Base. OneTo (chunk_counts[j]), length (chunk_counts)))[i]
206- subinds = Tuple (subinds_idx)
207- sd = map (enumerate (dom_idx)) do (idx, range)
208- bsz = div (last (range), p. blocksize[idx])
209- start = first (range) + p. blocksize[idx] * (subinds[idx] - 1 )
210- stop = subinds[idx] == bsz + 1 ? last (range) : first (range) + p. blocksize[idx] * subinds[idx] - 1
211- start: stop
212- end
213- overlap = intersect (sd[1 ], sd[2 ])
214- if ! isempty (overlap)
215- row_offset = first (sd[1 ]) - 1
216- col_offset = first (sd[2 ]) - 1
217- for g in overlap
218- sA[g - row_offset, g - col_offset] = one (T)
219- end
220- end
221- return sA
222- end
223-
224- function DMatrix (p:: BlocksOrAuto , s:: UniformScaling , dims:: Dims ; assignment:: AssignmentType = :arbitrary )
225- d = ArrayDomain (map (x-> 1 : x, dims))
226- sd = partition (p, d)
227- T = eltype (s)
228- a = AllocateArray (T, (i, T, _dims) -> _allocate_diag (i, T, _dims, d, p), true , d, partition (p, d), p, assignment)
229- return _to_darray (a)
230- end
231- DMatrix (p:: BlocksOrAuto , s:: UniformScaling , dims:: Integer... ; assignment:: AssignmentType = :arbitrary ) =
232- DMatrix (p, s, dims; assignment)
233- DMatrix (:: AutoBlocks , s:: UniformScaling , dims:: Dims ; assignment:: AssignmentType = :arbitrary ) =
234- DMatrix (auto_blocks (dims), s:: UniformScaling , dims; assignment)
235-
236- function DArray (p:: BlocksOrAuto , s:: UniformScaling , dims:: Dims ; assignment:: AssignmentType = :arbitrary )
237- length (dims) == 2 || throw (ArgumentError (" UniformScaling allocation requires exactly two dimensions" ))
238- return DMatrix (p, s, dims; assignment)
239- end
240- DArray (p:: BlocksOrAuto , s:: UniformScaling , dims:: Integer... ; assignment:: AssignmentType = :arbitrary ) =
241- DArray (p, s, dims; assignment)
242- DArray (:: AutoBlocks , s:: UniformScaling , dims:: Dims ; assignment:: AssignmentType = :arbitrary ) =
243- DArray (auto_blocks (dims), s:: UniformScaling , dims; assignment)
244-
245- function DArray {T} (p:: BlocksOrAuto , :: UndefInitializer , dims:: Dims ; assignment:: AssignmentType = :arbitrary ) where {T}
246- d = ArrayDomain (map (x-> 1 : x, dims))
247- a = AllocateArray (T, AllocateUndef {T} (), false , d, partition (p, d), p, assignment)
248- return _to_darray (a)
249- end
250-
251- DArray {T} (p:: BlocksOrAuto , :: UndefInitializer , dims:: Integer... ; assignment:: AssignmentType = :arbitrary ) where {T} =
252- DArray {T} (p, undef, dims; assignment)
253- DArray {T} (p:: AutoBlocks , :: UndefInitializer , dims:: Dims ; assignment:: AssignmentType = :arbitrary ) where {T} =
254- DArray {T} (auto_blocks (dims), undef, dims; assignment)
255199function Base. view (A:: AbstractArray{T,N} , p:: Blocks{N} ) where {T,N}
256200 d = ArrayDomain (Base. index_shape (A))
257201 dc = partition (p, d)
0 commit comments