Add convenient constructor for GeneriicQEDProcess and improve type stability

This commit is contained in:
2024-06-21 13:55:57 +02:00
parent 2b7c02c223
commit ddd3cc7053
2 changed files with 18 additions and 6 deletions

View File

@@ -65,17 +65,16 @@ struct FeynmanDiagram{N,E,U,T,M,FM} <: AbstractTreeLevelFeynmanDiagram where {N,
@assert T == length(tauon_perm)
N = E + U + T
fm = FlatMatrix(structure)
return new{N,E,U,T,M,typeof(fm)}(fm, NTuple{E,Int}(elec_perm), NTuple{U,Int}(muon_perm), NTuple{T,Int}(tauon_perm))
return new{N,E,U,T,M,FlatMatrix{Int64,2 * N - 2 + M,N}}(FlatMatrix(structure), NTuple{E,Int}(elec_perm), NTuple{U,Int}(muon_perm), NTuple{T,Int}(tauon_perm))
end
end
function virtual_particles(diagram::FeynmanDiagram{N,E,U,T,M,FM})
function virtual_particles(diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM}
return NTuple{N,Tuple{QEDbase.AbstractParticleType,BitArray,BitArray}}()
end
function vertices(::AbstractTreeLevelFeynmanDiagram)
function vertices(diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM}
return NTuple{N,VertexType}()
end
@@ -174,7 +173,8 @@ function Base.length(it::FeynmanDiagramIterator{E,U,T,M}) where {E,U,T,M}
return factorial(M + 3 * N - 3, 2 * N - 1) * factorial(E) * factorial(U) * factorial(T)
end
function Base.iterate(iter::FeynmanDiagramIterator)
function Base.iterate(iter::FeynmanDiagramIterator{E,U,T,M}) where {E,U,T,M}
N = E + U + T
f = FeynmanDiagram(iter.photon_structure, iter.e_perms[iter.e_index], iter.u_perms[iter.u_index], iter.t_perms[iter.t_index], iter.e, iter.u, iter.t, iter.m)
return (
f,
@@ -182,7 +182,7 @@ function Base.iterate(iter::FeynmanDiagramIterator)
)
end
function Base.iterate(iter::FeynmanDiagramIterator, ::Nothing)
function Base.iterate(iter::FeynmanDiagramIterator{E,U,T,M}, ::Nothing) where {E,U,T,M}
iter.t_index += 1
if iter.t_index > length(iter.t_perms)
@@ -204,6 +204,7 @@ function Base.iterate(iter::FeynmanDiagramIterator, ::Nothing)
(iter.photon_structure, _) = photon_iter_result
end
N = E + U + T
f = FeynmanDiagram(iter.photon_structure, iter.e_perms[iter.e_index], iter.u_perms[iter.u_index], iter.t_perms[iter.t_index], iter.e, iter.u, iter.t, iter.m)
return (
f,