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.Instances.ComplexScalar
import HepLean.FeynmanDiagrams.Instances.Phi4
import HepLean.FeynmanDiagrams.Instances.TwoRealScalar
import HepLean.FeynmanDiagrams.Instances.TwoComplexScalar
import HepLean.FeynmanDiagrams.Momentum
import HepLean.FlavorPhysics.CKMMatrix.Basic
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