feat: Feynman Trees

This commit is contained in:
jstoobysmith 2024-11-19 16:56:23 +00:00
parent ba5312b530
commit 2bc561535a
3 changed files with 149 additions and 49 deletions

View file

@ -54,7 +54,7 @@ import HepLean.BeyondTheStandardModel.TwoHDM.GaugeOrbits
import HepLean.FeynmanDiagrams.Basic import HepLean.FeynmanDiagrams.Basic
import HepLean.FeynmanDiagrams.Instances.ComplexScalar import HepLean.FeynmanDiagrams.Instances.ComplexScalar
import HepLean.FeynmanDiagrams.Instances.Phi4 import HepLean.FeynmanDiagrams.Instances.Phi4
import HepLean.FeynmanDiagrams.Instances.TwoRealScalar import HepLean.FeynmanDiagrams.Instances.TwoComplexScalar
import HepLean.FeynmanDiagrams.Momentum import HepLean.FeynmanDiagrams.Momentum
import HepLean.FlavorPhysics.CKMMatrix.Basic import HepLean.FlavorPhysics.CKMMatrix.Basic
import HepLean.FlavorPhysics.CKMMatrix.Invariants import HepLean.FlavorPhysics.CKMMatrix.Invariants

View file

@ -0,0 +1,148 @@
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.FeynmanDiagrams.Basic
/-!
# Feynman rules for a two complex scalar fields
This file serves as a demonstration of a new approach to Feynman rules.
-/
namespace TwoComplexScalar
open CategoryTheory
open FeynmanDiagram
open PreFeynmanRule
/-- The colors of edges which one can associate with a vertex for a theory
with two complex scalar fields. -/
inductive 𝓔 where
/-- Corresponds to the first complex scalar field flowing out of a vertex. -/
| complexScalarOut₁ : 𝓔
/-- Corresponds to the first complex scalar field flowing into a vertex. -/
| complexScalarIn₁ : 𝓔
/-- Corresponds to the second complex scalar field flowing out of a vertex. -/
| complexScalarOut₂ : 𝓔
/-- Corresponds to the second complex scalar field flowing into a vertex. -/
| complexScalarIn₂ : 𝓔
/-- The map taking each color to it's dual, specifying how we can contract edges. -/
def ξ : 𝓔𝓔
| 𝓔.complexScalarOut₁ => 𝓔.complexScalarIn₁
| 𝓔.complexScalarIn₁ => 𝓔.complexScalarOut₁
| 𝓔.complexScalarOut₂ => 𝓔.complexScalarIn₂
| 𝓔.complexScalarIn₂ => 𝓔.complexScalarOut₂
/-- The function `ξ` is an involution. -/
lemma ξ_involutive : Function.Involutive ξ := by
intro x
match x with
| 𝓔.complexScalarOut₁ => rfl
| 𝓔.complexScalarIn₁ => rfl
| 𝓔.complexScalarOut₂ => rfl
| 𝓔.complexScalarIn₂ => rfl
/-- The vertices associated with two complex scalars.
We call this type, the type of vertex colors. -/
inductive 𝓥 where
| φ₁φ₁φ₂φ₂ : 𝓥
| φ₁φ₁φ₁φ₁ : 𝓥
| φ₂φ₂φ₂φ₂ : 𝓥
/-- To each vertex, the association of the number of edges. -/
def 𝓥NoEdges : 𝓥 := fun _ => 4
/-- To each vertex, associates the indexing map of half-edges associated with that edge. -/
def 𝓥Edges (v : 𝓥) : Fin (𝓥NoEdges v) → 𝓔 :=
match v with
| 𝓥.φ₁φ₁φ₂φ₂ => fun i =>
match i with
| (0 : Fin 4)=> 𝓔.complexScalarOut₁
| (1 : Fin 4) => 𝓔.complexScalarIn₁
| (2 : Fin 4) => 𝓔.complexScalarOut₂
| (3 : Fin 4) => 𝓔.complexScalarIn₂
| 𝓥.φ₁φ₁φ₁φ₁ => fun i =>
match i with
| (0 : Fin 4)=> 𝓔.complexScalarOut₁
| (1 : Fin 4) => 𝓔.complexScalarIn₁
| (2 : Fin 4) => 𝓔.complexScalarOut₁
| (3 : Fin 4) => 𝓔.complexScalarIn₁
| 𝓥.φ₂φ₂φ₂φ₂ => fun i =>
match i with
| (0 : Fin 4)=> 𝓔.complexScalarOut₂
| (1 : Fin 4) => 𝓔.complexScalarIn₂
| (2 : Fin 4) => 𝓔.complexScalarOut₂
| (3 : Fin 4) => 𝓔.complexScalarIn₂
/-- A Feynman tree is an similar to a Feynman diagram, except there is an
order to edges etc. It has a node for each vertex of a Feynman diagram,
the (disjoint) union of Feynman diagrams, and the joining of two half edges of
a Feynman diagram.
To each Feynman tree is associated a Feynman diagram. But more then
one distinct Feynman tree can lead to the same Feynman diagram. -/
inductive FeynmanTree : {n : } → (c : Fin n → 𝓔) → Type where
| vertex (v : 𝓥) : FeynmanTree (𝓥Edges v)
| union {n m : } {c : Fin n → 𝓔} {c1 : Fin m → 𝓔} (t : FeynmanTree c) (t1 : FeynmanTree c1) :
FeynmanTree (Sum.elim c c1 ∘ finSumFinEquiv.symm)
| join {n : } {c : Fin n.succ.succ → 𝓔} : (i : Fin n.succ.succ) →
(j : Fin n.succ) → (h : c (i.succAbove j) = ξ (c i)) → FeynmanTree c →
FeynmanTree (c ∘ i.succAbove ∘ j.succAbove)
namespace FeynmanTree
/-- The number of nodes in a feynman tree. -/
def size {n : } {c : Fin n → 𝓔} : FeynmanTree c → := fun
| vertex _ => 1
| union t1 t2 => t1.size + t2.size + 1
| join _ _ _ t => t.size + 1
/-- The number of half-edges associated with a Feynman tree. -/
def numHalfEdges {n : } {c : Fin n → 𝓔} : FeynmanTree c → := fun
| vertex v => 𝓥NoEdges v
| union t1 t2 => t1.numHalfEdges + t2.numHalfEdges
| join _ _ _ t => t.numHalfEdges
/-- The type of vertices of a Feynman tree. -/
def vertexType {n : } {c : Fin n → 𝓔} : FeynmanTree c → Type := fun
| vertex v => Unit
| union t1 t2 => Sum t1.vertexType t2.vertexType
| join _ _ _ t => t.vertexType
/-- Maps `vertexType` to `𝓥` taking each vertex to it's vertex color. -/
def vertexTo𝓥 {n : } {c : Fin n → 𝓔} : (T : FeynmanTree c) → T.vertexType → 𝓥 := fun
| vertex v => fun _ => v
| union t1 t2 => Sum.elim t1.vertexTo𝓥 t2.vertexTo𝓥
| join _ _ _ t => t.vertexTo𝓥
/-- The type of half edges of a tensor tree. -/
def halfEdgeType {n : } {c : Fin n → 𝓔} : FeynmanTree c → Type := fun
| vertex v => Fin (𝓥NoEdges v)
| union t1 t2 => Sum t1.halfEdgeType t2.halfEdgeType
| join _ _ _ t => t.halfEdgeType
/-- The map taking each half-edge to it's associated vertex. -/
def halfEdgeToVertex {n : } {c : Fin n → 𝓔} : (T : FeynmanTree c) → T.halfEdgeType → T.vertexType := fun
| vertex v => fun _ => ()
| union t1 t2 => Sum.map t1.halfEdgeToVertex t2.halfEdgeToVertex
| join _ _ _ t => t.halfEdgeToVertex
/-- The inclusion of external half-edges into all half-edges. -/
def inclExternalEdges {n : } {c : Fin n → 𝓔} : (T : FeynmanTree c) →
Fin n → T.halfEdgeType := fun
| vertex v => fun i => i
| union t1 t2 => Sum.map t1.inclExternalEdges t2.inclExternalEdges ∘ finSumFinEquiv.symm
| join i j _ t => t.inclExternalEdges ∘ i.succAbove ∘ j.succAbove
/-- The type of edges of a Feynman tree. -/
def edgeType {n : } {c : Fin n → 𝓔} : FeynmanTree c → Type := fun
| vertex v => Empty
| union t1 t2 => Sum t1.edgeType t2.edgeType
| join _ _ _ t => Sum t.edgeType Unit
end FeynmanTree
end TwoComplexScalar

