Skip to content
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
fb4693f
add todo for function split
borisdevos Mar 17, 2025
13bcf82
add comment for possible change in function merge
borisdevos Mar 17, 2025
09467c6
change one to leftone in bendright
borisdevos Mar 17, 2025
2878e08
change one to leftone in foldright
borisdevos Mar 17, 2025
10744b2
change one to f.coupled in elementary_trace
borisdevos Mar 17, 2025
1ed1ed1
progress on correct units in trace
borisdevos Mar 25, 2025
c31b99c
change dim of GradedSpace to not evaluate one
borisdevos Mar 25, 2025
a33d028
use a function that's actually exported in dimension of `GradedSpace`
borisdevos Mar 26, 2025
0e3c5df
update TensorOperations scalartype determination
lkdvos Apr 10, 2025
124def4
Merge pull request #1 from lkdvos/fork
borisdevos Apr 11, 2025
9635362
Revert "use a function that's actually exported in dimension of `Grad…
borisdevos Apr 14, 2025
4bc1e7c
Revert "change dim of GradedSpace to not evaluate one"
borisdevos Apr 14, 2025
24be2ea
irrelevant typos, but must be corrected
borisdevos Apr 16, 2025
13af986
another minor typo
borisdevos Apr 16, 2025
095dcda
minor typos
borisdevos May 6, 2025
fbfb564
then vs than is hard
borisdevos May 6, 2025
d7cae4f
remove debug elements
borisdevos May 7, 2025
a14fc70
Merge branch 'master' of https://github.com/Jutho/TensorKit.jl into b…
borisdevos May 7, 2025
4fe82f9
change TensorOperations scalartype promotion to base off field of num…
borisdevos May 8, 2025
55a00c0
typo in docs
borisdevos Jun 13, 2025
0113f73
remove some debug comments
borisdevos Jun 13, 2025
8e8b760
more rigorous check in `merge`
borisdevos Jun 18, 2025
78b135e
replace `one` evaluation in `split` with `leftone`
borisdevos Jun 18, 2025
440b42b
typos in docs
borisdevos Jun 18, 2025
00825af
typo in `_fusiontree_iterate`
borisdevos Jun 18, 2025
aad8fc8
apply suggestions related to tensor types
borisdevos Jul 4, 2025
c0ef01e
remove excess variable
borisdevos Jul 4, 2025
c189284
apply `split` suggestion
borisdevos Jul 4, 2025
bdbd2e6
format
borisdevos Jul 7, 2025
e23e092
change units in `elementary_trace`
borisdevos Jul 15, 2025
06671f3
import IsingBimod + remove dupe exports
borisdevos Jul 16, 2025
a18f73d
add first requirements for `IsingBimod`-graded vector spaces
borisdevos Jul 16, 2025
979036a
Merge branch 'master' of https://github.com/Jutho/TensorKit.jl into b…
borisdevos Jul 17, 2025
279a15f
fix variable expression to not be variable because it's not variable
borisdevos Jul 17, 2025
83d73ce
Merge branch 'master' of https://github.com/Jutho/TensorKit.jl into b…
borisdevos Jul 18, 2025
d7fb9f4
add `dim` for `Vect[IsingBimod]` + typos in fields
borisdevos Jul 18, 2025
9521574
start of multifusion tests
borisdevos Jul 18, 2025
19ba225
finish up multifusion space tests
borisdevos Jul 23, 2025
5fef11e
remove equal sectors check in `left/rightoneunit`
borisdevos Jul 23, 2025
2d9663b
add `left/rightoneunit` for any `GradedSpace`
borisdevos Jul 24, 2025
0061588
start on `DiagonalTensor` tests
borisdevos Jul 25, 2025
abb6301
start of fusion tree tests
borisdevos Jul 25, 2025
64982d6
custom `FusionTree` constructor for only uncoupled provided
borisdevos Jul 25, 2025
520f81d
finish fusion tree and `DiagonalTensor` tests
borisdevos Jul 30, 2025
60bc1fc
minor changes
borisdevos Jul 30, 2025
490aa4f
export `left/rightoneunit`
borisdevos Jul 30, 2025
8ab417d
make `artin_braid` excessively multifusion-compatible
borisdevos Jul 30, 2025
6348815
add `zero` and `fusiontrees` constructor for `IsingBimod`
borisdevos Jul 30, 2025
2a7d871
start of `HomSpace` tests
borisdevos Jul 30, 2025
a6bf085
start of tensor tests
borisdevos Jul 30, 2025
159143e
remove todo
borisdevos Jul 30, 2025
42fd12b
remove version check
borisdevos Jul 30, 2025
5393d87
remove tests that will inherently fail + comments on future changes
borisdevos Jul 31, 2025
5898bc0
rewrite tensor factorisation tests to not use `permute`
borisdevos Jul 31, 2025
6351cf0
rewrite tensor product test via contraction to not permute + be planar
borisdevos Jul 31, 2025
2d107a5
rewrite partial and full trace tests to not use `permute` and friends
borisdevos Jul 31, 2025
1d3c170
give all objects of `IsingBimod` a name + attempt at non-diagonal spaces
borisdevos Jul 31, 2025
bae646a
add off-diagonal spaces + make (most) tests compatible with off-diago…
borisdevos Aug 4, 2025
99b8d1c
change `blocksectors` to not evaluate `isone` (see comment!)
borisdevos Aug 4, 2025
a8e8b81
import `leftone` and `rightone` to tests + remove `pentagon/hexagon_e…
borisdevos Aug 4, 2025
45ff559
respecify TensorKit method for factorisation algorithms in multifusion
borisdevos Aug 4, 2025
260ef92
rewrite trace and factorisation tests to not use permute + assert sym…
borisdevos Aug 4, 2025
cd8e37b
format with v1
borisdevos Aug 4, 2025
772452f
add TensorKitSectors to extras for tests
borisdevos Aug 4, 2025
fd55983
define `left/rightoneunit` correctly
borisdevos Aug 4, 2025
04d6162
remove some comments
borisdevos Aug 4, 2025
5d34b60
fix docstring
borisdevos Aug 4, 2025
d25510a
actually include the multifusion tests
borisdevos Aug 4, 2025
a3857da
fix fermion parity full trace test
borisdevos Aug 4, 2025
de2bcae
fix quote escape in @constinferred + move misplaced tensormaps
borisdevos Aug 4, 2025
3ea5293
uncomment tests
borisdevos Aug 6, 2025
6c20fc6
add custom `scalar` to deal with semisimple unit
borisdevos Aug 7, 2025
3dd1257
move around include file ordering
borisdevos Aug 7, 2025
69e7423
remove debug elements
borisdevos Aug 7, 2025
ae10a73
remove fixme
borisdevos Aug 7, 2025
7f01306
add `left/rightoneunit` test for other `Sector`s
borisdevos Aug 7, 2025
8d2e94f
typo
borisdevos Aug 12, 2025
6501e5f
otimes between tensor maps change to account for `sectorscalartype`
borisdevos Aug 13, 2025
07bcc51
export `left/rightone`
borisdevos Aug 26, 2025
52fa8d4
redefine `left/rightoneunit` for the usual `GradedSpace`s
borisdevos Aug 26, 2025
41013ec
add `left/rightoneunit` test on empty space
borisdevos Aug 26, 2025
c71b15c
add check to `left/rightoneunit` of `IsingBimod` spaces when empty
borisdevos Aug 26, 2025
ddc1612
return vector in `IsingBimod` `blocksectors`
borisdevos Aug 26, 2025
17f1e1b
use `isone` again in `blocksectors`
borisdevos Aug 26, 2025
e8f6a76
use `isone` again in `artin_braid`
borisdevos Aug 26, 2025
df0115e
Revert "add TensorKitSectors to extras for tests"
borisdevos Aug 26, 2025
ac56fae
remove import TKS to tests + use `isone` again
borisdevos Aug 26, 2025
599cabd
Merge branch 'master' of https://github.com/Jutho/TensorKit.jl into b…
borisdevos Aug 26, 2025
0612656
fix argument errors in tests + tests for empty space
borisdevos Aug 26, 2025
698d652
renaming to `IsingBimodule`
borisdevos Aug 26, 2025
9b5ba0b
format
borisdevos Aug 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,10 @@ ChainRulesTestUtils = "cdddcdb0-9152-4a09-a978-84456f9df70a"
Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa"
FiniteDifferences = "26cc04aa-876d-5657-8c51-4c34ba976000"
LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e"
TensorKitSectors = "13a9c161-d5da-41f0-bcbd-e1a08ae0647f"
TensorOperations = "6aa20fa7-93e2-5fca-9bc0-fbd0db3c71a2"
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
TestExtras = "5ed8adda-3752-4e41-b88a-e8b09835ee3a"
Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f"

[targets]
test = ["Aqua", "Combinatorics", "LinearAlgebra", "TensorKitSectors", "TensorOperations", "Test", "TestExtras", "ChainRulesCore", "ChainRulesTestUtils", "FiniteDifferences", "Zygote"]
test = ["Aqua", "Combinatorics", "LinearAlgebra", "TensorOperations", "Test", "TestExtras", "ChainRulesCore", "ChainRulesTestUtils", "FiniteDifferences", "Zygote"]
5 changes: 3 additions & 2 deletions src/TensorKit.jl
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ export BraidingStyle, SymmetricBraiding, Bosonic, Fermionic, Anyonic, NoBraiding
export Trivial, Z2Irrep, Z3Irrep, Z4Irrep, ZNIrrep, U1Irrep, SU2Irrep, CU1Irrep
export ProductSector
export FermionParity, FermionNumber, FermionSpin
export FibonacciAnyon, IsingAnyon, IsingBimod
export FibonacciAnyon, IsingAnyon, IsingBimodule
export leftone, rightone

export VectorSpace, Field, ElementarySpace # abstract vector spaces
export InnerProductStyle, NoInnerProduct, HasInnerProduct, EuclideanInnerProduct
Expand Down Expand Up @@ -228,7 +229,7 @@ include("planar/planaroperations.jl")
# deprecations: to be removed in version 1.0 or sooner
include("auxiliary/deprecate.jl")

# Additional methods for IsingBimod Sector
# Additional methods for IsingBimodule Sector
# ----------------------------------------
include("spaces/multifusionspace.jl")

Expand Down
6 changes: 2 additions & 4 deletions src/fusiontrees/manipulations.jl
Original file line number Diff line number Diff line change
Expand Up @@ -835,15 +835,13 @@ function artin_braid(f::FusionTree{I,N}, i; inv::Bool=false) where {I<:Sector,N}
vertices = f.vertices
oneT = one(sectorscalartype(I))

diaga = a == leftone(a) == rightone(a) # might be excessive because multifusion doesn't support braiding currently
diagb = b == leftone(b) == rightone(b)
if diaga || diagb
if isone(a) || isone(b)
# braiding with trivial sector: simple and always possible
inner′ = inner
vertices′ = vertices
if i > 1 # we also need to alter innerlines and vertices
inner′ = TupleTools.setindex(inner,
inner_extended[diaga ? (i + 1) : (i - 1)],
inner_extended[isone(a) ? (i + 1) : (i - 1)],
i - 1)
vertices′ = TupleTools.setindex(vertices′, vertices[i], i - 1)
vertices′ = TupleTools.setindex(vertices′, vertices[i - 1], i)
Expand Down
10 changes: 2 additions & 8 deletions src/spaces/gradedspace.jl
Original file line number Diff line number Diff line change
Expand Up @@ -139,21 +139,15 @@ Base.oneunit(S::Type{<:GradedSpace{I}}) where {I<:Sector} = S(one(I) => 1)
Return the corresponding vector space of type `GradedSpace{I}` that represents the trivial
one-dimensional space consisting of the left unit of the objects in `Sector` `I`.
"""
function leftoneunit(S::GradedSpace{I}) where {I<:Sector}
sector = leftone(first(sectors(S)))
return spacetype(S)(sector => 1)
end
leftoneunit(S::GradedSpace{I}) where {I<:Sector} = oneunit(typeof(S))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What was wrong with the previous implementations? This looks like it will always fail for multifusion things

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wanted left/rightoneunit to also work on empty spaces, because oneunit does so. This will indeed fail for multifusion things, hence the specialisation.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, but what do you think about this then:

function leftoneunit(V::GradedSpace{I}) where {I<:Sector}
    s = sectors(V)
    u = leftoneunit(isempty(s) ? I : first(s))
    return spacetype(V)(u => 1)
end


"""
rightoneunit(S::GradedSpace{I}) where {I<:Sector} -> GradedSpace{I}

Return the corresponding vector space of type `GradedSpace{I}` that represents the trivial
one-dimensional space consisting of the right unit of the objects in `Sector` `I`.
"""
function rightoneunit(S::GradedSpace{I}) where {I<:Sector}
sector = rightone(first(sectors(S)))
return spacetype(S)(sector => 1)
end
rightoneunit(S::GradedSpace{I}) where {I<:Sector} = oneunit(typeof(S))

Base.zero(S::Type{<:GradedSpace{I}}) where {I<:Sector} = S(one(I) => 0)

Expand Down
45 changes: 24 additions & 21 deletions src/spaces/multifusionspace.jl
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not great if we have to specialize everything specifically for Vect[IsingBimodule], since this would mean we have to redo all that work for any multifusion category. In that sense, we would either need a fusion type that specifies this, such that we can specialize properly, or write these methods in a generic way that works for everything

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what you mean by redoing all that work. IsingBimodule should be the only multifusion category tested within TensorKit itself. This infrastructure already exists in MultiTensorKit (albeit in a PR for now), which will support all the other multifusion categories.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What I mean is that if all we are testing is the specializations that are written solely for IsingBimodule, which is used mainly for testing, this doesn't actually help all that much, since it would have to be both reimplemented and retested for other multifusion categories as well

Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
# additional interface to deal with IsingBimod Sector
# additional interface to deal with IsingBimodule Sector
#------------------------------------------------------------------------------

# make this a separate module?

function dim(V::Vect[IsingBimod])
function dim(V::Vect[IsingBimodule])
T = Base.promote_op(*, Int, real(sectorscalartype(sectortype(V))))
return reduce(+, dim(V, c) * dim(c) for c in sectors(V);
init=zero(T))
end

function scalar(t::AbstractTensorMap{T,Vect[IsingBimod],0,0}) where {T}
function scalar(t::AbstractTensorMap{T,Vect[IsingBimodule],0,0}) where {T}
Bs = collect(blocks(t))
inds = findall(!iszero ∘ last, Bs)
isempty(inds) && return zero(scalartype(t))
return only(last(Bs[only(inds)]))
end

function Base.oneunit(S::Vect[IsingBimod])
# no custom fuse: we choose to return empty graded space when fusion is forbidden

function Base.oneunit(S::Vect[IsingBimodule])
!isempty(sectors(S)) || throw(ArgumentError("Cannot determine type of empty space"))
allequal(a.row for a in sectors(S)) && allequal(a.col for a in sectors(S)) ||
throw(ArgumentError("sectors of $S are not all equal"))
first(sectors(S)).row == first(sectors(S)).col ||
Expand All @@ -25,43 +26,45 @@ function Base.oneunit(S::Vect[IsingBimod])
return spacetype(S)(sector => 1)
end

Base.zero(S::Type{Vect[IsingBimod]}) = Vect[IsingBimod]()
Base.zero(S::Type{Vect[IsingBimodule]}) = Vect[IsingBimodule]()

function blocksectors(W::TensorMapSpace{Vect[IsingBimod],N₁,N₂}) where {N₁,N₂}
function blocksectors(W::TensorMapSpace{Vect[IsingBimodule],N₁,N₂}) where {N₁,N₂}
codom = codomain(W)
dom = domain(W)
if N₁ == 0 && N₂ == 0
return (IsingBimod(1, 1, 0), IsingBimod(2, 2, 0))
return [IsingBimodule(1, 1, 0), IsingBimodule(2, 2, 0)]
elseif N₁ == 0
@assert N₂ != 0 "one of Type IsingBimod doesn't exist"
return filter!(c -> c == leftone(c) == rightone(c), collect(blocksectors(dom))) # is this what we want? doesn't allow M/Mop to end at empty space
@assert N₂ != 0 "one of Type IsingBimodule doesn't exist"
return filter!(isone, collect(blocksectors(dom))) # is this what we want? doesn't allow M/Mop to end at empty space
elseif N₂ == 0
@assert N₁ != 0 "one of Type IsingBimod doesn't exist"
return filter!(c -> c == leftone(c) == rightone(c), collect(blocksectors(codom)))
@assert N₁ != 0 "one of Type IsingBimodule doesn't exist"
return filter!(isone, collect(blocksectors(codom)))
elseif N₂ <= N₁ # keep intersection
return filter!(c -> hasblock(codom, c), collect(blocksectors(dom)))
else
return filter!(c -> hasblock(dom, c), collect(blocksectors(codom)))
end
end

function rightoneunit(S::Vect[IsingBimod])
function rightoneunit(S::Vect[IsingBimodule])
!isempty(sectors(S)) || throw(ArgumentError("Cannot determine type of empty space"))
allequal(a.col for a in sectors(S)) ||
throw(ArgumentError("sectors of $S do not have the same rightone"))

sector = rightone(first(sectors(S)))
return spacetype(S)(sector => 1)
end

function leftoneunit(S::Vect[IsingBimod])
function leftoneunit(S::Vect[IsingBimodule])
!isempty(sectors(S)) || throw(ArgumentError("Cannot determine type of empty space"))
allequal(a.row for a in sectors(S)) ||
throw(ArgumentError("sectors of $S do not have the same leftone"))

sector = leftone(first(sectors(S)))
return spacetype(S)(sector => 1)
end

function insertrightunit(P::ProductSpace{Vect[IsingBimod],N}, ::Val{i};
function insertrightunit(P::ProductSpace{Vect[IsingBimodule],N}, ::Val{i};
conj::Bool=false,
dual::Bool=false) where {i,N}
i > N && error("cannot insert a sensible right unit onto $P at index $(i+1)")
Expand All @@ -77,7 +80,7 @@ function insertrightunit(P::ProductSpace{Vect[IsingBimod],N}, ::Val{i};
end

# TODO?: overwrite defaults at level of HomSpace and TensorMap?
function insertleftunit(P::ProductSpace{Vect[IsingBimod],N}, ::Val{i}; # want no defaults?
function insertleftunit(P::ProductSpace{Vect[IsingBimodule],N}, ::Val{i}; # want no defaults?
conj::Bool=false,
dual::Bool=false) where {i,N}
i > N && error("cannot insert a sensible left unit onto $P at index $i") # do we want this to error in the diagonal case?
Expand All @@ -91,9 +94,9 @@ function insertleftunit(P::ProductSpace{Vect[IsingBimod],N}, ::Val{i}; # want no
return ProductSpace(TupleTools.insertafter(P.spaces, i - 1, (u,)))
end

# is this even necessary? can let it error at fusiontrees.jl:93 from the one(IsingBimod) call
# is this even necessary? can let it error at fusiontrees.jl:93 from the one(IsingBimodule) call
# but these errors are maybe more informative
function FusionTree(uncoupled::Tuple{IsingBimod,Vararg{IsingBimod}})
function FusionTree(uncoupled::Tuple{IsingBimodule,Vararg{IsingBimodule}})
coupled = collect(⊗(uncoupled...))
if length(coupled) == 0 # illegal fusion somewhere
throw(ArgumentError("Forbidden fusion with uncoupled sectors $uncoupled"))
Expand All @@ -103,6 +106,6 @@ function FusionTree(uncoupled::Tuple{IsingBimod,Vararg{IsingBimod}})
end

# this one might also be overkill, since `FusionTreeIterator`s don't check whether the fusion is allowed
function fusiontrees(uncoupled::Tuple{IsingBimod,Vararg{IsingBimod}})
return throw(ArgumentError("coupled sector must be provided for IsingBimod fusion"))
function fusiontrees(uncoupled::Tuple{IsingBimodule,Vararg{IsingBimodule}})
return throw(ArgumentError("coupled sector must be provided for IsingBimodule fusion"))
end
21 changes: 14 additions & 7 deletions test/multifusion.jl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
I = IsingBimod
I = IsingBimodule
Istr = TK.type_repr(I)

println("------------------------------------")
Expand Down Expand Up @@ -85,9 +85,16 @@ VIBMop2 = (Vect[I](D0 => 1, D1 => 1),
@test @constinferred(rightoneunit(⊕(Wright, WM))) == oneunit(Wright)
@test @constinferred(rightoneunit(⊕(Wleft, WMop))) == oneunit(Wleft)

@test_throws ArgumentError oneunit(I)
@test_throws ArgumentError oneunit(WM)
@test_throws ArgumentError oneunit(WMop)
@test_throws ArgumentError("one of Type IsingBimodule doesn't exist") oneunit(I)
@test_throws ArgumentError("sectors of $WM are non-diagonal") oneunit(WM)
@test_throws ArgumentError("sectors of $WMop are non-diagonal") oneunit(WMop)

# empty space
Wempty = Vect[I]()
@test @constinferred(zero(V)) == Wempty
for f in (oneunit, leftoneunit, rightoneunit)
@test_throws ArgumentError("Cannot determine type of empty space") f(Wempty)
end

@test isa(V, VectorSpace)
@test isa(V, ElementarySpace)
Expand Down Expand Up @@ -671,9 +678,9 @@ for V in (VIBC, VIBD)
@assert V3 * V4 ≾ V1' * V2' * V5' # necessary for rightorth tests -> this condition makes it hard to test non-diagonal sectors
end

@timedtestset "Tensors with symmetry: $Istr" verbose = true for V in
(VIBC, VIBD, VIBM1, VIBM2,
VIBMop1, VIBMop2)
@timedtestset "Tensors with symmetry: $Istr $i" verbose = true for (i, V) in
enumerate((VIBC, VIBD, VIBM1, VIBM2,
VIBMop1, VIBMop2))
V1, V2, V3, V4, V5 = V
@timedtestset "Basic tensor properties" begin
W = V1 ⊗ V2 ⊗ V3 ⊗ V4 ⊗ V5 # fusion matters
Expand Down
4 changes: 1 addition & 3 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ using Random
using TensorKit
using Combinatorics
using TensorKit: ProductSector, fusiontensor
using TensorKitSectors
using TensorKitSectors: leftone, rightone
using TensorOperations
using Base.Iterators: take, product
# using SUNRepresentations: SUNIrrep
Expand All @@ -31,7 +29,7 @@ end
function randsector(::Type{I}) where {I<:Sector}
s = collect(smallset(I))
a = rand(s)
while a == leftone(a) == rightone(a) # don't use trivial label
while isone(a) # don't use trivial label
a = rand(s)
end
return a
Expand Down
2 changes: 2 additions & 0 deletions test/spaces.jl
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,8 @@ println("------------------------------------")
@test @constinferred(oneunit(V)) == W == oneunit(typeof(V))
@test @constinferred(leftoneunit(V)) == oneunit(V) ==
@constinferred(rightoneunit(V))
Vempty = @constinferred zero(V)
@test oneunit(Vempty) == leftoneunit(Vempty) == rightoneunit(Vempty) == W
@test @constinferred(zero(V)) == GradedSpace(one(I) => 0)
# randsector never returns trivial sector, so this cannot error
@test_throws ArgumentError GradedSpace(one(I) => 1, randsector(I) => 0, one(I) => 3)
Expand Down
Loading