From 0af7a31e19a439bf35b67a60c8a7f1ee4d7ac5e1 Mon Sep 17 00:00:00 2001 From: AntonReinhard Date: Fri, 12 Jul 2024 14:56:22 +0200 Subject: [PATCH] Improve triples generation --- notebooks/diagram_generation.ipynb | 146 ++++++++++++++--------------- src/FeynmanDiagramGenerator.jl | 2 +- src/diagrams/diagrams.jl | 90 +++++++++++------- src/diagrams/interface.jl | 10 -- 4 files changed, 127 insertions(+), 121 deletions(-) diff --git a/notebooks/diagram_generation.ipynb b/notebooks/diagram_generation.ipynb index 2bc5095..99f7525 100644 --- a/notebooks/diagram_generation.ipynb +++ b/notebooks/diagram_generation.ipynb @@ -20,33 +20,33 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 7, "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", + "254-element Vector{VirtualParticle{GenericQEDProcess{Tuple{Photon, Photon, Photon, Photon, Photon, Photon, Photon, Electron}, Tuple{Photon, Electron}}, PT, 8, 2} where PT<:AbstractParticleType}:\n", + " positron: \t00000000 | 11\n", + " electron: \t00000001 | 10\n", + " positron: \t00000010 | 01\n", + " electron: \t00000011 | 00\n", + " positron: \t00000100 | 01\n", + " electron: \t00000101 | 00\n", + " positron: \t00001000 | 01\n", + " electron: \t00001001 | 00\n", + " positron: \t00010000 | 01\n", + " electron: \t00010001 | 00\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" + " electron: \t11100001 | 10\n", + " positron: \t11100010 | 01\n", + " electron: \t11100011 | 00\n", + " positron: \t11100100 | 01\n", + " electron: \t11100101 | 00\n", + " positron: \t11101000 | 01\n", + " electron: \t11101001 | 00\n", + " positron: \t11110000 | 01\n", + " electron: \t11110001 | 00" ] }, "metadata": {}, @@ -54,7 +54,7 @@ } ], "source": [ - "proc = GenericQEDProcess(1, 2, 2, 2, 2, 2)\n", + "proc = GenericQEDProcess(7, 1, 1, 1, 0, 0)\n", "all_particles = Set()\n", "for fd in feynman_diagrams(proc) \n", " push!(all_particles, virtual_particles(proc, fd)...)\n", @@ -65,11 +65,11 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ - "pseudo_particles = FeynmanDiagramGenerator._pseudo_virtual_particles(proc, first(feynman_diagrams(proc)))\n", + "pseudo_particles = FeynmanDiagramGenerator._pseudo_virtual_particles(proc)\n", "\n", "pairs = Dict{VirtualParticle, Vector{Tuple{VirtualParticle, VirtualParticle}}}()\n", "for p in all_particles\n", @@ -82,43 +82,33 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 9, "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", + "280-element Vector{Tuple{VirtualParticle, VirtualParticle, VirtualParticle}}:\n", + " (photon: \t00000000 | 10, electron: \t11001101 | 00, positron: \t00110010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t01101001 | 00, positron: \t10010110 | 01)\n", + " (photon: \t00000000 | 10, electron: \t01010101 | 00, positron: \t10101010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t11000111 | 00, positron: \t00111000 | 01)\n", + " (photon: \t00000000 | 10, electron: \t11101001 | 00, positron: \t00010110 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00101101 | 00, positron: \t11010010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t11100101 | 00, positron: \t00011010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t01010011 | 00, positron: \t10101100 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00001111 | 00, positron: \t11110000 | 01)\n", + " (photon: \t00000000 | 10, electron: \t01001011 | 00, positron: \t10110100 | 01)\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)" + " (photon: \t01000000 | 00, electron: \t10011011 | 00, positron: \t00100100 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10110011 | 00, positron: \t00001100 | 11)\n", + " (photon: \t01000000 | 00, electron: \t00110101 | 00, positron: \t10001010 | 11)\n", + " (photon: \t01000000 | 00, electron: \t00011101 | 00, positron: \t10100010 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10101101 | 00, positron: \t00010010 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10001011 | 10, positron: \t00110100 | 01)\n", + " (photon: \t01000000 | 00, electron: \t00001011 | 10, positron: \t10110100 | 01)\n", + " (photon: \t01000000 | 00, electron: \t10001111 | 00, positron: \t00110000 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10100011 | 10, positron: \t00011100 | 01)" ] }, "metadata": {}, @@ -131,41 +121,41 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "s: 2280960, should be: 2280960\n", - "number of triples: 7248\n" + "s: 40320, should be: 40320\n", + "number of triples: 280\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", + "280-element Vector{Tuple{VirtualParticle, VirtualParticle, VirtualParticle}}:\n", + " (photon: \t00000000 | 10, electron: \t00001111 | 00, positron: \t11110000 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00010111 | 00, positron: \t11101000 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00011011 | 00, positron: \t11100100 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00011101 | 00, positron: \t11100010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00100111 | 00, positron: \t11011000 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00101011 | 00, positron: \t11010100 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00101101 | 00, positron: \t11010010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00110011 | 00, positron: \t11001100 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00110101 | 00, positron: \t11001010 | 01)\n", + " (photon: \t00000000 | 10, electron: \t00111001 | 00, positron: \t11000110 | 01)\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)" + " (photon: \t01000000 | 00, electron: \t10100101 | 10, positron: \t00011010 | 01)\n", + " (photon: \t01000000 | 00, electron: \t10100111 | 00, positron: \t00011000 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10101001 | 10, positron: \t00010110 | 01)\n", + " (photon: \t01000000 | 00, electron: \t10101011 | 00, positron: \t00010100 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10101101 | 00, positron: \t00010010 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10110001 | 10, positron: \t00001110 | 01)\n", + " (photon: \t01000000 | 00, electron: \t10110011 | 00, positron: \t00001100 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10110101 | 00, positron: \t00001010 | 11)\n", + " (photon: \t01000000 | 00, electron: \t10111001 | 00, positron: \t00000110 | 11)" ] }, "metadata": {}, diff --git a/src/FeynmanDiagramGenerator.jl b/src/FeynmanDiagramGenerator.jl index f0ce5e3..2940a24 100644 --- a/src/FeynmanDiagramGenerator.jl +++ b/src/FeynmanDiagramGenerator.jl @@ -15,7 +15,7 @@ export FlatMatrix export GenericQEDProcess, isphysical export AbstractTreeLevelFeynmanDiagram, FeynmanVertex, FeynmanDiagram -export external_particles, virtual_particles, process, vertices +export external_particles, virtual_particles, process export VirtualParticle, number_contributions export contributions, in_contributions, out_contributions diff --git a/src/diagrams/diagrams.jl b/src/diagrams/diagrams.jl index 808306e..22afa20 100644 --- a/src/diagrams/diagrams.jl +++ b/src/diagrams/diagrams.jl @@ -158,7 +158,13 @@ function _momentum_contribution(proc::AbstractProcessDefinition, dir::ParticleDi @assert false "tried to get momentum contribution of $dir $species $index but it does not exist in $proc" end -function _fermion_type(proc::AbstractProcessDefinition, ::FeynmanDiagram{N,E,U,T,M,FM}, n::Int) where {N,E,U,T,M,FM} +function _fermion_type(proc::AbstractProcessDefinition, n::Int) + E = number_particles(proc, Incoming(), Electron()) + number_particles(proc, Outgoing(), Positron()) + U = 0 # TODO add muons + T = 0 # TODO add tauons + M = number_particles(proc, Incoming(), Photon()) + number_particles(proc, Outgoing(), Photon()) + N = E + U + T + # from the fermion index, get (Direction, Species, n) tuple, where n means it's the nth particle of that dir and species if (n > 0 && n <= E) electron_n = n @@ -207,16 +213,16 @@ function _fermion_type(proc::AbstractProcessDefinition, ::FeynmanDiagram{N,E,U,T end end -@inline function _momentum_contribution(proc::AbstractProcessDefinition, diagram::FeynmanDiagram, n::Int) - return _momentum_contribution(proc, _fermion_type(proc, diagram, n)...) +@inline function _momentum_contribution(proc::AbstractProcessDefinition, n::Int) + return _momentum_contribution(proc, _fermion_type(proc, n)...) end -function _external_particle(proc::AbstractProcessDefinition, diagram::FeynmanDiagram, n::Int) - (dir, species, _) = _fermion_type(proc, diagram, n) +function _external_particle(proc::AbstractProcessDefinition, n::Int) + (dir, species, _) = _fermion_type(proc, n) if dir == Outgoing() species = invert(species) end - return VirtualParticle(proc, species, _momentum_contribution(proc, diagram, n)...) + return VirtualParticle(proc, species, _momentum_contribution(proc, n)...) end function number_contributions(vp::VirtualParticle) @@ -233,12 +239,27 @@ function Base.isless(a::VirtualParticle, b::VirtualParticle) return number_contributions(a) < number_contributions(b) end +""" + disjunct(a::VirtualParticle, b::VirtualParticle) + +Return true if the momenta contributions of `a` and `b` are disjunct. +""" +function disjunct(a::VirtualParticle, b::VirtualParticle) + 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 + """ 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} +function contains(a::VirtualParticle, b::VirtualParticle) for (a_contrib, b_contrib) in Iterators.zip(Iterators.flatten.(contributions.((a, b)))...) if b_contrib && !a_contrib return false @@ -308,24 +329,34 @@ 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) + proc = QEDbase.process(first(particles)) - working_set = vcat(particles, _pseudo_virtual_particles(proc, first(feynman_diagrams(proc)))) + working_set = vcat(particles, _pseudo_virtual_particles(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) + photons = filter(p -> is_boson(particle_species(p)), working_set) + + # make electrons a set for fast deletion + electrons = Set(filter(p -> is_fermion(particle_species(p)) && is_particle(particle_species(p)), working_set)) + + # make positrons a set for fast lookup + positrons = Set(filter(p -> is_fermion(particle_species(p)) && is_anti_particle(particle_species(p)), 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)) + # every photon has exactly one electron and positron partner + for ph in photons + for e in electrons + if !disjunct(ph, e) + continue + end + + # create the only partner the ph and e could have together, then look for it in the actual positrons + expected_p = invert(VirtualParticle(proc, particle_species(e), (contributions(ph) + contributions(e))...)) + + if expected_p in positrons + @assert are_total(ph, e, expected_p) + push!(result_triples, (ph, e, expected_p)) + end end end @@ -337,8 +368,8 @@ end 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);])) +function _pseudo_virtual_particles(proc::AbstractProcessDefinition) + return sort(_external_particle.(proc, [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} @@ -371,12 +402,12 @@ function virtual_particles(proc::AbstractProcessDefinition, diagram::FeynmanDiag local unknown_photon_momentum = nothing # walk line from the *left* (either incoming electron or outgoing positron) - (dir, species, _) = _fermion_type(proc, diagram, current_line) + (dir, species, _) = _fermion_type(proc, current_line) if dir == Outgoing() species = invert(species) end - cumulative_mom = _momentum_contribution(proc, diagram, current_line) + cumulative_mom = _momentum_contribution(proc, current_line) for i in 1:length(diagram.diagram_structure, current_line) binding_particle = diagram.diagram_structure[current_line, i] @@ -389,7 +420,7 @@ function virtual_particles(proc::AbstractProcessDefinition, diagram::FeynmanDiag break end else # binding_particle is an external photon - cumulative_mom += _momentum_contribution(proc, diagram, binding_particle) + cumulative_mom += _momentum_contribution(proc, binding_particle) end push!(result, VirtualParticle(proc, species, cumulative_mom...)) end @@ -405,7 +436,7 @@ function virtual_particles(proc::AbstractProcessDefinition, diagram::FeynmanDiag right_line = diagram.electron_permutation[current_line] species = invert(species) - cumulative_mom = _momentum_contribution(proc, diagram, right_line) + cumulative_mom = _momentum_contribution(proc, right_line) for i in length(diagram.diagram_structure, current_line):-1:1 # iterate from the right binding_particle = diagram.diagram_structure[current_line, i] if (binding_particle <= N) # binding_particle is an internal photon @@ -422,7 +453,7 @@ function virtual_particles(proc::AbstractProcessDefinition, diagram::FeynmanDiag break end else # binding_particle is an external photon - cumulative_mom += _momentum_contribution(proc, diagram, binding_particle) + cumulative_mom += _momentum_contribution(proc, binding_particle) end push!(result, VirtualParticle(proc, species, cumulative_mom...)) end @@ -431,11 +462,6 @@ function virtual_particles(proc::AbstractProcessDefinition, diagram::FeynmanDiag return normalize.(result)[1:end-1] end -function vertices(diagram::FeynmanDiagram{N,E,U,T,M,FM}) where {N,E,U,T,M,FM} - - return NTuple{N,VertexType}() -end - # # Generate Feynman Diagrams diff --git a/src/diagrams/interface.jl b/src/diagrams/interface.jl index 83f2b2a..714169c 100644 --- a/src/diagrams/interface.jl +++ b/src/diagrams/interface.jl @@ -53,13 +53,3 @@ Return a tuple of the incoming and outgoing particles (`QEDbase.AbstractParticle function external_particles(diagram::AbstractTreeLevelFeynmanDiagram) return (incoming_particles(process(diagram)), outgoing_particles(process(diagram))) end - -""" - vertices(::AbstractTreeLevelFeynmanDiagram)::NTuple{N, VertexType} - -Interface function that must be implemented for an instance of [`AbstractTreeLevelFeynmanDiagram`](@ref). - -Return an `NTuple` with N elements, where N is the number of vertices in this diagram. For tree-level Feynman diagrams, \$N = k - 2\$, where \$k\$ is the number of external particles. -The elements of the `NTuple` are instances of [`AbstractFeynmanVertex`](@ref). If necessary, each of these can indicate its position in the diagram. -""" -function vertices end