View file

@ -1,48 +0,0 @@
/-
Copyright (c) 2024 Joseph Tooby-Smith. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Joseph Tooby-Smith
-/
import HepLean.FeynmanDiagrams.Basic
/-!
# Feynman rules for a two complex scalar fields
This file serves as a demonstration of a new approach to Feynman rules.
-/
namespace TwoComplexScalar
open CategoryTheory
open FeynmanDiagram
open PreFeynmanRule
/-- The colors of edges which one can associate with a vertex for a theory
with two complex scalar fields. -/
inductive 𝓔 where
/-- Corresponds to the first complex scalar field flowing out of a vertex. -/
| complexScalarOut₁ : 𝓔
/-- Corresponds to the first complex scalar field flowing into a vertex. -/
| complexScalarIn₁ : 𝓔
/-- Corresponds to the second complex scalar field flowing out of a vertex. -/
| complexScalarOut₂ : 𝓔
/-- Corresponds to the second complex scalar field flowing into a vertex. -/
| complexScalarIn₂ : 𝓔
/-- The map taking each color to it's dual, specifying how we can contract edges. -/
def ξ : 𝓔𝓔
| 𝓔.complexScalarOut₁ => 𝓔.complexScalarIn₁
| 𝓔.complexScalarIn₁ => 𝓔.complexScalarOut₁
| 𝓔.complexScalarOut₂ => 𝓔.complexScalarIn₂
| 𝓔.complexScalarIn₂ => 𝓔.complexScalarOut₂
/-- The function `ξ` is an involution. -/
lemma ξ_involutive : Function.Involutive ξ := by
intro x
match x with
| 𝓔.complexScalarOut₁ => rfl
| 𝓔.complexScalarIn₁ => rfl
| 𝓔.complexScalarOut₂ => rfl
| 𝓔.complexScalarIn₂ => rfl
end TwoComplexScalar