diff --git a/src/Grassmann.jl b/src/Grassmann.jl index 5f8271d..d529ac8 100644 --- a/src/Grassmann.jl +++ b/src/Grassmann.jl @@ -601,12 +601,12 @@ function __init__() @require GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" begin GeometryBasics.Point(t::Values) = GeometryBasics.Point(Tuple(t.v)) GeometryBasics.Point(t::Variables) = GeometryBasics.Point(Tuple(t.v)) - Base.convert(::Type{GeometryBasics.Point},t::T) where T<:TensorTerm{V} where V = GeometryBasics.Point(value(Chain{V,valuetype(t)}(vector(t)))) + Base.convert(::Type{GeometryBasics.Point},t::T) where T<:TensorTerm{V} where V = convert(GeometryBasis.Point,Chain(t)) Base.convert(::Type{GeometryBasics.Point},t::T) where T<:TensorTerm{V,0} where V = GeometryBasics.Point(zeros(valuetype(t),mdims(V))...) Base.convert(::Type{GeometryBasics.Point},t::T) where T<:TensorAlgebra = GeometryBasics.Point(value(vector(t))) Base.convert(::Type{GeometryBasics.Point},t::T) where T<:Couple = GeometryBasics.Point(t.v.re,t.v.im) Base.convert(::Type{GeometryBasics.Point},t::T) where T<:Phasor = GeometryBasics.Point(t.v.re,t.v.im) - Base.convert(::Type{GeometryBasics.Point},t::Chain{V,G,T}) where {V,G,T} = G == 1 ? GeometryBasics.Point(value(vector(t))) : GeometryBasics.Point(zeros(T,mdims(V))...) + Base.convert(::Type{GeometryBasics.Point},t::Chain{V,G,T}) where {V,G,T} = GeometryBasics.Point(value(t)) GeometryBasics.Point(t::T) where T<:TensorAlgebra = convert(GeometryBasics.Point,t) pointpair(p,V) = Pair(GeometryBasics.Point.(V.(value(p)))...) @pure ptype(::GeometryBasics.Point{N,T} where N) where T = T diff --git a/src/composite.jl b/src/composite.jl index ca2e56c..c227ceb 100644 --- a/src/composite.jl +++ b/src/composite.jl @@ -909,10 +909,10 @@ function Base.findlast(P,t::ChainBundle) end Base.findall(P,t) = findall(P .∈ getindex.(points(t),value(t))) -edgelength(e) = (v=points(e)[value(e)]; value(abs(v[2]-v[1]))) -volumes(m,dets) = value.(abs.(.⋆(dets))) -volumes(m) = mdims(Manifold(m))≠2 ? volumes(m,detsimplex(m)) : edgelength.(value(m)) -detsimplex(m::Vector{<:Chain{V}}) where V = ∧(m)/factorial(mdims(V)-1) +edgelength(e) = (v=points(e)[value(e)]; Real(abs(v[2]-v[1]))) +volumes(m,dets) = Real.(abs.(dets)) +volumes(m) = mdims(Manifold(m))≠2 ? Real.(abs.(detsimplex(m))) : edgelength.(value(m)) +detsimplex(m::Vector{<:Chain{V}}) where V = det(m)/factorial(mdims(V)-1) detsimplex(m::ChainBundle) = detsimplex(value(m)) mean(m::T) where T<:AbstractVector{<:Chain} = sum(m)/length(m) mean(m::T) where T<:Values = sum(m)/length(m) @@ -923,9 +923,9 @@ barycenter(m::Chain{V,1,<:Chain} where V) = barycenter(value(m)) curl(m::FixedVector{N,<:Chain{V}} where N) where V = curl(Chain{V,1}(m)) curl(m::Values{N,<:Chain{V}} where N) where V = curl(Chain{V,1}(m)) curl(m::T) where T<:TensorAlgebra = Manifold(m)(∇)×m -LinearAlgebra.det(t::Chain{V,1,<:Chain} where V) = ∧(t) -LinearAlgebra.det(m::Vector{<:Chain{V}}) where V = ∧(m) -LinearAlgebra.det(m::ChainBundle) = ∧(m) +LinearAlgebra.det(t::Chain{V,1,<:Chain} where V) = !∧(t) +LinearAlgebra.det(m::Vector{<:Chain{V}}) where V = .!∧(m) +LinearAlgebra.det(m::ChainBundle) = .!∧(m) ∧(m::ChainBundle) = ∧(value(m)) function ∧(m::Vector{<:Chain{V}}) where V p = points(m); pm = p[m] diff --git a/src/forms.jl b/src/forms.jl index e63c748..c0c511c 100644 --- a/src/forms.jl +++ b/src/forms.jl @@ -487,8 +487,10 @@ Base.zero(t::Type{<:DiagonalOperator{V,T}}) where {V,T} = DiagonalOperator(zero( scalar(m::DiagonalOperator) = tr(m)/length(value(m)) LinearAlgebra.tr(m::DiagonalOperator) = sum(value(value(m))) -LinearAlgebra.det(m::DiagonalMorphism{V}) where V = Chain{V,mdims(V)}(prod(value(value(m)))) -LinearAlgebra.det(m::DiagonalOutermorphism{V}) where V = value(m)(Val(mdims(V))) +LinearAlgebra.det(m::DiagonalMorphism) = !∧(m) +LinearAlgebra.det(m::DiagonalOutermorphism) = !∧(m) +∧(m::DiagonalMorphism{V}) where V = Chain{V,mdims(V)}(prod(value(value(m)))) +∧(m::DiagonalOutermorphism{V}) where V = value(m)(Val(mdims(V))) compound(m::DiagonalMorphism{V},::Val{0}) where V = DiagonalOperator(Chain{V,0}(1)) @generated function compound(m::DiagonalMorphism{V},::Val{G}) where {V,G} Expr(:call,:DiagonalOperator,Expr(:call,:(Chain{V,G}),Expr(:call,Values,[Expr(:call,:*,[:(@inbounds m.v[$i]) for i ∈ indices(j)]...) for j ∈ indexbasis(mdims(V),G)]...))) @@ -551,7 +553,8 @@ getindex(t::TensorOperator,i::Int) = value(t.v)[i] Base.transpose(t::TensorOperator) = TensorOperator(transpose(value(t))) scalar(m::Endomorphism) = tr(m)/length(value(m)) LinearAlgebra.tr(m::Endomorphism) = tr(value(m)) -LinearAlgebra.det(t::TensorOperator) = ∧(value(t)) +LinearAlgebra.det(t::TensorOperator) = !∧(value(t)) +∧(t::TensorOperator) = ∧(value(t)) Base.zero(t::TensorOperator) = TensorOperator(zero(value(t))) Base.zero(t::Type{<:TensorOperator{V,W,T}}) where {V,W,T} = TensorOperator(zero(T)) @@ -676,7 +679,8 @@ getindex(t::Outermorphism{V},i::Int) where V = iszero(i) ? Chain{V,0}((Chain(One Base.transpose(m::Outermorphism) = Outermorphism(map(transpose,value(m))) scalar(m::Outermorphism{V}) where V = tr(m)/(1<