|
1 | 1 | # This files defines SectorUnitRange, a unit range associated with a sector and an arrow |
2 | 2 |
|
| 3 | +struct SectorVector{T,Sector,Values<:AbstractVector{T}} <: AbstractVector{T} |
| 4 | + sector::Sector |
| 5 | + values::Values |
| 6 | + isdual::Bool |
| 7 | +end |
| 8 | + |
| 9 | +sector(sv::SectorVector) = sv.sector |
| 10 | +ungrade(sv::SectorVector) = sv.values |
| 11 | +isdual(sv::SectorVector) = sv.isdual |
| 12 | + |
| 13 | +function sectorvector(s, v::AbstractVector, b::Bool=false) |
| 14 | + return SectorVector(to_sector(s), v, b) |
| 15 | +end |
| 16 | +Base.length(sv::SectorVector) = length(sv.values) |
| 17 | +Base.size(sv::SectorVector) = (length(sv),) |
| 18 | +function Base.axes(sv::SectorVector) |
| 19 | + (sectorrange(sector(sv), only(axes(ungrade(sv))), isdual(sv)),) |
| 20 | +end |
| 21 | +Base.getindex(sv::SectorVector, i::Integer) = ungrade(sv)[i] |
| 22 | + |
3 | 23 | # ===================================== Definition ======================================= |
4 | 24 |
|
5 | 25 | # This implementation contains the "full range" |
@@ -51,21 +71,34 @@ Base.iterate(sr::SectorUnitRange) = iterate(ungrade(sr)) |
51 | 71 | Base.iterate(sr::SectorUnitRange, i::Integer) = iterate(ungrade(sr), i) |
52 | 72 |
|
53 | 73 | Base.length(sr::SectorUnitRange) = length(ungrade(sr)) |
| 74 | +Base.size(sr::SectorUnitRange) = (length(sr),) |
| 75 | +function Base.axes(sr::SectorUnitRange) |
| 76 | + (sectorrange(sector(sr), only(axes(ungrade(sr))), isdual(sr)),) |
| 77 | +end |
54 | 78 |
|
55 | 79 | Base.last(sr::SectorUnitRange) = last(ungrade(sr)) |
56 | 80 |
|
57 | 81 | # slicing |
58 | 82 | Base.getindex(sr::SectorUnitRange, i::Integer) = ungrade(sr)[i] |
59 | 83 |
|
60 | | -function Base.getindex(sr::SectorUnitRange, r::AbstractUnitRange{T}) where {T<:Integer} |
61 | | - return sr[SymmetryStyle(sr), r] |
| 84 | +function Base.getindex(sr::SectorUnitRange, I::AbstractVector{<:Integer}) |
| 85 | + return sr[SymmetryStyle(sr), I] |
62 | 86 | end |
63 | | -function Base.getindex(sr::SectorUnitRange, ::NotAbelianStyle, r::AbstractUnitRange) |
| 87 | +function Base.getindex(sr::SectorUnitRange, I::AbstractUnitRange{<:Integer}) |
| 88 | + return sr[SymmetryStyle(sr), I] |
| 89 | +end |
| 90 | +function Base.getindex(sr::SectorUnitRange, ::NotAbelianStyle, r::AbstractVector{<:Integer}) |
64 | 91 | return ungrade(sr)[r] |
65 | 92 | end |
66 | | -function Base.getindex(sr::SectorUnitRange, ::AbelianStyle, r::AbstractUnitRange) |
| 93 | +function Base.getindex(sr::SectorUnitRange, ::AbelianStyle, r::AbstractUnitRange{<:Integer}) |
67 | 94 | return sectorrange(sector(sr), ungrade(sr)[ungrade(r)], isdual(sr)) |
68 | 95 | end |
| 96 | +function Base.getindex(sr::SectorUnitRange, ::AbelianStyle, r::AbstractVector{<:Integer}) |
| 97 | + return sectorvector(sector(sr), ungrade(sr)[ungrade(r)], isdual(sr)) |
| 98 | +end |
| 99 | +function Base.getindex(sr::SectorUnitRange, I::AbstractVector{Bool}) |
| 100 | + return sr[to_indices(sr, (I,))...] |
| 101 | +end |
69 | 102 |
|
70 | 103 | # TODO replace (:,x) indexing with kronecker(:, x) |
71 | 104 | Base.getindex(sr::SectorUnitRange, t::Tuple{Colon,<:Integer}) = sr[(:, last(t):last(t))] |
@@ -114,3 +147,7 @@ sector_type(::Type{<:SectorUnitRange{T,Sector}}) where {T,Sector} = Sector |
114 | 147 | # TBD error for non-integer? |
115 | 148 | sector_multiplicity(sr::SectorUnitRange) = length(sr) ÷ length(sector(sr)) |
116 | 149 | sector_multiplicities(sr::SectorUnitRange) = [sector_multiplicity(sr)] # TBD remove? |
| 150 | + |
| 151 | +function Base.similar(A::Type{<:AbstractArray}, ax::Tuple{SectorOneTo,Vararg{SectorOneTo}}) |
| 152 | + return similar(A, ungrade.(ax)) |
| 153 | +end |
0 commit comments