Skip to content

Commit ad092fc

Browse files
authored
[TypeParameterAccessors] similartype (#1561)
* [TypeParameterAccessors] `similartype` * [NDTensors] Bump to v0.3.50
1 parent 8bb156a commit ad092fc

File tree

17 files changed

+117
-79
lines changed

17 files changed

+117
-79
lines changed

NDTensors/Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "NDTensors"
22
uuid = "23ae76d9-e61a-49c4-8f12-3f1a16adf9cf"
33
authors = ["Matthew Fishman <[email protected]>"]
4-
version = "0.3.49"
4+
version = "0.3.50"
55

66
[deps]
77
Accessors = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697"
Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using .TypeParameterAccessors: TypeParameterAccessors, set_ndims
1+
using .TypeParameterAccessors: TypeParameterAccessors
2+
23
"""
34
# Do we still want to define things like this?
45
TODO: Use `Accessors.jl` notation:
@@ -14,13 +15,3 @@ TODO: Use `Accessors.jl` notation:
1415
function TypeParameterAccessors.set_ndims(numbertype::Type{<:Number}, ndims)
1516
return numbertype
1617
end
17-
18-
"""
19-
`set_indstype` should be overloaded for
20-
types with structured dimensions,
21-
like `OffsetArrays` or named indices
22-
(such as ITensors).
23-
"""
24-
function set_indstype(arraytype::Type{<:AbstractArray}, dims::Tuple)
25-
return set_ndims(arraytype, length(dims))
26-
end

NDTensors/src/abstractarray/similar.jl

Lines changed: 2 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using .TypeParameterAccessors: IsWrappedArray, unwrap_array_type, set_eltype
1+
using Base: DimOrInd, Dims, OneTo
2+
using .TypeParameterAccessors: IsWrappedArray, unwrap_array_type, set_eltype, similartype
23

34
## Custom `NDTensors.similar` implementation.
45
## More extensive than `Base.similar`.
@@ -96,58 +97,3 @@ end
9697
# Use the `size` to determine the dimensions
9798
# NDTensors.similar
9899
similar(array::AbstractArray) = NDTensors.similar(typeof(array), size(array))
99-
100-
## similartype
101-
102-
function similartype(arraytype::Type{<:AbstractArray}, eltype::Type, dims::Tuple)
103-
return similartype(similartype(arraytype, eltype), dims)
104-
end
105-
106-
@traitfn function similartype(
107-
arraytype::Type{ArrayT}, eltype::Type
108-
) where {ArrayT; !IsWrappedArray{ArrayT}}
109-
return set_eltype(arraytype, eltype)
110-
end
111-
112-
@traitfn function similartype(
113-
arraytype::Type{ArrayT}, dims::Tuple
114-
) where {ArrayT; !IsWrappedArray{ArrayT}}
115-
return set_indstype(arraytype, dims)
116-
end
117-
118-
function similartype(arraytype::Type{<:AbstractArray}, dims::DimOrInd...)
119-
return similartype(arraytype, dims)
120-
end
121-
122-
function similartype(arraytype::Type{<:AbstractArray})
123-
return similartype(arraytype, eltype(arraytype))
124-
end
125-
126-
## Wrapped arrays
127-
@traitfn function similartype(
128-
arraytype::Type{ArrayT}, eltype::Type
129-
) where {ArrayT; IsWrappedArray{ArrayT}}
130-
return similartype(unwrap_array_type(arraytype), eltype)
131-
end
132-
133-
@traitfn function similartype(
134-
arraytype::Type{ArrayT}, dims::Tuple
135-
) where {ArrayT; IsWrappedArray{ArrayT}}
136-
return similartype(unwrap_array_type(arraytype), dims)
137-
end
138-
139-
# This is for uniform `Diag` storage which uses
140-
# a Number as the data type.
141-
# TODO: Delete this when we change to using a
142-
# `FillArray` instead. This is a stand-in
143-
# to make things work with the current design.
144-
function similartype(numbertype::Type{<:Number})
145-
return numbertype
146-
end
147-
148-
# Instances
149-
function similartype(array::AbstractArray, eltype::Type, dims...)
150-
return similartype(typeof(array), eltype, dims...)
151-
end
152-
similartype(array::AbstractArray, eltype::Type) = similartype(typeof(array), eltype)
153-
similartype(array::AbstractArray, dims...) = similartype(typeof(array), dims...)

NDTensors/src/blocksparse/blockdims.jl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using .TypeParameterAccessors: TypeParameterAccessors
2+
13
"""
24
BlockDim
35
@@ -18,7 +20,9 @@ const BlockDims{N} = NTuple{N,BlockDim}
1820

1921
Base.ndims(ds::Type{<:BlockDims{N}}) where {N} = N
2022

21-
similartype(::Type{<:BlockDims}, ::Type{Val{N}}) where {N} = BlockDims{N}
23+
function TypeParameterAccessors.similartype(::Type{<:BlockDims}, ::Type{Val{N}}) where {N}
24+
return BlockDims{N}
25+
end
2226

2327
Base.copy(ds::BlockDims) = ds
2428

NDTensors/src/blocksparse/blocksparsetensor.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using .TypeParameterAccessors: similartype
2+
13
#
24
# BlockSparseTensor (Tensor using BlockSparse storage)
35
#

NDTensors/src/blocksparse/diagblocksparse.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using .TypeParameterAccessors: similartype
2+
13
export DiagBlockSparse, DiagBlockSparseTensor
24

35
# DiagBlockSparse can have either Vector storage, in which case

NDTensors/src/blocksparse/similar.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using .TypeParameterAccessors: similartype
2+
13
# NDTensors.similar
24
function similar(storagetype::Type{<:BlockSparse}, blockoffsets::BlockOffsets, dims::Tuple)
35
data = similar(datatype(storagetype), nnz(blockoffsets, dims))

NDTensors/src/diag/similar.jl

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
using NDTensors.TypeParameterAccessors: TypeParameterAccessors
2+
13
# NDTensors.similar
24
function similar(storagetype::Type{<:Diag}, dims::Dims)
35
return setdata(storagetype, similar(datatype(storagetype), mindim(dims)))
46
end
57

68
# TODO: Redesign UniformDiag to make it handled better
79
# by generic code.
8-
function similartype(storagetype::Type{<:UniformDiag}, eltype::Type)
10+
function TypeParameterAccessors.similartype(storagetype::Type{<:UniformDiag}, eltype::Type)
911
# This will also set the `datatype`.
1012
return set_eltype(storagetype, eltype)
1113
end

NDTensors/src/dims.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using .DiagonalArrays: DiagonalArrays
2+
using .TypeParameterAccessors: TypeParameterAccessors
23

34
export dense, dims, dim, mindim, diaglength
45

@@ -52,7 +53,7 @@ dim_to_stride(ds, k::Int) = dim_to_strides(ds)[k]
5253
# code (it helps to construct a Tuple(::NTuple{N,Int}) where the
5354
# only known thing for dispatch is a concrete type such
5455
# as Dims{4})
55-
similartype(::Type{<:Dims}, ::Type{Val{N}}) where {N} = Dims{N}
56+
TypeParameterAccessors.similartype(::Type{<:Dims}, ::Type{Val{N}}) where {N} = Dims{N}
5657

5758
# This is to help with ITensor compatibility
5859
dim(i::Int) = i

NDTensors/src/empty/empty.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
1+
using .TypeParameterAccessors: TypeParameterAccessors, set_eltype, similartype
12

23
#
34
# Represents a tensor order that could be set to any order.
45
#
56

67
struct EmptyOrder end
78

8-
function similartype(StoreT::Type{<:TensorStorage{EmptyNumber}}, ElT::Type)
9+
function TypeParameterAccessors.similartype(
10+
StoreT::Type{<:TensorStorage{EmptyNumber}}, ElT::Type
11+
)
912
return set_eltype(StoreT, ElT)
1013
end
1114

12-
function similartype(
15+
function TypeParameterAccessors.similartype(
1316
StoreT::Type{<:TensorStorage{EmptyNumber}}, DataT::Type{<:AbstractArray}
1417
)
1518
return set_datatype(StoreT, DataT)
1619
end
1720

1821
## TODO fix this similartype to use set eltype for BlockSparse
19-
function similartype(
22+
function TypeParameterAccessors.similartype(
2023
::Type{StoreT}, ::Type{ElT}
2124
) where {StoreT<:BlockSparse{EmptyNumber},ElT}
2225
return BlockSparse{ElT,similartype(datatype(StoreT), ElT),ndims(StoreT)}

0 commit comments

Comments
 (0)