From a157eee5bdbf281c1d78dfb6cc4cde6fbcb6abca Mon Sep 17 00:00:00 2001 From: AntonReinhard Date: Fri, 12 Jul 2024 01:08:09 +0200 Subject: [PATCH] Implement convenience functions on the way to full DAG generation, test with new notebook --- Project.toml | 1 + notebooks/diagram_generation.ipynb | 215 +++++++++++++++++++++++++++++ src/FeynmanDiagramGenerator.jl | 6 +- src/diagrams/diagrams.jl | 165 ++++++++++++++++++++-- 4 files changed, 377 insertions(+), 10 deletions(-) create mode 100644 notebooks/diagram_generation.ipynb diff --git a/Project.toml b/Project.toml index f4aee7b..b9a2ed2 100644 --- a/Project.toml +++ b/Project.toml @@ -6,6 +6,7 @@ version = "0.1.0" [deps] Combinatorics = "861a8166-3701-5b0c-9a16-15d98fcdc6aa" DataStructures = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +MetagraphOptimization = "3e869610-d48d-4942-ba70-c1b702a33ca4" QEDbase = "10e22c08-3ccb-4172-bfcf-7d7aa3d04d93" QEDcore = "35dc0263-cb5f-4c33-a114-1d7f54ab753e" QEDprocesses = "46de9c38-1bb3-4547-a1ec-da24d767fdad" diff --git a/notebooks/diagram_generation.ipynb b/notebooks/diagram_generation.ipynb new file mode 100644 index 0000000..2bc5095 --- /dev/null +++ b/notebooks/diagram_generation.ipynb @@ -0,0 +1,215 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: Method definition number_particles(QEDbase.AbstractProcessDefinition, DIR, PT) where {DIR<:QEDbase.ParticleDirection, PT<:QEDbase.AbstractParticleType} in module QEDbase at /home/antonr/.julia/packages/QEDbase/gWHxL/src/interfaces/process.jl:208 overwritten in module FeynmanDiagramGenerator at /home/antonr/repos/FeynmanDiagramGenerator/src/QEDprocesses_patch.jl:23.\n", + "ERROR: Method overwriting is not permitted during Module precompilation. Use `__precompile__(false)` to opt-out of precompilation.\n" + ] + } + ], + "source": [ + "using FeynmanDiagramGenerator" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "712-element Vector{VirtualParticle{GenericQEDProcess{Tuple{Photon, Electron, Electron, Positron, Positron}, Tuple{Photon, Photon, Electron, Electron, Positron, Positron}}, PT, 5, 6} where PT<:AbstractParticleType}:\n", + " photon: \t00000 | 000101\n", + " photon: \t00000 | 000110\n", + " photon: \t00000 | 001001\n", + " photon: \t00000 | 001010\n", + " electron: \t00000 | 010001\n", + " electron: \t00000 | 010010\n", + " positron: \t00000 | 010100\n", + " positron: \t00000 | 011000\n", + " electron: \t00000 | 100001\n", + " electron: \t00000 | 100010\n", + " ⋮\n", + " photon: \t11101 | 000100\n", + " photon: \t11101 | 001000\n", + " electron: \t11101 | 010000\n", + " electron: \t11101 | 100000\n", + " photon: \t11110 | 000100\n", + " photon: \t11110 | 001000\n", + " electron: \t11110 | 010000\n", + " electron: \t11110 | 100000\n", + " photon: \t11111 | 000000" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "proc = GenericQEDProcess(1, 2, 2, 2, 2, 2)\n", + "all_particles = Set()\n", + "for fd in feynman_diagrams(proc) \n", + " push!(all_particles, virtual_particles(proc, fd)...)\n", + "end\n", + "all_particles = sort([all_particles...])\n", + "display(all_particles)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "pseudo_particles = FeynmanDiagramGenerator._pseudo_virtual_particles(proc, first(feynman_diagrams(proc)))\n", + "\n", + "pairs = Dict{VirtualParticle, Vector{Tuple{VirtualParticle, VirtualParticle}}}()\n", + "for p in all_particles\n", + " pairs[p] = particle_pairs(p, [all_particles..., pseudo_particles...])\n", + " #println(\"$p has $(length(pairs[p])) children: $(pairs[p])\")\n", + "end\n", + "\n", + "#pairs" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "photons: VirtualParticle{GenericQEDProcess{Tuple{Photon, Electron, Electron, Positron, Positron}, Tuple{Photon, Photon, Electron, Electron, Positron, Positron}}, PT, 5, 6} where PT<:AbstractParticleType[photon: \t00000 | 000101, photon: \t00000 | 000110, photon: \t00000 | 001001, photon: \t00000 | 001010, photon: \t00001 | 000001, photon: \t00001 | 000010, photon: \t00010 | 000001, photon: \t00010 | 000010, photon: \t00100 | 000100, photon: \t00100 | 001000, photon: \t00101 | 000000, photon: \t00110 | 000000, photon: \t01000 | 000100, photon: \t01000 | 001000, photon: \t01001 | 000000, photon: \t01010 | 000000, photon: \t00000 | 010101, photon: \t00000 | 010110, photon: \t00000 | 011001, photon: \t00000 | 011010, photon: \t00000 | 100101, photon: \t00000 | 100110, photon: \t00000 | 101001, photon: \t00000 | 101010, photon: \t00001 | 010001, photon: \t00001 | 010010, photon: \t00001 | 100001, photon: \t00001 | 100010, photon: \t00010 | 010001, photon: \t00010 | 010010, photon: \t00010 | 100001, photon: \t00010 | 100010, photon: \t00100 | 010100, photon: \t00100 | 011000, photon: \t00100 | 100100, photon: \t00100 | 101000, photon: \t00101 | 010000, photon: \t00101 | 100000, photon: \t00110 | 010000, photon: \t00110 | 100000, photon: \t01000 | 010100, photon: \t01000 | 011000, photon: \t01000 | 100100, photon: \t01000 | 101000, photon: \t01001 | 010000, photon: \t01001 | 100000, photon: \t01010 | 010000, photon: \t01010 | 100000, photon: \t10000 | 000101, photon: \t10000 | 000110, photon: \t10000 | 001001, photon: \t10000 | 001010, photon: \t10001 | 000001, photon: \t10001 | 000010, photon: \t10010 | 000001, photon: \t10010 | 000010, photon: \t10100 | 000100, photon: \t10100 | 001000, photon: \t10101 | 000000, photon: \t10110 | 000000, photon: \t11000 | 000100, photon: \t11000 | 001000, photon: \t11001 | 000000, photon: \t11010 | 000000, photon: \t00000 | 001111, photon: \t00000 | 110101, photon: \t00000 | 110110, photon: \t00000 | 111001, photon: \t00000 | 111010, photon: \t00001 | 000111, photon: \t00001 | 001011, photon: \t00001 | 110001, photon: \t00001 | 110010, photon: \t00010 | 000111, photon: \t00010 | 001011, photon: \t00010 | 110001, photon: \t00010 | 110010, photon: \t00011 | 000011, photon: \t00100 | 001101, photon: \t00100 | 001110, photon: \t00100 | 110100, photon: \t00100 | 111000, photon: \t00101 | 000101, photon: \t00101 | 000110, photon: \t00101 | 001001, photon: \t00101 | 001010, photon: \t00101 | 110000, photon: \t00110 | 000101, photon: \t00110 | 000110, photon: \t00110 | 001001, photon: \t00110 | 001010, photon: \t00110 | 110000, photon: \t00111 | 000001, photon: \t00111 | 000010, photon: \t01000 | 001101, photon: \t01000 | 001110, photon: \t01000 | 110100, photon: \t01000 | 111000, photon: \t01001 | 000101, photon: \t01001 | 000110, photon: \t01001 | 001001, photon: \t01001 | 001010, photon: \t01001 | 110000, photon: \t01010 | 000101, photon: \t01010 | 000110, photon: \t01010 | 001001, photon: \t01010 | 001010, photon: \t01010 | 110000, photon: \t01011 | 000001, photon: \t01011 | 000010, photon: \t01100 | 001100, photon: \t01101 | 000100, photon: \t01101 | 001000, photon: \t01110 | 000100, photon: \t01110 | 001000, photon: \t01111 | 000000, photon: \t10000 | 010101, photon: \t10000 | 010110, photon: \t10000 | 011001, photon: \t10000 | 011010, photon: \t10000 | 100101, photon: \t10000 | 100110, photon: \t10000 | 101001, photon: \t10000 | 101010, photon: \t10001 | 010001, photon: \t10001 | 010010, photon: \t10001 | 100001, photon: \t10001 | 100010, photon: \t10010 | 010001, photon: \t10010 | 010010, photon: \t10010 | 100001, photon: \t10010 | 100010, photon: \t10100 | 010100, photon: \t10100 | 011000, photon: \t10100 | 100100, photon: \t10100 | 101000, photon: \t10101 | 010000, photon: \t10101 | 100000, photon: \t10110 | 010000, photon: \t10110 | 100000, photon: \t11000 | 010100, photon: \t11000 | 011000, photon: \t11000 | 100100, photon: \t11000 | 101000, photon: \t11001 | 010000, photon: \t11001 | 100000, photon: \t11010 | 010000, photon: \t11010 | 100000, photon: \t00000 | 011111, photon: \t00000 | 101111, photon: \t00001 | 010111, photon: \t00001 | 011011, photon: \t00001 | 100111, photon: \t00001 | 101011, photon: \t00010 | 010111, photon: \t00010 | 011011, photon: \t00010 | 100111, photon: \t00010 | 101011, photon: \t00011 | 010011, photon: \t00011 | 100011, photon: \t00100 | 011101, photon: \t00100 | 011110, photon: \t00100 | 101101, photon: \t00100 | 101110, photon: \t00101 | 010101, photon: \t00101 | 010110, photon: \t00101 | 011001, photon: \t00101 | 011010, photon: \t00101 | 100101, photon: \t00101 | 100110, photon: \t00101 | 101001, photon: \t00101 | 101010, photon: \t00110 | 010101, photon: \t00110 | 010110, photon: \t00110 | 011001, photon: \t00110 | 011010, photon: \t00110 | 100101, photon: \t00110 | 100110, photon: \t00110 | 101001, photon: \t00110 | 101010, photon: \t00111 | 010001, photon: \t00111 | 010010, photon: \t00111 | 100001, photon: \t00111 | 100010, photon: \t01000 | 011101, photon: \t01000 | 011110, photon: \t01000 | 101101, photon: \t01000 | 101110, photon: \t01001 | 010101, photon: \t01001 | 010110, photon: \t01001 | 011001, photon: \t01001 | 011010, photon: \t01001 | 100101, photon: \t01001 | 100110, photon: \t01001 | 101001, photon: \t01001 | 101010, photon: \t01010 | 010101, photon: \t01010 | 010110, photon: \t01010 | 011001, photon: \t01010 | 011010, photon: \t01010 | 100101, photon: \t01010 | 100110, photon: \t01010 | 101001, photon: \t01010 | 101010, photon: \t01011 | 010001, photon: \t01011 | 010010, photon: \t01011 | 100001, photon: \t01011 | 100010, photon: \t01100 | 011100, photon: \t01100 | 101100, photon: \t01101 | 010100, photon: \t01101 | 011000, photon: \t01101 | 100100, photon: \t01101 | 101000, photon: \t01110 | 010100, photon: \t01110 | 011000, photon: \t01110 | 100100, photon: \t01110 | 101000, photon: \t01111 | 010000, photon: \t01111 | 100000, photon: \t10000 | 001111, photon: \t10000 | 110101, photon: \t10000 | 110110, photon: \t10000 | 111001, photon: \t10000 | 111010, photon: \t10001 | 000111, photon: \t10001 | 001011, photon: \t10001 | 110001, photon: \t10001 | 110010, photon: \t10010 | 000111, photon: \t10010 | 001011, photon: \t10010 | 110001, photon: \t10010 | 110010, photon: \t10011 | 000011, photon: \t10100 | 001101, photon: \t10100 | 001110, photon: \t10100 | 110100, photon: \t10100 | 111000, photon: \t10101 | 000101, photon: \t10101 | 000110, photon: \t10101 | 001001, photon: \t10101 | 001010, photon: \t10101 | 110000, photon: \t10110 | 000101, photon: \t10110 | 000110, photon: \t10110 | 001001, photon: \t10110 | 001010, photon: \t10110 | 110000, photon: \t10111 | 000001, photon: \t10111 | 000010, photon: \t11000 | 001101, photon: \t11000 | 001110, photon: \t11000 | 110100, photon: \t11000 | 111000, photon: \t11001 | 000101, photon: \t11001 | 000110, photon: \t11001 | 001001, photon: \t11001 | 001010, photon: \t11001 | 110000, photon: \t11010 | 000101, photon: \t11010 | 000110, photon: \t11010 | 001001, photon: \t11010 | 001010, photon: \t11010 | 110000, photon: \t11011 | 000001, photon: \t11011 | 000010, photon: \t11100 | 001100, photon: \t11101 | 000100, photon: \t11101 | 001000, photon: \t11110 | 000100, photon: \t11110 | 001000, photon: \t11111 | 000000, photon: \t00000 | 010000, photon: \t00000 | 100000, photon: \t10000 | 000000]\n", + "electrons: VirtualParticle{GenericQEDProcess{Tuple{Photon, Electron, Electron, Positron, Positron}, Tuple{Photon, Photon, Electron, Electron, Positron, Positron}}, PT, 5, 6} where PT<:AbstractParticleType[electron: \t00000 | 010001, electron: \t00000 | 010010, electron: \t00000 | 100001, electron: \t00000 | 100010, electron: \t00100 | 010000, electron: \t00100 | 100000, electron: \t01000 | 010000, electron: \t01000 | 100000, electron: \t10000 | 000001, electron: \t10000 | 000010, electron: \t10100 | 000000, electron: \t11000 | 000000, electron: \t00000 | 000111, electron: \t00000 | 001011, electron: \t00000 | 110001, electron: \t00000 | 110010, electron: \t00001 | 000011, electron: \t00010 | 000011, electron: \t00100 | 000101, electron: \t00100 | 000110, electron: \t00100 | 001001, electron: \t00100 | 001010, electron: \t00100 | 110000, electron: \t00101 | 000001, electron: \t00101 | 000010, electron: \t00110 | 000001, electron: \t00110 | 000010, electron: \t01000 | 000101, electron: \t01000 | 000110, electron: \t01000 | 001001, electron: \t01000 | 001010, electron: \t01000 | 110000, electron: \t01001 | 000001, electron: \t01001 | 000010, electron: \t01010 | 000001, electron: \t01010 | 000010, electron: \t01100 | 000100, electron: \t01100 | 001000, electron: \t01101 | 000000, electron: \t01110 | 000000, electron: \t10000 | 010001, electron: \t10000 | 010010, electron: \t10000 | 100001, electron: \t10000 | 100010, electron: \t10100 | 010000, electron: \t10100 | 100000, electron: \t11000 | 010000, electron: \t11000 | 100000, electron: \t00000 | 010111, electron: \t00000 | 011011, electron: \t00000 | 100111, electron: \t00000 | 101011, electron: \t00001 | 010011, electron: \t00001 | 100011, electron: \t00010 | 010011, electron: \t00010 | 100011, electron: \t00100 | 010101, electron: \t00100 | 010110, electron: \t00100 | 011001, electron: \t00100 | 011010, electron: \t00100 | 100101, electron: \t00100 | 100110, electron: \t00100 | 101001, electron: \t00100 | 101010, electron: \t00101 | 010001, electron: \t00101 | 010010, electron: \t00101 | 100001, electron: \t00101 | 100010, electron: \t00110 | 010001, electron: \t00110 | 010010, electron: \t00110 | 100001, electron: \t00110 | 100010, electron: \t01000 | 010101, electron: \t01000 | 010110, electron: \t01000 | 011001, electron: \t01000 | 011010, electron: \t01000 | 100101, electron: \t01000 | 100110, electron: \t01000 | 101001, electron: \t01000 | 101010, electron: \t01001 | 010001, electron: \t01001 | 010010, electron: \t01001 | 100001, electron: \t01001 | 100010, electron: \t01010 | 010001, electron: \t01010 | 010010, electron: \t01010 | 100001, electron: \t01010 | 100010, electron: \t01100 | 010100, electron: \t01100 | 011000, electron: \t01100 | 100100, electron: \t01100 | 101000, electron: \t01101 | 010000, electron: \t01101 | 100000, electron: \t01110 | 010000, electron: \t01110 | 100000, electron: \t10000 | 000111, electron: \t10000 | 001011, electron: \t10000 | 110001, electron: \t10000 | 110010, electron: \t10001 | 000011, electron: \t10010 | 000011, electron: \t10100 | 000101, electron: \t10100 | 000110, electron: \t10100 | 001001, electron: \t10100 | 001010, electron: \t10100 | 110000, electron: \t10101 | 000001, electron: \t10101 | 000010, electron: \t10110 | 000001, electron: \t10110 | 000010, electron: \t11000 | 000101, electron: \t11000 | 000110, electron: \t11000 | 001001, electron: \t11000 | 001010, electron: \t11000 | 110000, electron: \t11001 | 000001, electron: \t11001 | 000010, electron: \t11010 | 000001, electron: \t11010 | 000010, electron: \t11100 | 000100, electron: \t11100 | 001000, electron: \t11101 | 000000, electron: \t11110 | 000000, electron: \t00000 | 110111, electron: \t00000 | 111011, electron: \t00001 | 110011, electron: \t00010 | 110011, electron: \t00100 | 001111, electron: \t00100 | 110101, electron: \t00100 | 110110, electron: \t00100 | 111001, electron: \t00100 | 111010, electron: \t00101 | 000111, electron: \t00101 | 001011, electron: \t00101 | 110001, electron: \t00101 | 110010, electron: \t00110 | 000111, electron: \t00110 | 001011, electron: \t00110 | 110001, electron: \t00110 | 110010, electron: \t00111 | 000011, electron: \t01000 | 001111, electron: \t01000 | 110101, electron: \t01000 | 110110, electron: \t01000 | 111001, electron: \t01000 | 111010, electron: \t01001 | 000111, electron: \t01001 | 001011, electron: \t01001 | 110001, electron: \t01001 | 110010, electron: \t01010 | 000111, electron: \t01010 | 001011, electron: \t01010 | 110001, electron: \t01010 | 110010, electron: \t01011 | 000011, electron: \t01100 | 001101, electron: \t01100 | 001110, electron: \t01100 | 110100, electron: \t01100 | 111000, electron: \t01101 | 000101, electron: \t01101 | 000110, electron: \t01101 | 001001, electron: \t01101 | 001010, electron: \t01101 | 110000, electron: \t01110 | 000101, electron: \t01110 | 000110, electron: \t01110 | 001001, electron: \t01110 | 001010, electron: \t01110 | 110000, electron: \t01111 | 000001, electron: \t01111 | 000010, electron: \t10000 | 010111, electron: \t10000 | 011011, electron: \t10000 | 100111, electron: \t10000 | 101011, electron: \t10001 | 010011, electron: \t10001 | 100011, electron: \t10010 | 010011, electron: \t10010 | 100011, electron: \t10100 | 010101, electron: \t10100 | 010110, electron: \t10100 | 011001, electron: \t10100 | 011010, electron: \t10100 | 100101, electron: \t10100 | 100110, electron: \t10100 | 101001, electron: \t10100 | 101010, electron: \t10101 | 010001, electron: \t10101 | 010010, electron: \t10101 | 100001, electron: \t10101 | 100010, electron: \t10110 | 010001, electron: \t10110 | 010010, electron: \t10110 | 100001, electron: \t10110 | 100010, electron: \t11000 | 010101, electron: \t11000 | 010110, electron: \t11000 | 011001, electron: \t11000 | 011010, electron: \t11000 | 100101, electron: \t11000 | 100110, electron: \t11000 | 101001, electron: \t11000 | 101010, electron: \t11001 | 010001, electron: \t11001 | 010010, electron: \t11001 | 100001, electron: \t11001 | 100010, electron: \t11010 | 010001, electron: \t11010 | 010010, electron: \t11010 | 100001, electron: \t11010 | 100010, electron: \t11100 | 010100, electron: \t11100 | 011000, electron: \t11100 | 100100, electron: \t11100 | 101000, electron: \t11101 | 010000, electron: \t11101 | 100000, electron: \t11110 | 010000, electron: \t11110 | 100000, electron: \t00000 | 000001, electron: \t00000 | 000010, electron: \t00100 | 000000, electron: \t01000 | 000000]\n", + "positron: VirtualParticle{GenericQEDProcess{Tuple{Photon, Electron, Electron, Positron, Positron}, Tuple{Photon, Photon, Electron, Electron, Positron, Positron}}, PT, 5, 6} where PT<:AbstractParticleType[positron: \t00000 | 010100, positron: \t00000 | 011000, positron: \t00000 | 100100, positron: \t00000 | 101000, positron: \t00001 | 010000, positron: \t00001 | 100000, positron: \t00010 | 010000, positron: \t00010 | 100000, positron: \t10000 | 000100, positron: \t10000 | 001000, positron: \t10001 | 000000, positron: \t10010 | 000000, positron: \t00000 | 001101, positron: \t00000 | 001110, positron: \t00000 | 110100, positron: \t00000 | 111000, positron: \t00001 | 000101, positron: \t00001 | 000110, positron: \t00001 | 001001, positron: \t00001 | 001010, positron: \t00001 | 110000, positron: \t00010 | 000101, positron: \t00010 | 000110, positron: \t00010 | 001001, positron: \t00010 | 001010, positron: \t00010 | 110000, positron: \t00011 | 000001, positron: \t00011 | 000010, positron: \t00100 | 001100, positron: \t00101 | 000100, positron: \t00101 | 001000, positron: \t00110 | 000100, positron: \t00110 | 001000, positron: \t00111 | 000000, positron: \t01000 | 001100, positron: \t01001 | 000100, positron: \t01001 | 001000, positron: \t01010 | 000100, positron: \t01010 | 001000, positron: \t01011 | 000000, positron: \t10000 | 010100, positron: \t10000 | 011000, positron: \t10000 | 100100, positron: \t10000 | 101000, positron: \t10001 | 010000, positron: \t10001 | 100000, positron: \t10010 | 010000, positron: \t10010 | 100000, positron: \t00000 | 011101, positron: \t00000 | 011110, positron: \t00000 | 101101, positron: \t00000 | 101110, positron: \t00001 | 010101, positron: \t00001 | 010110, positron: \t00001 | 011001, positron: \t00001 | 011010, positron: \t00001 | 100101, positron: \t00001 | 100110, positron: \t00001 | 101001, positron: \t00001 | 101010, positron: \t00010 | 010101, positron: \t00010 | 010110, positron: \t00010 | 011001, positron: \t00010 | 011010, positron: \t00010 | 100101, positron: \t00010 | 100110, positron: \t00010 | 101001, positron: \t00010 | 101010, positron: \t00011 | 010001, positron: \t00011 | 010010, positron: \t00011 | 100001, positron: \t00011 | 100010, positron: \t00100 | 011100, positron: \t00100 | 101100, positron: \t00101 | 010100, positron: \t00101 | 011000, positron: \t00101 | 100100, positron: \t00101 | 101000, positron: \t00110 | 010100, positron: \t00110 | 011000, positron: \t00110 | 100100, positron: \t00110 | 101000, positron: \t00111 | 010000, positron: \t00111 | 100000, positron: \t01000 | 011100, positron: \t01000 | 101100, positron: \t01001 | 010100, positron: \t01001 | 011000, positron: \t01001 | 100100, positron: \t01001 | 101000, positron: \t01010 | 010100, positron: \t01010 | 011000, positron: \t01010 | 100100, positron: \t01010 | 101000, positron: \t01011 | 010000, positron: \t01011 | 100000, positron: \t10000 | 001101, positron: \t10000 | 001110, positron: \t10000 | 110100, positron: \t10000 | 111000, positron: \t10001 | 000101, positron: \t10001 | 000110, positron: \t10001 | 001001, positron: \t10001 | 001010, positron: \t10001 | 110000, positron: \t10010 | 000101, positron: \t10010 | 000110, positron: \t10010 | 001001, positron: \t10010 | 001010, positron: \t10010 | 110000, positron: \t10011 | 000001, positron: \t10011 | 000010, positron: \t10100 | 001100, positron: \t10101 | 000100, positron: \t10101 | 001000, positron: \t10110 | 000100, positron: \t10110 | 001000, positron: \t10111 | 000000, positron: \t11000 | 001100, positron: \t11001 | 000100, positron: \t11001 | 001000, positron: \t11010 | 000100, positron: \t11010 | 001000, positron: \t11011 | 000000, positron: \t00000 | 111101, positron: \t00000 | 111110, positron: \t00001 | 001111, positron: \t00001 | 110101, positron: \t00001 | 110110, positron: \t00001 | 111001, positron: \t00001 | 111010, positron: \t00010 | 001111, positron: \t00010 | 110101, positron: \t00010 | 110110, positron: \t00010 | 111001, positron: \t00010 | 111010, positron: \t00011 | 000111, positron: \t00011 | 001011, positron: \t00011 | 110001, positron: \t00011 | 110010, positron: \t00100 | 111100, positron: \t00101 | 001101, positron: \t00101 | 001110, positron: \t00101 | 110100, positron: \t00101 | 111000, positron: \t00110 | 001101, positron: \t00110 | 001110, positron: \t00110 | 110100, positron: \t00110 | 111000, positron: \t00111 | 000101, positron: \t00111 | 000110, positron: \t00111 | 001001, positron: \t00111 | 001010, positron: \t00111 | 110000, positron: \t01000 | 111100, positron: \t01001 | 001101, positron: \t01001 | 001110, positron: \t01001 | 110100, positron: \t01001 | 111000, positron: \t01010 | 001101, positron: \t01010 | 001110, positron: \t01010 | 110100, positron: \t01010 | 111000, positron: \t01011 | 000101, positron: \t01011 | 000110, positron: \t01011 | 001001, positron: \t01011 | 001010, positron: \t01011 | 110000, positron: \t01101 | 001100, positron: \t01110 | 001100, positron: \t01111 | 000100, positron: \t01111 | 001000, positron: \t10000 | 011101, positron: \t10000 | 011110, positron: \t10000 | 101101, positron: \t10000 | 101110, positron: \t10001 | 010101, positron: \t10001 | 010110, positron: \t10001 | 011001, positron: \t10001 | 011010, positron: \t10001 | 100101, positron: \t10001 | 100110, positron: \t10001 | 101001, positron: \t10001 | 101010, positron: \t10010 | 010101, positron: \t10010 | 010110, positron: \t10010 | 011001, positron: \t10010 | 011010, positron: \t10010 | 100101, positron: \t10010 | 100110, positron: \t10010 | 101001, positron: \t10010 | 101010, positron: \t10011 | 010001, positron: \t10011 | 010010, positron: \t10011 | 100001, positron: \t10011 | 100010, positron: \t10100 | 011100, positron: \t10100 | 101100, positron: \t10101 | 010100, positron: \t10101 | 011000, positron: \t10101 | 100100, positron: \t10101 | 101000, positron: \t10110 | 010100, positron: \t10110 | 011000, positron: \t10110 | 100100, positron: \t10110 | 101000, positron: \t10111 | 010000, positron: \t10111 | 100000, positron: \t11000 | 011100, positron: \t11000 | 101100, positron: \t11001 | 010100, positron: \t11001 | 011000, positron: \t11001 | 100100, positron: \t11001 | 101000, positron: \t11010 | 010100, positron: \t11010 | 011000, positron: \t11010 | 100100, positron: \t11010 | 101000, positron: \t11011 | 010000, positron: \t11011 | 100000, positron: \t00000 | 000100, positron: \t00000 | 001000, positron: \t00001 | 000000, positron: \t00010 | 000000]\n", + "i photons: VirtualParticle{GenericQEDProcess{Tuple{Photon, Electron, Electron, Positron, Positron}, Tuple{Photon, Photon, Electron, Electron, Positron, Positron}}, Photon, 5, 6}[photon: \t11111 | 111010, photon: \t11111 | 111001, photon: \t11111 | 110110, photon: \t11111 | 110101, photon: \t11110 | 111110, photon: \t11110 | 111101, photon: \t11101 | 111110, photon: \t11101 | 111101, photon: \t11011 | 111011, photon: \t11011 | 110111, photon: \t11010 | 111111, photon: \t11001 | 111111, photon: \t10111 | 111011, photon: \t10111 | 110111, photon: \t10110 | 111111, photon: \t10101 | 111111, photon: \t11111 | 101010, photon: \t11111 | 101001, photon: \t11111 | 100110, photon: \t11111 | 100101, photon: \t11111 | 011010, photon: \t11111 | 011001, photon: \t11111 | 010110, photon: \t11111 | 010101, photon: \t11110 | 101110, photon: \t11110 | 101101, photon: \t11110 | 011110, photon: \t11110 | 011101, photon: \t11101 | 101110, photon: \t11101 | 101101, photon: \t11101 | 011110, photon: \t11101 | 011101, photon: \t11011 | 101011, photon: \t11011 | 100111, photon: \t11011 | 011011, photon: \t11011 | 010111, photon: \t11010 | 101111, photon: \t11010 | 011111, photon: \t11001 | 101111, photon: \t11001 | 011111, photon: \t10111 | 101011, photon: \t10111 | 100111, photon: \t10111 | 011011, photon: \t10111 | 010111, photon: \t10110 | 101111, photon: \t10110 | 011111, photon: \t10101 | 101111, photon: \t10101 | 011111, photon: \t01111 | 111010, photon: \t01111 | 111001, photon: \t01111 | 110110, photon: \t01111 | 110101, photon: \t01110 | 111110, photon: \t01110 | 111101, photon: \t01101 | 111110, photon: \t01101 | 111101, photon: \t01011 | 111011, photon: \t01011 | 110111, photon: \t01010 | 111111, photon: \t01001 | 111111, photon: \t00111 | 111011, photon: \t00111 | 110111, photon: \t00110 | 111111, photon: \t00101 | 111111, photon: \t11111 | 110000, photon: \t11111 | 001010, photon: \t11111 | 001001, photon: \t11111 | 000110, photon: \t11111 | 000101, photon: \t11110 | 111000, photon: \t11110 | 110100, photon: \t11110 | 001110, photon: \t11110 | 001101, photon: \t11101 | 111000, photon: \t11101 | 110100, photon: \t11101 | 001110, photon: \t11101 | 001101, photon: \t11100 | 111100, photon: \t11011 | 110010, photon: \t11011 | 110001, photon: \t11011 | 001011, photon: \t11011 | 000111, photon: \t11010 | 111010, photon: \t11010 | 111001, photon: \t11010 | 110110, photon: \t11010 | 110101, photon: \t11010 | 001111, photon: \t11001 | 111010, photon: \t11001 | 111001, photon: \t11001 | 110110, photon: \t11001 | 110101, photon: \t11001 | 001111, photon: \t11000 | 111110, photon: \t11000 | 111101, photon: \t10111 | 110010, photon: \t10111 | 110001, photon: \t10111 | 001011, photon: \t10111 | 000111, photon: \t10110 | 111010, photon: \t10110 | 111001, photon: \t10110 | 110110, photon: \t10110 | 110101, photon: \t10110 | 001111, photon: \t10101 | 111010, photon: \t10101 | 111001, photon: \t10101 | 110110, photon: \t10101 | 110101, photon: \t10101 | 001111, photon: \t10100 | 111110, photon: \t10100 | 111101, photon: \t10011 | 110011, photon: \t10010 | 111011, photon: \t10010 | 110111, photon: \t10001 | 111011, photon: \t10001 | 110111, photon: \t10000 | 111111, photon: \t01111 | 101010, photon: \t01111 | 101001, photon: \t01111 | 100110, photon: \t01111 | 100101, photon: \t01111 | 011010, photon: \t01111 | 011001, photon: \t01111 | 010110, photon: \t01111 | 010101, photon: \t01110 | 101110, photon: \t01110 | 101101, photon: \t01110 | 011110, photon: \t01110 | 011101, photon: \t01101 | 101110, photon: \t01101 | 101101, photon: \t01101 | 011110, photon: \t01101 | 011101, photon: \t01011 | 101011, photon: \t01011 | 100111, photon: \t01011 | 011011, photon: \t01011 | 010111, photon: \t01010 | 101111, photon: \t01010 | 011111, photon: \t01001 | 101111, photon: \t01001 | 011111, photon: \t00111 | 101011, photon: \t00111 | 100111, photon: \t00111 | 011011, photon: \t00111 | 010111, photon: \t00110 | 101111, photon: \t00110 | 011111, photon: \t00101 | 101111, photon: \t00101 | 011111, photon: \t11111 | 100000, photon: \t11111 | 010000, photon: \t11110 | 101000, photon: \t11110 | 100100, photon: \t11110 | 011000, photon: \t11110 | 010100, photon: \t11101 | 101000, photon: \t11101 | 100100, photon: \t11101 | 011000, photon: \t11101 | 010100, photon: \t11100 | 101100, photon: \t11100 | 011100, photon: \t11011 | 100010, photon: \t11011 | 100001, photon: \t11011 | 010010, photon: \t11011 | 010001, photon: \t11010 | 101010, photon: \t11010 | 101001, photon: \t11010 | 100110, photon: \t11010 | 100101, photon: \t11010 | 011010, photon: \t11010 | 011001, photon: \t11010 | 010110, photon: \t11010 | 010101, photon: \t11001 | 101010, photon: \t11001 | 101001, photon: \t11001 | 100110, photon: \t11001 | 100101, photon: \t11001 | 011010, photon: \t11001 | 011001, photon: \t11001 | 010110, photon: \t11001 | 010101, photon: \t11000 | 101110, photon: \t11000 | 101101, photon: \t11000 | 011110, photon: \t11000 | 011101, photon: \t10111 | 100010, photon: \t10111 | 100001, photon: \t10111 | 010010, photon: \t10111 | 010001, photon: \t10110 | 101010, photon: \t10110 | 101001, photon: \t10110 | 100110, photon: \t10110 | 100101, photon: \t10110 | 011010, photon: \t10110 | 011001, photon: \t10110 | 010110, photon: \t10110 | 010101, photon: \t10101 | 101010, photon: \t10101 | 101001, photon: \t10101 | 100110, photon: \t10101 | 100101, photon: \t10101 | 011010, photon: \t10101 | 011001, photon: \t10101 | 010110, photon: \t10101 | 010101, photon: \t10100 | 101110, photon: \t10100 | 101101, photon: \t10100 | 011110, photon: \t10100 | 011101, photon: \t10011 | 100011, photon: \t10011 | 010011, photon: \t10010 | 101011, photon: \t10010 | 100111, photon: \t10010 | 011011, photon: \t10010 | 010111, photon: \t10001 | 101011, photon: \t10001 | 100111, photon: \t10001 | 011011, photon: \t10001 | 010111, photon: \t10000 | 101111, photon: \t10000 | 011111, photon: \t01111 | 110000, photon: \t01111 | 001010, photon: \t01111 | 001001, photon: \t01111 | 000110, photon: \t01111 | 000101, photon: \t01110 | 111000, photon: \t01110 | 110100, photon: \t01110 | 001110, photon: \t01110 | 001101, photon: \t01101 | 111000, photon: \t01101 | 110100, photon: \t01101 | 001110, photon: \t01101 | 001101, photon: \t01100 | 111100, photon: \t01011 | 110010, photon: \t01011 | 110001, photon: \t01011 | 001011, photon: \t01011 | 000111, photon: \t01010 | 111010, photon: \t01010 | 111001, photon: \t01010 | 110110, photon: \t01010 | 110101, photon: \t01010 | 001111, photon: \t01001 | 111010, photon: \t01001 | 111001, photon: \t01001 | 110110, photon: \t01001 | 110101, photon: \t01001 | 001111, photon: \t01000 | 111110, photon: \t01000 | 111101, photon: \t00111 | 110010, photon: \t00111 | 110001, photon: \t00111 | 001011, photon: \t00111 | 000111, photon: \t00110 | 111010, photon: \t00110 | 111001, photon: \t00110 | 110110, photon: \t00110 | 110101, photon: \t00110 | 001111, photon: \t00101 | 111010, photon: \t00101 | 111001, photon: \t00101 | 110110, photon: \t00101 | 110101, photon: \t00101 | 001111, photon: \t00100 | 111110, photon: \t00100 | 111101, photon: \t00011 | 110011, photon: \t00010 | 111011, photon: \t00010 | 110111, photon: \t00001 | 111011, photon: \t00001 | 110111, photon: \t00000 | 111111, photon: \t11111 | 101111, photon: \t11111 | 011111, photon: \t01111 | 111111]\n" + ] + }, + { + "data": { + "text/plain": [ + "7248-element Vector{Tuple{VirtualParticle, VirtualParticle, VirtualParticle}}:\n", + " (photon: \t11111 | 000000, electron: \t00000 | 101011, positron: \t00000 | 010100)\n", + " (photon: \t11110 | 001000, electron: \t00001 | 100011, positron: \t00000 | 010100)\n", + " (photon: \t11101 | 001000, electron: \t00010 | 100011, positron: \t00000 | 010100)\n", + " (photon: \t11011 | 000010, electron: \t00100 | 101001, positron: \t00000 | 010100)\n", + " (photon: \t11011 | 000001, electron: \t00100 | 101010, positron: \t00000 | 010100)\n", + " (photon: \t11010 | 001010, electron: \t00101 | 100001, positron: \t00000 | 010100)\n", + " (photon: \t11010 | 001001, electron: \t00101 | 100010, positron: \t00000 | 010100)\n", + " (photon: \t11001 | 001010, electron: \t00110 | 100001, positron: \t00000 | 010100)\n", + " (photon: \t11001 | 001001, electron: \t00110 | 100010, positron: \t00000 | 010100)\n", + " (photon: \t10111 | 000010, electron: \t01000 | 101001, positron: \t00000 | 010100)\n", + " ⋮\n", + " (photon: \t00100 | 101101, electron: \t11001 | 010010, positron: \t00010 | 000000)\n", + " (photon: \t00100 | 011110, electron: \t11001 | 100001, positron: \t00010 | 000000)\n", + " (photon: \t00100 | 011101, electron: \t11001 | 100010, positron: \t00010 | 000000)\n", + " (photon: \t00001 | 101011, electron: \t11100 | 010100, positron: \t00010 | 000000)\n", + " (photon: \t00001 | 100111, electron: \t11100 | 011000, positron: \t00010 | 000000)\n", + " (photon: \t00001 | 011011, electron: \t11100 | 100100, positron: \t00010 | 000000)\n", + " (photon: \t00001 | 010111, electron: \t11100 | 101000, positron: \t00010 | 000000)\n", + " (photon: \t00000 | 101111, electron: \t11101 | 010000, positron: \t00010 | 000000)\n", + " (photon: \t00000 | 011111, electron: \t11101 | 100000, positron: \t00010 | 000000)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "triples = FeynmanDiagramGenerator.total_particle_triples(all_particles)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "s: 2280960, should be: 2280960\n", + "number of triples: 7248\n" + ] + }, + { + "data": { + "text/plain": [ + "7248-element Vector{Tuple{VirtualParticle, VirtualParticle, VirtualParticle}}:\n", + " (photon: \t00000 | 010000, electron: \t00100 | 001111, positron: \t11011 | 100000)\n", + " (photon: \t00000 | 010000, electron: \t00101 | 000111, positron: \t11010 | 101000)\n", + " (photon: \t00000 | 010000, electron: \t00101 | 001011, positron: \t11010 | 100100)\n", + " (photon: \t00000 | 010000, electron: \t00110 | 000111, positron: \t11001 | 101000)\n", + " (photon: \t00000 | 010000, electron: \t00110 | 001011, positron: \t11001 | 100100)\n", + " (photon: \t00000 | 010000, electron: \t00111 | 000011, positron: \t11000 | 101100)\n", + " (photon: \t00000 | 010000, electron: \t01000 | 001111, positron: \t10111 | 100000)\n", + " (photon: \t00000 | 010000, electron: \t01001 | 000111, positron: \t10110 | 101000)\n", + " (photon: \t00000 | 010000, electron: \t01001 | 001011, positron: \t10110 | 100100)\n", + " (photon: \t00000 | 010000, electron: \t01010 | 000111, positron: \t10101 | 101000)\n", + " ⋮\n", + " (photon: \t11111 | 000000, electron: \t00000 | 001011, positron: \t00000 | 110100)\n", + " (photon: \t11111 | 000000, electron: \t00000 | 110001, positron: \t00000 | 001110)\n", + " (photon: \t11111 | 000000, electron: \t00000 | 110010, positron: \t00000 | 001101)\n", + " (photon: \t11111 | 000000, electron: \t00000 | 010111, positron: \t00000 | 101000)\n", + " (photon: \t11111 | 000000, electron: \t00000 | 011011, positron: \t00000 | 100100)\n", + " (photon: \t11111 | 000000, electron: \t00000 | 100111, positron: \t00000 | 011000)\n", + " (photon: \t11111 | 000000, electron: \t00000 | 101011, positron: \t00000 | 010100)\n", + " (photon: \t11111 | 000000, electron: \t00000 | 110111, positron: \t00000 | 001000)\n", + " (photon: \t11111 | 000000, electron: \t00000 | 111011, positron: \t00000 | 000100)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "function n(vp::VirtualParticle)\n", + " if !haskey(pairs, vp)\n", + " return 1\n", + " end\n", + " s = 0\n", + " for (l, r) in pairs[vp]\n", + " s += n(l) * n(r)\n", + " end\n", + " return s\n", + "end\n", + "\n", + "n(last(all_particles))\n", + "s = 0\n", + "for (ph, e, p) in triples\n", + " s += n(ph) * n(e) * n(p)\n", + "end\n", + "\n", + "println(\"s: $s, should be: $(length(feynman_diagrams(proc)))\")\n", + "println(\"number of triples: $(length(triples))\")\n", + "\n", + "sort(triples)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.10.4", + "language": "julia", + "name": "julia-1.10" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.10.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/FeynmanDiagramGenerator.jl b/src/FeynmanDiagramGenerator.jl index 1d76795..f0ce5e3 100644 --- a/src/FeynmanDiagramGenerator.jl +++ b/src/FeynmanDiagramGenerator.jl @@ -8,6 +8,7 @@ using Reexport include("QEDprocesses_patch.jl") import Base.== +import QEDbase.process export FlatMatrix @@ -15,7 +16,10 @@ export GenericQEDProcess, isphysical export AbstractTreeLevelFeynmanDiagram, FeynmanVertex, FeynmanDiagram export external_particles, virtual_particles, process, vertices -export VirtualParticle + +export VirtualParticle, number_contributions +export contributions, in_contributions, out_contributions +export is_virtual, particle_pairs export Forest diff --git a/src/diagrams/diagrams.jl b/src/diagrams/diagrams.jl index 419b477..808306e 100644 --- a/src/diagrams/diagrams.jl +++ b/src/diagrams/diagrams.jl @@ -80,9 +80,23 @@ end function Base.show(io::IO, vp::VirtualParticle) pr = x -> x ? "1" : "0" - println(io, "$(vp.species): \t$(*(pr.(vp.in_particle_contributions)...)) | $(*(pr.(vp.out_particle_contributions)...))") + print(io, "$(vp.species): \t$(*(pr.(vp.in_particle_contributions)...)) | $(*(pr.(vp.out_particle_contributions)...))") end +function QEDbase.process(vp::VirtualParticle) + return vp.proc +end + +function QEDbase.particle_species(vp::VirtualParticle) + return vp.species +end + +in_contributions(vp::VirtualParticle) = vp.in_particle_contributions +out_contributions(vp::VirtualParticle) = vp.out_particle_contributions +contributions(vp::VirtualParticle) = ((in_contributions(vp), out_contributions(vp))) + +is_virtual(vp::VirtualParticle) = number_contributions(vp) > 1 + import Base: + # "addition" of the bool tuples @@ -111,9 +125,9 @@ end # normalize the representation function normalize(virtual_particle::VirtualParticle) - I = length(virtual_particle.in_particle_contributions) - O = length(virtual_particle.out_particle_contributions) - data = (virtual_particle.in_particle_contributions, virtual_particle.out_particle_contributions) + I = length(in_contributions(virtual_particle)) + O = length(out_contributions(virtual_particle)) + data = contributions(virtual_particle) s = sum(data[1]) + sum(data[2]) if s > (I + O) / 2 return invert(virtual_particle) @@ -193,11 +207,141 @@ function _fermion_type(proc::AbstractProcessDefinition, ::FeynmanDiagram{N,E,U,T end end -function _momentum_contribution(proc::AbstractProcessDefinition, diagram::FeynmanDiagram, n::Int) +@inline function _momentum_contribution(proc::AbstractProcessDefinition, diagram::FeynmanDiagram, n::Int) return _momentum_contribution(proc, _fermion_type(proc, diagram, n)...) end -function virtual_particles(proc::QEDbase.AbstractProcessDefinition, diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM} +function _external_particle(proc::AbstractProcessDefinition, diagram::FeynmanDiagram, n::Int) + (dir, species, _) = _fermion_type(proc, diagram, n) + if dir == Outgoing() + species = invert(species) + end + return VirtualParticle(proc, species, _momentum_contribution(proc, diagram, n)...) +end + +function number_contributions(vp::VirtualParticle) + return sum(vp.in_particle_contributions) + sum(vp.out_particle_contributions) +end + +function Base.isless(a::VirtualParticle, b::VirtualParticle) + if number_contributions(a) == number_contributions(b) + if a.in_particle_contributions == b.in_particle_contributions + return a.out_particle_contributions < b.out_particle_contributions + end + return a.in_particle_contributions < b.in_particle_contributions + end + return number_contributions(a) < number_contributions(b) +end + +""" + contains(a::VirtualParticle, b::VirtualParticle) + +Returns true if the set of particles contributing to `a` are contains the set of particles contributing to `b`. +""" +function contains(a::VirtualParticle{P,S1,IN_T,OUT_T}, b::VirtualParticle{P,S2,IN_T,OUT_T}) where {P,S1,S2,IN_T,OUT_T} + for (a_contrib, b_contrib) in Iterators.zip(Iterators.flatten.(contributions.((a, b)))...) + if b_contrib && !a_contrib + return false + end + end + + return true +end + +""" + make_up(a::VirtualParticle, b::VirtualParticle, c::VirtualParticle) + +For virtual particles `a`, `b`, and `c`, return true if `a` and `b`'s joint momentum contributions add up to `c`'s momentum contributions. +""" +function make_up(a::VirtualParticle, b::VirtualParticle, c::VirtualParticle) + if particle_species(a) == Photon() && particle_species(b) == Photon() + return false + end + # it should be unnecessary to check here that a and b can actually react. if a + b = c they must be able to if a, b and c all exist in the diagram. + for (a_contrib, b_contrib, c_contrib) in Iterators.zip(Iterators.flatten.(contributions.((a, b, c)))...) + if c_contrib != a_contrib + b_contrib + return false + end + end + + return true +end + +""" + are_total(a::VirtualParticle, b::VirtualParticle, c::VirtualParticle) + +Return true if a, b and c combined contain all external particles exactly once. +""" +function are_total(a::VirtualParticle, b::VirtualParticle, c::VirtualParticle) + for (a_contrib, b_contrib, c_contrib) in Iterators.zip(Iterators.flatten.(contributions.((a, b, c)))...) + if a_contrib + b_contrib + c_contrib != 1 + return false + end + end + + return true +end + +""" + pairs + +For a particle `vp` and a vector of `particles`, return a Vector of pairs of particles from the vector containing all pairs whose joint contributions are equal to the contributions of `vp`. +""" +function particle_pairs(vp::VirtualParticle, particles::Vector) + # momentum contributions are unique among particles, so each particle can only have at most one partner + result_pairs = Vector{Tuple{VirtualParticle,VirtualParticle}}() + + # TODO: make this less awful + for i in eachindex(particles) + a = particles[i] + for b in particles[i+1:end] + if make_up(a, b, vp) + push!(result_pairs, (a, b)) + end + end + end + + return result_pairs +end + +function total_particle_triples(particles::Vector) + # particle pairs making up the whole graph + result_triples = Vector{Tuple{VirtualParticle,VirtualParticle,VirtualParticle}}() + + proto_particle = first(particles) + proc = QEDbase.process(proto_particle) + + working_set = vcat(particles, _pseudo_virtual_particles(proc, first(feynman_diagrams(proc)))) + + photons = filter(p -> particle_species(p) == Photon(), working_set) + electrons = filter(p -> particle_species(p) == Electron(), working_set) + positrons = filter(p -> particle_species(p) == Positron(), working_set) + + println("photons: $photons") + println("electrons: $electrons") + println("positron: $positrons") + println("i photons: $(invert.(photons))") + + # no participant can have more than half the external particles, so every possible particle is contained here + for (ph, e, p) in Iterators.product(photons, electrons, positrons) + if are_total(ph, e, p) + push!(result_triples, (ph, e, p)) + end + end + + return result_triples +end + +""" + _pseudo_virtual_particles + +Return a vector of `VirtualParticle` for each external particle. These are not actually virtual particles, but can be helpful as entry points. +""" +function _pseudo_virtual_particles(proc::AbstractProcessDefinition, diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM} + return sort(_external_particle.(proc, Ref(diagram), [1:number_incoming_particles(proc)+number_outgoing_particles(proc);])) +end + +function virtual_particles(proc::AbstractProcessDefinition, diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM} fermion_lines = PriorityQueue{Int64,Int64}() # count number of internal photons in each fermion line and make a priority queue for fermion line => number of internal photons @@ -226,8 +370,11 @@ function virtual_particles(proc::QEDbase.AbstractProcessDefinition, diagram::Fey current_line = dequeue!(fermion_lines) local unknown_photon_momentum = nothing - # walk line from the *left* - species = _fermion_type(proc, diagram, current_line)[2] + # walk line from the *left* (either incoming electron or outgoing positron) + (dir, species, _) = _fermion_type(proc, diagram, current_line) + if dir == Outgoing() + species = invert(species) + end cumulative_mom = _momentum_contribution(proc, diagram, current_line) @@ -281,7 +428,7 @@ function virtual_particles(proc::QEDbase.AbstractProcessDefinition, diagram::Fey end end - return ntuple(x -> normalize(result[x]), length(result) - 1) + return normalize.(result)[1:end-1] end function vertices(diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM}