diff --git a/docs/src/lib/internals/models.md b/docs/src/lib/internals/models.md index a258ce5..89cd63b 100644 --- a/docs/src/lib/internals/models.md +++ b/docs/src/lib/internals/models.md @@ -69,4 +69,58 @@ Order = [:function] ## QED-Model -*To be added* +### Feynman Diagrams +```@autodocs +Modules = [MetagraphOptimization] +Pages = ["models/qed/diagrams.jl"] +Order = [:type, :function, :constant] +``` + +### Types +```@autodocs +Modules = [MetagraphOptimization] +Pages = ["models/qed/types.jl"] +Order = [:type, :constant] +``` + +### Particle +```@autodocs +Modules = [MetagraphOptimization] +Pages = ["models/qed/particle.jl"] +Order = [:type, :constant, :function] +``` + +### Parse +```@autodocs +Modules = [MetagraphOptimization] +Pages = ["models/qed/parse.jl"] +Order = [:function] +``` + +### Properties +```@autodocs +Modules = [MetagraphOptimization] +Pages = ["models/qed/properties.jl"] +Order = [:function] +``` + +### Create +```@autodocs +Modules = [MetagraphOptimization] +Pages = ["models/qed/create.jl"] +Order = [:function] +``` + +### Compute +```@autodocs +Modules = [MetagraphOptimization] +Pages = ["models/qed/compute.jl"] +Order = [:function] +``` + +### Print +```@autodocs +Modules = [MetagraphOptimization] +Pages = ["models/qed/print.jl"] +Order = [:function] +``` diff --git a/notebooks/abc_model_large.ipynb b/notebooks/abc_model_large.ipynb index 19718d7..653a9b1 100644 --- a/notebooks/abc_model_large.ipynb +++ b/notebooks/abc_model_large.ipynb @@ -11,27 +11,18 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 1 NUMA nodes\n", - "CUDA is non-functional\n" - ] - } - ], + "outputs": [], "source": [ "# Get machine and set dictionary caching strategy\n", "machine = get_machine_info()\n", - "MetagraphOptimization.set_cache_strategy(machine.devices[1], MetagraphOptimization.Dictionary())" + "MetagraphOptimization.set_cache_strategy(machine.devices[1], MetagraphOptimization.LocalVariables())" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -39,9 +30,9 @@ "output_type": "stream", "text": [ "Graph:\n", - " Nodes: Total: 7854, ComputeTaskABC_P: 8, ComputeTaskABC_S2: 720, \n", - " ComputeTaskABC_U: 8, ComputeTaskABC_Sum: 1, ComputeTaskABC_S1: 1230, \n", - " ComputeTaskABC_V: 1956, DataTask: 3931\n", + " Nodes: Total: 7854, DataTask: 3931, ComputeTaskABC_S1: 1230, \n", + " ComputeTaskABC_Sum: 1, ComputeTaskABC_U: 8, ComputeTaskABC_P: 8, \n", + " ComputeTaskABC_V: 1956, ComputeTaskABC_S2: 720\n", " Edges: 11241\n", " Total Compute Effort: 33915.0\n", " Total Data Transfer: 322464.0\n", @@ -59,18 +50,17 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "compute__ae7097a4_7bfc_11ee_2cec_190d7ced64f1 (generic function with 1 method)" + "compute__8bced4be_8f2e_11ee_37d9_3f851690d249 (generic function with 1 method)" ] }, - "execution_count": 7, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -79,22 +69,22 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " 0.140021 seconds (791.41 k allocations: 30.317 MiB, 9.74% gc time)\n", + " 0.184484 seconds (2.75 M allocations: 153.561 MiB, 15.46% gc time)\n", "Graph:\n", - " Nodes: Total: 4998, ComputeTaskABC_P: 8, ComputeTaskABC_S2: 720, \n", - " ComputeTaskABC_U: 8, ComputeTaskABC_Sum: 1, ComputeTaskABC_S1: 516, \n", - " ComputeTaskABC_V: 1242, DataTask: 2503\n", + " Nodes: Total: 4998, DataTask: 2503, ComputeTaskABC_S1: 516, \n", + " ComputeTaskABC_Sum: 1, ComputeTaskABC_U: 8, ComputeTaskABC_P: 8, \n", + " ComputeTaskABC_V: 1242, ComputeTaskABC_S2: 720\n", " Edges: 7671\n", " Total Compute Effort: 21777.0\n", - " Total Data Transfer: 219648.0\n", - " Total Compute Intensity: 0.09914499562937062\n" + " Total Data Transfer: 253920.0\n", + " Total Compute Intensity: 0.0857632325141777\n" ] } ], @@ -105,25 +95,24 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " 3.626740 seconds (1.52 M allocations: 114.358 MiB, 0.84% gc time)\n" + " 0.822702 seconds (574.85 k allocations: 48.098 MiB, 0.90% gc time)\n" ] }, { "data": { "text/plain": [ - "compute__bad8f2ac_7bfc_11ee_176b_b72dc8919aad (generic function with 1 method)" + "compute__8dffb17a_8f2e_11ee_2d70_13a063f6b2e1 (generic function with 1 method)" ] }, - "execution_count": 9, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -132,14 +121,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - " 2.130952 seconds (4.31 M allocations: 276.129 MiB, 4.50% gc time, 99.02% compilation time)\n" + " 0.054193 seconds (108.22 k allocations: 6.222 MiB, 92.26% compilation time)\n" ] }, { @@ -148,309 +137,236 @@ "1000-element Vector{ABCProcessInput}:\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [4.694213004647641, 0.0, 0.0, 4.58646222408983]\n", - " B: [4.694213004647641, 0.0, 0.0, -4.58646222408983]\n", + " A: [5.53824935935883, 0.0, 0.0, 5.447220021849539]\n", + " B: [5.53824935935883, 0.0, 0.0, -5.447220021849539]\n", " 6 Outgoing Particles:\n", - " A: [-1.1989656045893697, -0.40235742161696864, 0.06512533692021122, 0.5209469423550988]\n", - " B: [-1.2555060342925868, 0.3685683194051901, 0.4785890883121294, -0.4597882997907804]\n", - " B: [-2.189083660521547, 0.31663070338411387, 0.1742479621961443, -1.9134967776579581]\n", - " B: [-1.0637129314000269, -0.2948512505337184, 0.0500740340487307, -0.2050378784528044]\n", - " B: [-1.6149410305664367, 1.0344652685816964, -0.406159957064284, 0.6106965118475143]\n", - " B: [-2.0662167479253144, -1.0224556192203134, -0.3618764644129321, 1.4466795016989296]\n", + " A: [-1.3103925957044282, 0.7331872395687581, 0.24174619498761993, 0.34802873993327305]\n", + " B: [-1.7235347423723115, -0.9221216475500805, -0.5368654338299067, 0.9121618174658171]\n", + " B: [-3.2983236636246445, -1.4122494078132704, -0.264394674616116, -2.7954581120438933]\n", + " B: [-1.4663199369248787, -0.21617929792622487, -0.41022326537895987, 0.9669940750145931]\n", + " B: [-1.1596695896410607, 0.40971989086421784, 0.1871290088754596, -0.3767570864705371]\n", + " B: [-2.118258190450336, 1.4076432228565998, 0.7826081699619032, 0.945030566100747]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [5.621657834589244, 0.0, 0.0, 5.532001157736559]\n", - " B: [5.621657834589244, 0.0, 0.0, -5.532001157736559]\n", + " A: [6.406766539805908, 0.0, 0.0, 6.328242844232241]\n", + " B: [6.406766539805908, 0.0, 0.0, -6.328242844232241]\n", " 6 Outgoing Particles:\n", - " A: [-2.058801595505931, 0.7220299456693885, 0.22719930902793095, 1.6327024349806234]\n", - " B: [-1.1826215869997767, 0.04638669502532437, -0.553508153090363, -0.30011800516629]\n", - " B: [-2.3776830758041227, -0.8637209881441633, -0.22710813067439403, 1.9636152272240621]\n", - " B: [-1.9086249240920268, 0.02598092498567318, -1.087715954825374, -1.2079106316365085]\n", - " B: [-2.6526208210236426, 0.3117066248738638, 1.6178469805428013, -1.8225826038033035]\n", - " B: [-1.0629636657529868, -0.24238320241008685, 0.023285949019398133, -0.2657064215985837]\n", + " A: [-1.6009185206411505, -0.5320720115654639, 1.09590848570997, -0.2807562558330809]\n", + " B: [-3.146359037361951, -0.17028519968266745, 1.7773008494544373, -2.389933018577465]\n", + " B: [-1.010135923448664, 0.06427364329577855, -0.1146419285663243, -0.05568402673627389]\n", + " B: [-3.6289281421436512, 0.6465018878980286, -0.8216898266580996, 3.328059584585744]\n", + " B: [-1.3592677632187082, 0.8038563415980269, -0.35192233894694247, -0.27852199472993183]\n", + " B: [-2.06792369279769, -0.8122746615437029, -1.5849552409930403, -0.323164288708993]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [6.176284774018432, 0.0, 0.0, 6.094792335245879]\n", - " B: [6.176284774018432, 0.0, 0.0, -6.094792335245879]\n", + " A: [4.592675400586894, 0.0, 0.0, 4.482484504731276]\n", + " B: [4.592675400586894, 0.0, 0.0, -4.482484504731276]\n", " 6 Outgoing Particles:\n", - " A: [-3.2943110238771185, 1.9799744259594443, 2.3805040294128346, 0.5151572192390796]\n", - " B: [-1.0255775134941767, 0.18009906891836583, -0.12779691496180498, 0.05514988745120904]\n", - " B: [-1.7854209452644407, -0.56381615584479, -0.9572322565407875, 0.9764966468120639]\n", - " B: [-3.3312939695760786, -0.5949754252793171, -2.9420979921841868, -1.0428725518649993]\n", - " B: [-1.6551651824618003, -0.8748451354288965, 0.9749427327758187, -0.1539624566503731]\n", - " B: [-1.260800913363249, -0.12643677832480643, 0.6716804014981268, -0.34996874498697933]\n", + " A: [-1.1473149674649585, -0.35076892712815855, -0.170139004859497, -0.4053955023873595]\n", + " B: [-2.058220554606089, -0.8121547455466859, -1.4272449393744948, 0.7346076529133699]\n", + " B: [-2.0024960896606476, 1.3172479417787402, 0.7582221815549833, -0.8366286944540325]\n", + " B: [-1.0179814720237987, 0.162899519872391, -0.09860388948222289, -0.0052246328160273445]\n", + " B: [-1.834456765054589, -0.0990687609983643, 1.3606293642672649, 0.7100033355854413]\n", + " B: [-1.1248809523637056, -0.2181550279779225, -0.42286371210603335, -0.19736215884139197]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [4.747497785190141, 0.0, 0.0, 4.640984294348053]\n", - " B: [4.747497785190141, 0.0, 0.0, -4.640984294348053]\n", + " A: [4.037101162257922, 0.0, 0.0, 3.9112895308714055]\n", + " B: [4.037101162257922, 0.0, 0.0, -3.9112895308714055]\n", " 6 Outgoing Particles:\n", - " A: [-1.3704329562088802, 0.8292801285050307, 0.2251475790952209, 0.3737506167990253]\n", - " B: [-1.352958681672649, 0.11120507604905326, 0.6088733084867489, -0.6688825902852584]\n", - " B: [-1.4224569379606473, -0.25277059018918374, -0.4925475402927904, -0.84669220478242]\n", - " B: [-2.4534584066229996, -0.23638988525842838, -1.4120549440785204, 1.7232756047945383]\n", - " B: [-1.4378719974624208, 0.5461758322111039, 0.8131489669135029, -0.3285674953530594]\n", - " B: [-1.457816590452685, -0.9975005613175758, 0.257432629875838, -0.25288393117282576]\n", + " A: [-1.7053110482506162, -0.23947337333507246, -1.2744970749813946, 0.47581034101100217]\n", + " B: [-1.3631569288619594, 0.7221467297219651, 0.42638713494656166, -0.3935669251960867]\n", + " B: [-1.0326521624735496, -0.11131042747240362, 0.20341304874809626, 0.11226579619908084]\n", + " B: [-1.195196392865049, -0.5445059949974184, -0.16637078706558947, 0.32299907142385453]\n", + " B: [-1.1830550739590457, 0.24824882865433953, -0.423307203181585, -0.39850073880304915]\n", + " B: [-1.5948307181056223, -0.07510576257141027, 1.2343748815339113, -0.11900754463480165]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [6.148648417619223, 0.0, 0.0, 6.066784763240853]\n", - " B: [6.148648417619223, 0.0, 0.0, -6.066784763240853]\n", + " A: [7.636716907339512, 0.0, 0.0, 7.57096064729207]\n", + " B: [7.636716907339512, 0.0, 0.0, -7.57096064729207]\n", " 6 Outgoing Particles:\n", - " A: [-1.5381168736188293, 0.5769721565317305, 1.0069443436143835, 0.13773066601554382]\n", - " B: [-1.3178580311796126, 0.27781510267038506, -0.8083323925420551, 0.07853217328003184]\n", - " B: [-1.5330954954905804, 0.4994081736550063, -1.0290017953406905, 0.20525247761163526]\n", - " B: [-3.083592979398096, -2.1497728433794587, -1.2247634566690573, -1.5449844205264607]\n", - " B: [-3.1391572693216845, 0.49043306139044257, 2.931865230552653, 0.13397777318202247]\n", - " B: [-1.6854761862296446, 0.30514434913189475, -0.876711929615233, 0.989491330437227]\n", + " A: [-1.8228350224036067, -0.22313230508453247, 0.05829362440621317, -1.5064997001932685]\n", + " B: [-2.467409891320565, 1.6506915327402656, -0.771321444516658, 1.3298091083892047]\n", + " B: [-3.7191367050304223, 1.01401048234514, -0.8448690579747132, -3.3301586819963456]\n", + " B: [-1.086062092991359, 0.018065163049532738, 0.4218324659828878, 0.035523096142663795]\n", + " B: [-3.708627500490809, -3.0248517041401413, 1.3840072581447456, 1.2995052961646025]\n", + " B: [-2.4693626024422626, 0.5652168310897357, -0.24794284604247502, 2.171820881493144]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [7.422637433466136, 0.0, 0.0, 7.35496746890785]\n", - " B: [7.422637433466136, 0.0, 0.0, -7.35496746890785]\n", + " A: [4.844757462595395, 0.0, 0.0, 4.740429819264681]\n", + " B: [4.844757462595395, 0.0, 0.0, -4.740429819264681]\n", " 6 Outgoing Particles:\n", - " A: [-3.3788591199517355, 2.3069724486616927, -0.5016400230094518, 2.2006645271171985]\n", - " B: [-2.193241133599192, -1.652465184572841, -0.691853387986234, -0.7752447184070871]\n", - " B: [-2.295315825041209, 0.334376552772819, 0.5374003175214306, 1.966689593293318]\n", - " B: [-2.3721558149969235, -2.0813404180022568, 0.4923496733367945, 0.22964554029865022]\n", - " B: [-1.5367714331999278, 0.9008878309070798, 0.1482895506792473, -0.7266895920420517]\n", - " B: [-3.068931540143284, 0.1915687702335065, 0.015453869458212284, -2.8950653502600274]\n", + " A: [-1.3377157678137663, -0.44312783214029056, -0.34462836811169034, -0.6887325226333468]\n", + " B: [-1.0287552354600262, 0.10884372468923921, -0.0798214909694111, 0.20029704855940197]\n", + " B: [-1.237602042094568, -0.1707812371296387, -0.708500409075891, -0.02279811352743621]\n", + " B: [-1.2285767946957649, -0.45314793159826366, 0.5376309116329622, -0.12251895938933055]\n", + " B: [-2.3944375695065316, 0.5631279933752329, -1.4234056115727505, 1.5460060162511446]\n", + " B: [-2.4624275156201336, 0.3950852828037212, 2.0187249680967807, -0.9122534692604332]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [6.716486802754837, 0.0, 0.0, 6.64162592830851]\n", - " B: [6.716486802754837, 0.0, 0.0, -6.64162592830851]\n", + " A: [6.914095647194839, 0.0, 0.0, 6.841397417089481]\n", + " B: [6.914095647194839, 0.0, 0.0, -6.841397417089481]\n", " 6 Outgoing Particles:\n", - " A: [-1.3263331205917814, -0.5023870926274977, 0.418137178911541, 0.5761319775467438]\n", - " B: [-2.1603199304697136, -1.202627416523187, 1.024176720111292, -1.0824654936733602]\n", - " B: [-1.1665818595303201, 0.5747508534091106, 0.05041215840441908, 0.16743149576984034]\n", - " B: [-1.829760754209137, 0.5127529745920416, -0.17835468593467171, -1.4329334983509001]\n", - " B: [-2.891550940379351, -2.652621236308268, 0.3953841214715819, 0.41029113320086874]\n", - " B: [-4.05842700032937, 3.2701319174577996, -1.7097554929641623, 1.3615443855068068]\n", + " A: [-1.8747539146164607, -1.15195487912761, 1.0796978964166692, -0.14817101368775237]\n", + " B: [-2.0219963752169967, -0.8963094934108238, -1.380862038576808, 0.6150761447412909]\n", + " B: [-2.4839643051342004, -0.5463241040770312, 0.28470426735854887, -2.1887329948244236]\n", + " B: [-1.0870998264481033, 0.03306160941873628, 0.20168848226668348, -0.3741854069403313]\n", + " B: [-2.4584897964753116, 0.9082805780526032, -1.8726214974559325, -0.844089567623928]\n", + " B: [-3.9018870764986056, 1.6532462891441266, 1.6873928899908393, 2.9401028383351444]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [7.700331598721008, 0.0, 0.0, 7.635123229539995]\n", - " B: [7.700331598721008, 0.0, 0.0, -7.635123229539995]\n", + " A: [4.882838018892802, 0.0, 0.0, 4.77934170349275]\n", + " B: [4.882838018892802, 0.0, 0.0, -4.77934170349275]\n", " 6 Outgoing Particles:\n", - " A: [-2.382743739041896, -1.410381415274026, 1.0613871843128353, 1.2496996576655786]\n", - " B: [-3.021630369232257, 0.25595209564405125, -2.8389223073732714, 0.07251720968504605]\n", - " B: [-2.7262381500229256, 1.0736489469437192, 2.293577756890956, 0.13839603484966886]\n", - " B: [-2.222260574660266, 1.5432031708495264, -0.7055857379280247, 1.0291330339668954]\n", - " B: [-1.650055097318715, -1.062833285640475, -0.34598865120359784, 0.6880109623839291]\n", - " B: [-3.397735267165956, -0.3995895125227963, 0.5355317553011019, -3.1777568985511193]\n", + " A: [-1.3368922715636002, -0.024254114235374817, -0.17993280734873465, 0.8685141729118435]\n", + " B: [-1.336032053759296, 0.44580739433740213, 0.4009862518446777, -0.6522633223307408]\n", + " B: [-1.1917158881102905, 0.11587748600254362, 0.21032579337862262, -0.6020981870524788]\n", + " B: [-1.8590179700604674, -0.4659878149612763, 1.4629321849562218, 0.3140582613697155]\n", + " B: [-1.2740128533657533, -0.3900331968801154, 0.6651639498517544, 0.16893719451393388]\n", + " B: [-2.7680050009261956, 0.3185902457368207, -2.559475372682542, -0.09714811941227354]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [4.9341647451125334, 0.0, 0.0, 4.8317679716550375]\n", - " B: [4.9341647451125334, 0.0, 0.0, -4.8317679716550375]\n", + " A: [4.215107110349817, 0.0, 0.0, 4.094768363622244]\n", + " B: [4.215107110349817, 0.0, 0.0, -4.094768363622244]\n", " 6 Outgoing Particles:\n", - " A: [-1.834221818900379, 0.1070495973399568, 1.2695354794210922, 0.860923766155068]\n", - " B: [-1.5116322118250454, 0.39753882899610743, -0.756426277560466, -0.7448584495617266]\n", - " B: [-1.6588475476725886, 0.06712527283179799, 0.6875031760830096, -1.1289857249063835]\n", - " B: [-1.5718164783029667, 0.4294130824657117, -0.6215317131811225, -0.9486357444151968]\n", - " B: [-1.7838526603309615, -0.5732435925039472, -0.9425541080554634, 0.9824020820472578]\n", - " B: [-1.5079587731931232, -0.4278831891296266, 0.36347344329295106, 0.979154070680981]\n", + " A: [-1.3241447475687065, 0.7510738166043768, -0.3909856211208319, 0.19072933335458914]\n", + " B: [-1.7731907344857587, 0.036019000265901324, 1.4622797510086056, -0.06816114931690141]\n", + " B: [-1.019387957593508, 0.014655316462798782, 0.19300767940790514, -0.04104954903058491]\n", + " B: [-1.6169881803397028, 0.04956396056952302, -1.0323879934365006, -0.7391679242087841]\n", + " B: [-1.6537900060652204, -1.1032956801849205, -0.08849835738509954, 0.7140924778952892]\n", + " B: [-1.0427125946467377, 0.2519835862823207, -0.14341545847407883, -0.056443188693607704]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [7.099667747066588, 0.0, 0.0, 7.028889109862067]\n", - " B: [7.099667747066588, 0.0, 0.0, -7.028889109862067]\n", + " A: [7.2720657357811564, 0.0, 0.0, 7.202981331748843]\n", + " B: [7.2720657357811564, 0.0, 0.0, -7.202981331748843]\n", " 6 Outgoing Particles:\n", - " A: [-3.851129225519823, 2.5555470019017212, -2.502060728335724, 1.019837214678957]\n", - " B: [-2.3860288930086897, 0.6059782347076652, 0.6711053982516709, 1.9686395814801452]\n", - " B: [-1.9543999030878276, -1.5857282951514855, 0.5255033921941499, -0.17026726032362857]\n", - " B: [-1.5523812781985644, -1.154244859738803, 0.03484928145183679, -0.2763909626783212]\n", - " B: [-3.2795110937910716, -1.0290377989842119, 1.3607888704851536, -2.616204860580336]\n", - " B: [-1.175885100527199, 0.6074857172651138, -0.09018621404708665, 0.07438628742318319]\n", - "\n", - " Input for ABC Process: 'AB->ABBBBB':\n", - " 2 Incoming particles:\n", - " A: [6.3653048194550985, 0.0, 0.0, 6.286263233796236]\n", - " B: [6.3653048194550985, 0.0, 0.0, -6.286263233796236]\n", - " 6 Outgoing Particles:\n", - " A: [-3.274142279992413, -2.62046758782023, -1.339558866223036, 1.028950598785383]\n", - " B: [-1.8502190446152251, -1.1967169760014287, 0.8476370040459147, 0.5221977611776395]\n", - " B: [-1.3090919645484567, 0.8304076910302604, -0.132118345313184, 0.08178985973111547]\n", - " B: [-1.7699077332157842, 0.8156249668276708, -0.2891156025546255, 1.1763254081859622]\n", - " B: [-1.6671330761442815, 1.2573648831500233, 0.2190135291489001, -0.3878135096217862]\n", - " B: [-2.8601155403940384, 0.913787022813704, 0.6941422808960306, -2.421450118258315]\n", - "\n", - " Input for ABC Process: 'AB->ABBBBB':\n", - " 2 Incoming particles:\n", - " A: [5.2620105860572215, 0.0, 0.0, 5.166116085395126]\n", - " B: [5.2620105860572215, 0.0, 0.0, -5.166116085395126]\n", - " 6 Outgoing Particles:\n", - " A: [-1.9479176369516882, 0.8861257045164052, 1.1018829783040076, 0.8916379636750793]\n", - " B: [-1.2433791528628988, 0.41365857789168176, 0.544699730060495, -0.27960776595565956]\n", - " B: [-1.074755543453127, 0.3002469943380598, 0.01041159782849033, 0.25464253219924826]\n", - " B: [-1.7453891507499704, 1.1576089006622574, 0.03134512003430503, -0.8398466551182168]\n", - " B: [-1.5208938996272057, 0.008686514238768405, -1.1440782944999142, -0.06424682441800389]\n", - " B: [-2.991685788469555, -2.7663266916471727, -0.544261131727384, 0.03742074961755215]\n", - "\n", - " Input for ABC Process: 'AB->ABBBBB':\n", - " 2 Incoming particles:\n", - " A: [4.439668869119513, 0.0, 0.0, 4.325582003318043]\n", - " B: [4.439668869119513, 0.0, 0.0, -4.325582003318043]\n", - " 6 Outgoing Particles:\n", - " A: [-1.1969832203303146, 0.48265768801558717, -0.02482335564392214, 0.4463117598342591]\n", - " B: [-1.7251727113760817, -1.0744400415092346, 0.6322269398265393, 0.6496834443295479]\n", - " B: [-1.419669052608684, -0.4173084301546306, -0.44626125418717505, -0.8013518491074973]\n", - " B: [-1.331289111993432, -0.7645577006899625, -0.3423664341778722, 0.2656453402118452]\n", - " B: [-1.5156451020746182, 0.6491857388484042, 0.8955487542892042, -0.2715333876518423]\n", - " B: [-1.6905785398558963, 1.1244627454898357, -0.7143246501067739, -0.2887553076163127]\n", + " A: [-1.110939233644008, -0.268184416567738, 0.24360224044987097, 0.3208131044822848]\n", + " B: [-2.6388927199644003, 0.8314814079287018, -0.21777668284358856, 2.2858186218857472]\n", + " B: [-3.473898607870094, 2.051862236379928, 2.4003392500206266, -1.046997796315806]\n", + " B: [-3.152819934613197, -1.9424358511984305, -2.028267056813039, -1.0263280422556738]\n", + " B: [-2.275152937944009, -1.7654922583464505, 0.7703768739716074, -0.6825521583027478]\n", + " B: [-1.8924280375266047, 1.0927688818039885, -1.1682746247854774, 0.14924627050619674]\n", "\n", " ⋮\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [5.750717080737416, 0.0, 0.0, 5.663104002460582]\n", - " B: [5.750717080737416, 0.0, 0.0, -5.663104002460582]\n", + " A: [6.22966038636724, 0.0, 0.0, 6.148875387375584]\n", + " B: [6.22966038636724, 0.0, 0.0, -6.148875387375584]\n", " 6 Outgoing Particles:\n", - " A: [-1.0362067302993534, 0.23737037129807034, 0.1316212944823847, 0.007451817649030921]\n", - " B: [-3.597917991072113, -1.5787159301449987, 0.28387609057144564, 3.0613860010767477]\n", - " B: [-1.0798303035395174, -0.06880694215947386, -0.2669312876106363, -0.3000779512850572]\n", - " B: [-1.3394551212059678, -0.7053379424304421, 0.44160810884651497, -0.3187799976376953]\n", - " B: [-3.270241523195321, 1.927780354010675, 0.003047457202140131, -2.4450221348130854]\n", - " B: [-1.1777824921625586, 0.1877100894261692, -0.5932216634918489, -0.004957734989940532]\n", + " A: [-1.4304429070664482, -0.33884344128192095, 0.8653360836289696, -0.42725343187224885]\n", + " B: [-1.9749814666096197, 1.3609392980219706, -0.9441991051819204, -0.39608593805462516]\n", + " B: [-2.2715747343865793, 1.2408591011012648, 1.6172984936557957, 0.06830847338590983]\n", + " B: [-1.661609068228756, -0.4012681871023404, -1.1964016761233542, 0.4105503221395213]\n", + " B: [-1.746963024762814, 1.345279186098992, -0.06451410595930414, 0.48779263162695097]\n", + " B: [-3.373749571680263, -3.2069659568379674, -0.2775196900201868, -0.1433120572255088]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [6.84577391627276, 0.0, 0.0, 6.772342320993563]\n", - " B: [6.84577391627276, 0.0, 0.0, -6.772342320993563]\n", + " A: [4.358722688789774, 0.0, 0.0, 4.242459602373458]\n", + " B: [4.358722688789774, 0.0, 0.0, -4.242459602373458]\n", " 6 Outgoing Particles:\n", - " A: [-1.0594956991232163, -0.09579189209396338, 0.21296650876679918, 0.2607687021353065]\n", - " B: [-1.8300488673592041, 0.8497425690197566, -0.8227483588311224, 0.9747315329664396]\n", - " B: [-2.860723394379955, 0.6743651794772785, 0.1320397309862766, 2.5906631300310776]\n", - " B: [-2.557528905485892, -1.3508678766931497, 1.2829278224554168, -1.4388211440218013]\n", - " B: [-3.790115184858299, 0.47588521284738383, -1.0334447791446917, -3.474262262286086]\n", - " B: [-1.5936357813389537, -0.553333192557306, 0.2282590757673212, 1.086920041175065]\n", + " A: [-1.0452779390743625, -0.2727572224505045, -0.0754336299872278, 0.11188938726967125]\n", + " B: [-1.7048247824379945, 0.4983084694471347, 0.872827621048126, 0.9467249611304639]\n", + " B: [-1.2899467751023526, 0.29644307338358544, -0.46128198344041976, -0.602746313628815]\n", + " B: [-2.1244189851466975, -1.8139000349895653, -0.4266469607437963, -0.20222526648433034]\n", + " B: [-1.4709803178987078, 1.0687795622551313, -0.1466043527374882, 0.0007118353293400601]\n", + " B: [-1.0819965779194327, 0.22312615235421782, 0.23713930586080637, -0.25435460361632983]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [6.25909007687458, 0.0, 0.0, 6.178689876537731]\n", - " B: [6.25909007687458, 0.0, 0.0, -6.178689876537731]\n", + " A: [4.946953336826144, 0.0, 0.0, 4.844826861378569]\n", + " B: [4.946953336826144, 0.0, 0.0, -4.844826861378569]\n", " 6 Outgoing Particles:\n", - " A: [-2.15208406752572, -0.27987613820502405, 0.20983197963180572, -1.873260718983155]\n", - " B: [-3.1436326945514232, -2.0821664144960677, -1.9679549582157083, 0.8210741885063981]\n", - " B: [-2.206056617746511, 1.7689323832663284, -0.4273996865759156, -0.7449117612507478]\n", - " B: [-1.8709609004510535, 0.5332842722412897, 1.48760475220818, -0.055988188078690854]\n", - " B: [-1.0916331546903268, 0.018218872767661307, 0.4300802089857822, 0.07976234031782706]\n", - " B: [-2.0538127187841235, 0.04160702442581186, 0.2678377039658561, 1.7733241394883685]\n", + " A: [-1.0798321354813016, -0.05701177676898147, 0.3748038410417432, -0.1493625751924078]\n", + " B: [-2.535607459805834, 0.2786802518140389, -2.1413493157456154, 0.8753659894167939]\n", + " B: [-1.1465622434125131, 0.048325266102822936, -0.30303094935893476, 0.46951239643469417]\n", + " B: [-1.0565850692648957, -0.15422821749644713, -0.2946016814579471, -0.0761282786060691]\n", + " B: [-1.3897397103611828, 0.8757386144485694, 0.40183039146109456, 0.054687093694094344]\n", + " B: [-2.6855800553265587, -0.9915041381000028, 1.96234771405966, -1.1740746257471053]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [6.8752382625158255, 0.0, 0.0, 6.802124753807565]\n", - " B: [6.8752382625158255, 0.0, 0.0, -6.802124753807565]\n", + " A: [5.263219273050624, 0.0, 0.0, 5.1673472029864165]\n", + " B: [5.263219273050624, 0.0, 0.0, -5.1673472029864165]\n", " 6 Outgoing Particles:\n", - " A: [-3.815955448364548, 1.7284392485789066, 3.22998101457395, -0.37581430702794955]\n", - " B: [-3.705003390432734, 0.8773209536576554, -3.1633610279519866, -1.3966048382509024]\n", - " B: [-1.4798429985544235, -0.876885056483666, -0.05155962504198175, 0.6467994303891397]\n", - " B: [-1.196598159149068, -0.6492448407423084, 0.0066213036625077295, -0.10141227532326653]\n", - " B: [-1.307725757451199, -0.47623875265044, -0.08939192779758245, -0.6894580410872709]\n", - " B: [-2.2453507710796776, -0.6033915523601473, 0.06771026255509205, 1.91649003130025]\n", + " A: [-2.399019535788919, -1.2110047848361276, -1.812263889139395, -0.06679625979229631]\n", + " B: [-2.017935306086244, -0.3374680394916718, 1.6282821358219384, 0.5539634536990483]\n", + " B: [-1.6695031594114513, 0.8270762338660977, -0.06260699981442713, 1.0484589005931164]\n", + " B: [-2.2597097606741916, 0.7611180237287621, 0.18055687193684328, -1.869327893238054]\n", + " B: [-1.073204850363539, -0.22248377596385552, 0.3188604064962904, -0.024447115284049005]\n", + " B: [-1.1070659337769053, 0.18276234269679548, -0.25282852530124955, 0.3581489140222342]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [6.591382068439754, 0.0, 0.0, 6.515083849970707]\n", - " B: [6.591382068439754, 0.0, 0.0, -6.515083849970707]\n", + " A: [4.459941032222146, 0.0, 0.0, 4.346386316343583]\n", + " B: [4.459941032222146, 0.0, 0.0, -4.346386316343583]\n", " 6 Outgoing Particles:\n", - " A: [-2.166341377746586, 0.738656605699622, 1.1097711420427974, -1.3841348908550482]\n", - " B: [-1.9136122405957643, -1.3687809690739081, -0.8052302154690981, 0.37410528752561706]\n", - " B: [-1.020282522629639, 0.01566959851558055, -0.04103060943002397, -0.1976040959992001]\n", - " B: [-3.3680104240574718, -0.44221430614525714, -3.1855463435158966, -0.015336796039828009]\n", - " B: [-1.1380460439601876, 0.33787512483866744, -0.3053034033656307, 0.2962752606648943]\n", - " B: [-3.576471527889859, 0.7187939461652956, 3.227339429737853, 0.9266952347035636]\n", + " A: [-1.9579957774892203, 0.01711251988645602, -0.9941971785148113, 1.3583175610150744]\n", + " B: [-2.2086526478827153, 0.26811947256465357, -0.29730202477347406, -1.9281778894844153]\n", + " B: [-1.1393295497986875, -0.09576318262839165, 0.3418914140864091, 0.4147426875441645]\n", + " B: [-1.5437833884502452, -0.2526758526831343, 1.1436052762387854, 0.10765238541055888]\n", + " B: [-1.029324601398587, -0.04086809209820055, -0.11666716588470447, -0.21030384327692128]\n", + " B: [-1.040796099424839, 0.10407513495861721, -0.07733032115220424, 0.25776909879153836]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [7.366791305680796, 0.0, 0.0, 7.298603574756898]\n", - " B: [7.366791305680796, 0.0, 0.0, -7.298603574756898]\n", + " A: [5.6127229037846575, 0.0, 0.0, 5.522921183094041]\n", + " B: [5.6127229037846575, 0.0, 0.0, -5.522921183094041]\n", " 6 Outgoing Particles:\n", - " A: [-1.1161936134323496, 0.1815174250263101, -0.30155987378038246, 0.34928677273057857]\n", - " B: [-1.1768168637671912, -0.488638136596838, -0.0387546058981897, 0.38030091090042567]\n", - " B: [-3.8756829146246745, -0.22123631639903027, -3.6727532274395425, -0.694878606198396]\n", - " B: [-1.4161987387916468, -0.42653096897021076, -0.26480462532703347, -0.8680833546784509]\n", - " B: [-3.4638938410201177, 2.8217659294852746, 1.2824429941168167, 1.179634497585545]\n", - " B: [-3.6847966397256138, -1.8668779325455054, 2.995429338328331, -0.346260220339702]\n", + " A: [-1.3401191006255044, 0.07455340773270878, 0.8329539127008466, 0.3107229836576332]\n", + " B: [-2.2407608326391446, 1.9616328357565815, 0.2748188274329855, 0.3122184153114968]\n", + " B: [-1.9353505325144305, 0.5041718248979296, 0.4986811623094062, -1.4975678792765024]\n", + " B: [-1.1665291383852119, -0.5919830552573446, -0.0003589073718047799, 0.10171609595055851]\n", + " B: [-1.3532183234755, -0.2764818233423043, 0.8493370095656062, 0.18271364627008788]\n", + " B: [-3.1894678799295257, -1.671893189787572, -2.45543200463704, 0.5901967380867258]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [4.762032860651893, 0.0, 0.0, 4.655851905497903]\n", - " B: [4.762032860651893, 0.0, 0.0, -4.655851905497903]\n", + " A: [4.8915558702989275, 0.0, 0.0, 4.788247991933574]\n", + " B: [4.8915558702989275, 0.0, 0.0, -4.788247991933574]\n", " 6 Outgoing Particles:\n", - " A: [-2.656166654414924, 2.017338594394486, -1.384735065574992, 0.2609120345236529]\n", - " B: [-1.031990140619295, -0.035004877965791346, -0.20112979442869375, 0.15272561883031827]\n", - " B: [-1.7319386082994335, -1.0359644740176492, 0.8025718625008718, -0.5312883934487891]\n", - " B: [-1.7450617894727098, -0.49163856285061436, 1.1666756465784553, 0.6651316473275205]\n", - " B: [-1.0945973465763637, -0.42438631366397905, -0.017047995524507212, 0.1332252744613839]\n", - " B: [-1.2643111819210613, -0.030344365896452122, -0.3663346535511349, -0.6807061816940867]\n", + " A: [-1.7166600698631052, -0.6792891539923208, 0.6748994636717233, 1.0148885429772172]\n", + " B: [-2.5106233942424825, -0.7525848308448442, -1.9630692909736174, 0.9397897950798489]\n", + " B: [-1.0591214238384126, 0.22224342472975844, 0.26723772059994233, -0.030496742226701214]\n", + " B: [-2.107615205886531, 1.2019506202258687, 1.111787687227206, -0.8725163042331971]\n", + " B: [-1.1276654384352531, 0.3419112314983172, -0.15371273194576066, -0.3620751950278375]\n", + " B: [-1.2614262083320695, -0.33423129161677956, 0.06285715142050609, -0.689590096569332]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [6.12211537837656, 0.0, 0.0, 6.039892110473065]\n", - " B: [6.12211537837656, 0.0, 0.0, -6.039892110473065]\n", + " A: [7.730105975946025, 0.0, 0.0, 7.665150905191394]\n", + " B: [7.730105975946025, 0.0, 0.0, -7.665150905191394]\n", " 6 Outgoing Particles:\n", - " A: [-2.09449973649211, -1.247911941781509, -0.776547530016726, 1.1075282684200622]\n", - " B: [-2.857971140758051, 1.4507115887866229, 2.2078617054725442, 0.43449006556414854]\n", - " B: [-2.068918524386865, -0.43350532192333185, 1.7407499017717505, -0.24957318745593]\n", - " B: [-1.0503370840395667, 0.28162676024293815, -0.11219953076948735, 0.10632790470480236]\n", - " B: [-1.6648953051752136, 0.3171875953909028, -1.2925202016854087, 0.025689195388605857]\n", - " B: [-2.5076089659013125, -0.36810868071562286, -1.7673443447726724, -1.4244622466216894]\n", + " A: [-1.5069861693238755, -0.14569717271308374, -1.0624243147247645, 0.3478997325070473]\n", + " B: [-1.3943234172777221, -0.04432112759455558, 0.08353004942916775, 0.9670554071303941]\n", + " B: [-2.959534510858716, -2.3414048211285614, 1.2349523309699664, 0.8669260203682391]\n", + " B: [-3.9504084752062516, -1.3395798731389539, -0.8585843373250325, -3.4747785282176675]\n", + " B: [-3.4956434330579116, 2.5236614743308494, -0.431975773525167, 2.1596418001942994]\n", + " B: [-2.153315946167574, 1.3473415202443053, 1.0345020451758309, -0.8667444319823133]\n", "\n", " Input for ABC Process: 'AB->ABBBBB':\n", " 2 Incoming particles:\n", - " A: [7.431058837653249, 0.0, 0.0, 7.363466265874004]\n", - " B: [7.431058837653249, 0.0, 0.0, -7.363466265874004]\n", + " A: [5.140973354732315, 0.0, 0.0, 5.042777710158126]\n", + " B: [5.140973354732315, 0.0, 0.0, -5.042777710158126]\n", " 6 Outgoing Particles:\n", - " A: [-1.4340725727125623, 0.9525417282027518, 0.38239995291064965, -0.05476016666222433]\n", - " B: [-3.5734117962040854, 2.3267511116139916, 2.49915109639257, -0.33127771922267657]\n", - " B: [-2.3529075757582945, 1.185265706342765, -1.375530715171772, 1.1132091075119688]\n", - " B: [-2.710381815585542, -2.1195780947035594, -1.2974231675570782, -0.4126153305389483]\n", - " B: [-2.374272199256637, -1.2400410368129877, 1.6839473809113144, -0.5136028830766439]\n", - " B: [-2.4170717157893766, -1.104939414642962, -1.8925445474856835, 0.1990469919885247]\n", - "\n", - " Input for ABC Process: 'AB->ABBBBB':\n", - " 2 Incoming particles:\n", - " A: [4.370360958267613, 0.0, 0.0, 4.254415930013168]\n", - " B: [4.370360958267613, 0.0, 0.0, -4.254415930013168]\n", - " 6 Outgoing Particles:\n", - " A: [-1.0037967551530176, -0.04979456910726583, -0.007092097585518878, 0.07126098999442977]\n", - " B: [-2.2427356029926337, 0.4432886498747459, -1.2315068062419472, -1.522087101319342]\n", - " B: [-1.576810353663218, -0.08400160217698217, 1.025238316808337, 0.6543401378482231]\n", - " B: [-1.1878570602356244, 0.3852696171578499, -0.47734716319323317, 0.18630996601909597]\n", - " B: [-1.6436772930583505, -1.0018521094453126, 0.4216069097815019, 0.7212593210074284]\n", - " B: [-1.0858448514323804, 0.3070900136969648, 0.26910084043086047, -0.11108331354983517]\n", - "\n", - " Input for ABC Process: 'AB->ABBBBB':\n", - " 2 Incoming particles:\n", - " A: [5.940760429560125, 0.0, 0.0, 5.855991332082674]\n", - " B: [5.940760429560125, 0.0, 0.0, -5.855991332082674]\n", - " 6 Outgoing Particles:\n", - " A: [-2.5515863925730233, 0.0574036477190863, 1.9321385747234918, 1.3319678930281418]\n", - " B: [-3.2707523737124977, -2.710802011299676, -1.41016923110446, -0.6006632045712658]\n", - " B: [-1.6965910302662786, 0.9846458960035911, 0.9504416414719069, -0.07452697242920955]\n", - " B: [-1.0283520810617242, 0.1620200166783027, 0.15874691422324994, -0.07782630689000514]\n", - " B: [-1.277724475991329, 0.26836143674120055, -0.33222621981983513, -0.6709602929248032]\n", - " B: [-2.0565145055153993, 1.2383710141574962, -1.298931679494354, 0.09200888378714224]\n", - "\n", - " Input for ABC Process: 'AB->ABBBBB':\n", - " 2 Incoming particles:\n", - " A: [6.732994664701373, 0.0, 0.0, 6.65831939417877]\n", - " B: [6.732994664701373, 0.0, 0.0, -6.65831939417877]\n", - " 6 Outgoing Particles:\n", - " A: [-1.602557260532173, -0.06659157948757613, 0.9308846463293637, -0.8349904850080558]\n", - " B: [-1.3205375883536927, 0.7078592481114431, -0.05631226213188625, -0.48947291677035515]\n", - " B: [-1.7625153098951976, 0.12706601232750347, 0.34097061443470383, 1.405010137407617]\n", - " B: [-2.7792473938949334, 1.6510422215054068, 1.7155538904747691, -1.0272051928194055]\n", - " B: [-2.722083339444658, -0.5204063912580275, -2.061236049180356, -1.3748530264647703]\n", - " B: [-3.279048437282091, -1.89896951119875, -0.8698608399265956, 2.3215114836549695]\n" + " A: [-2.1212395395513415, 0.5721186152245487, -1.464674439391297, 1.013442776314144]\n", + " B: [-1.4152359585953729, 0.6568206137784666, 0.5137348552056548, -0.5545773150462135]\n", + " B: [-1.6621060291271548, -0.07490000906447869, -1.013680695206552, 0.8540713605247167]\n", + " B: [-1.602034710373159, -1.201656230753467, -0.11487974312683813, 0.3306662379967043]\n", + " B: [-1.6826459861655199, -0.324056691191041, 0.7444127790391002, -1.082651555236741]\n", + " B: [-1.7986844856520843, 0.3716737020059716, 1.3350872434799315, -0.5609515045526104]\n" ] }, - "execution_count": 10, "metadata": {}, - "output_type": "execute_result" + "output_type": "display_data" } ], "source": [ @@ -459,149 +375,26 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 17, "metadata": {}, "outputs": [ { - "name": "stderr", - "output_type": "stream", - "text": [ - "Internal error: stack overflow in type inference of materialize(Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{1}, Nothing, typeof(MetagraphOptimization.compute__bad8f2ac_7bfc_11ee_176b_b72dc8919aad), Tuple{Array{MetagraphOptimization.ABCProcessInput, 1}}}).\n", - "This might be caused by recursion over very long tuples or argument lists.\n" - ] - }, - { - "ename": "LoadError", - "evalue": "StackOverflowError:", - "output_type": "error", - "traceback": [ - "StackOverflowError:", - "", - "Stacktrace:", - " [1] argtypes_to_type", - " @ ./compiler/typeutils.jl:71 [inlined]", - " [2] abstract_call_known(interp::Core.Compiler.NativeInterpreter, f::Any, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1948", - " [3] abstract_call(interp::Core.Compiler.NativeInterpreter, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2020", - " [4] abstract_apply(interp::Core.Compiler.NativeInterpreter, argtypes::Vector{Any}, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1566", - " [5] abstract_call_known(interp::Core.Compiler.NativeInterpreter, f::Any, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1855", - " [6] abstract_call(interp::Core.Compiler.NativeInterpreter, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Nothing)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2020", - " [7] abstract_call(interp::Core.Compiler.NativeInterpreter, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1999", - " [8] abstract_eval_statement_expr(interp::Core.Compiler.NativeInterpreter, e::Expr, vtypes::Vector{Core.Compiler.VarState}, sv::Core.Compiler.InferenceState, mi::Nothing)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2183", - " [9] abstract_eval_statement(interp::Core.Compiler.NativeInterpreter, e::Any, vtypes::Vector{Core.Compiler.VarState}, sv::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2396", - " [10] abstract_eval_basic_statement(interp::Core.Compiler.NativeInterpreter, stmt::Any, pc_vartable::Vector{Core.Compiler.VarState}, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2682", - " [11] typeinf_local(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2867", - " [12] typeinf_nocycle(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2955", - " [13] _typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/typeinfer.jl:246", - " [14] typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/typeinfer.jl:216", - " [15] typeinf_edge(interp::Core.Compiler.NativeInterpreter, method::Method, atype::Any, sparams::Core.SimpleVector, caller::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/typeinfer.jl:932", - " [16] abstract_call_method(interp::Core.Compiler.NativeInterpreter, method::Method, sig::Any, sparams::Core.SimpleVector, hardlimit::Bool, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:611", - " [17] abstract_call_gf_by_type(interp::Core.Compiler.NativeInterpreter, f::Any, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, atype::Any, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:152", - " [18] abstract_call_known(interp::Core.Compiler.NativeInterpreter, f::Any, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1949", - "--- the last 16 lines are repeated 413 more times ---", - " [6627] abstract_call(interp::Core.Compiler.NativeInterpreter, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2020", - " [6628] abstract_apply(interp::Core.Compiler.NativeInterpreter, argtypes::Vector{Any}, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1566", - " [6629] abstract_call_known(interp::Core.Compiler.NativeInterpreter, f::Any, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1855", - " [6630] abstract_call(interp::Core.Compiler.NativeInterpreter, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Nothing)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2020", - " [6631] abstract_call(interp::Core.Compiler.NativeInterpreter, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1999", - " [6632] abstract_eval_statement_expr(interp::Core.Compiler.NativeInterpreter, e::Expr, vtypes::Vector{Core.Compiler.VarState}, sv::Core.Compiler.InferenceState, mi::Nothing)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2183", - " [6633] abstract_eval_statement(interp::Core.Compiler.NativeInterpreter, e::Any, vtypes::Vector{Core.Compiler.VarState}, sv::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2396", - " [6634] abstract_eval_basic_statement(interp::Core.Compiler.NativeInterpreter, stmt::Any, pc_vartable::Vector{Core.Compiler.VarState}, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2658", - " [6635] typeinf_local(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2867", - " [6636] typeinf_nocycle(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2955", - " [6637] _typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/typeinfer.jl:246", - " [6638] typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/typeinfer.jl:216", - " [6639] typeinf_edge(interp::Core.Compiler.NativeInterpreter, method::Method, atype::Any, sparams::Core.SimpleVector, caller::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/typeinfer.jl:932", - " [6640] abstract_call_method(interp::Core.Compiler.NativeInterpreter, method::Method, sig::Any, sparams::Core.SimpleVector, hardlimit::Bool, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:611", - " [6641] abstract_call_gf_by_type(interp::Core.Compiler.NativeInterpreter, f::Any, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, atype::Any, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:152", - " [6642] abstract_call_known(interp::Core.Compiler.NativeInterpreter, f::Any, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Int64)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1949", - " [6643] abstract_call(interp::Core.Compiler.NativeInterpreter, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState, max_methods::Nothing)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2020", - " [6644] abstract_call(interp::Core.Compiler.NativeInterpreter, arginfo::Core.Compiler.ArgInfo, si::Core.Compiler.StmtInfo, sv::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:1999", - " [6645] abstract_eval_statement_expr(interp::Core.Compiler.NativeInterpreter, e::Expr, vtypes::Vector{Core.Compiler.VarState}, sv::Core.Compiler.InferenceState, mi::Nothing)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2183", - " [6646] abstract_eval_statement(interp::Core.Compiler.NativeInterpreter, e::Any, vtypes::Vector{Core.Compiler.VarState}, sv::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2396", - " [6647] abstract_eval_basic_statement(interp::Core.Compiler.NativeInterpreter, stmt::Any, pc_vartable::Vector{Core.Compiler.VarState}, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2682", - " [6648] typeinf_local(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2867", - " [6649] typeinf_nocycle(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/abstractinterpretation.jl:2955", - " [6650] _typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/typeinfer.jl:246", - " [6651] typeinf(interp::Core.Compiler.NativeInterpreter, frame::Core.Compiler.InferenceState)", - " @ Core.Compiler ./compiler/typeinfer.jl:216", - " [6652] typeinf", - " @ ./compiler/typeinfer.jl:12 [inlined]", - " [6653] typeinf_type(interp::Core.Compiler.NativeInterpreter, method::Method, atype::Any, sparams::Core.SimpleVector)", - " @ Core.Compiler ./compiler/typeinfer.jl:1079", - " [6654] return_type(interp::Core.Compiler.NativeInterpreter, t::DataType)", - " @ Core.Compiler ./compiler/typeinfer.jl:1140", - " [6655] return_type(f::Any, t::DataType)", - " @ Core.Compiler ./compiler/typeinfer.jl:1112", - " [6656] combine_eltypes(f::Function, args::Tuple{Vector{ABCProcessInput}})", - " @ Base.Broadcast ./broadcast.jl:730", - " [6657] copy(bc::Base.Broadcast.Broadcasted{Style}) where Style", - " @ Base.Broadcast ./broadcast.jl:895", - " [6658] materialize(bc::Base.Broadcast.Broadcasted)", - " @ Base.Broadcast ./broadcast.jl:873", - " [6659] var\"##core#302\"()", - " @ Main ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:489", - " [6660] var\"##sample#303\"(::Tuple{}, __params::BenchmarkTools.Parameters)", - " @ Main ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:495", - " [6661] _run(b::BenchmarkTools.Benchmark, p::BenchmarkTools.Parameters; verbose::Bool, pad::String, kwargs::Base.Pairs{Symbol, Integer, NTuple{4, Symbol}, NamedTuple{(:samples, :evals, :gctrial, :gcsample), Tuple{Int64, Int64, Bool, Bool}}})", - " @ BenchmarkTools ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:99", - " [6662] #invokelatest#2", - " @ ./essentials.jl:821 [inlined]", - " [6663] invokelatest", - " @ ./essentials.jl:816 [inlined]", - " [6664] #run_result#45", - " @ ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:34 [inlined]", - " [6665] run_result", - " @ ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:34 [inlined]", - " [6666] run(b::BenchmarkTools.Benchmark, p::BenchmarkTools.Parameters; progressid::Nothing, nleaves::Float64, ndone::Float64, kwargs::Base.Pairs{Symbol, Integer, NTuple{5, Symbol}, NamedTuple{(:verbose, :samples, :evals, :gctrial, :gcsample), Tuple{Bool, Int64, Int64, Bool, Bool}}})", - " @ BenchmarkTools ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:117", - " [6667] run (repeats 2 times)", - " @ ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:117 [inlined]", - " [6668] #warmup#54", - " @ ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:169 [inlined]", - " [6669] warmup(item::BenchmarkTools.Benchmark)", - " @ BenchmarkTools ~/.julia/packages/BenchmarkTools/0owsb/src/execution.jl:168" - ] + "data": { + "text/plain": [ + "BenchmarkTools.Trial: 231 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m18.197 ms\u001b[22m\u001b[39m … \u001b[35m27.498 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 8.36%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m21.868 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m21.644 ms\u001b[22m\u001b[39m ± \u001b[32m 1.609 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m1.21% ± 2.71%\n", + "\n", + " \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m▃\u001b[34m█\u001b[39m\u001b[39m▁\u001b[39m \u001b[39m▅\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m▃\u001b[39m▃\u001b[39m▁\u001b[39m▅\u001b[39m▇\u001b[39m▃\u001b[39m▅\u001b[39m▅\u001b[39m▅\u001b[39m▃\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▅\u001b[39m▄\u001b[39m▅\u001b[39m▃\u001b[39m▅\u001b[39m▄\u001b[39m▃\u001b[39m▅\u001b[39m▄\u001b[39m▃\u001b[39m▅\u001b[39m▇\u001b[39m▅\u001b[39m▅\u001b[32m▆\u001b[39m\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▆\u001b[39m▇\u001b[39m▄\u001b[39m▅\u001b[39m▄\u001b[39m▅\u001b[39m▅\u001b[39m▄\u001b[39m▃\u001b[39m▅\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▄\u001b[39m▁\u001b[39m▄\u001b[39m▁\u001b[39m▃\u001b[39m▃\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m \u001b[39m▃\n", + " 18.2 ms\u001b[90m Histogram: frequency by time\u001b[39m 25.6 ms \u001b[0m\u001b[1m<\u001b[22m\n", + "\n", + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m6.78 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m17003\u001b[39m." + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ @@ -612,7 +405,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [] @@ -620,7 +413,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Julia 1.9.3", + "display_name": "Julia 1.9.4", "language": "julia", "name": "julia-1.9" }, @@ -628,7 +421,7 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.9.3" + "version": "1.9.4" } }, "nbformat": 4, diff --git a/notebooks/diagram_gen.ipynb b/notebooks/diagram_gen.ipynb index ede40b3..66d8c90 100644 --- a/notebooks/diagram_gen.ipynb +++ b/notebooks/diagram_gen.ipynb @@ -15,390 +15,25 @@ "metadata": {}, "outputs": [], "source": [ - "QEDParticleTypeIn = Union{Type{FermionStateful{Incoming}},Type{AntiFermionStateful{Incoming}},Type{PhotonStateful{Incoming}}};\n", - "QEDParticleTypeOut = Union{Type{FermionStateful{Outgoing}}, Type{AntiFermionStateful{Outgoing}},Type{PhotonStateful{Outgoing}}};\n", - "\n", - "PhotonTypes = Type{PhotonStateful}\n", - "FermionTypes = Union{Type{FermionStateful{Incoming}},Type{AntiFermionStateful{Outgoing}}};\n", - "AntifermionTypes = Union{Type{FermionStateful{Outgoing}},Type{AntiFermionStateful{Incoming}}};\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Feynman Diagram Generation\n", - "Data structure: Ve\n", - "\n" + "import MetagraphOptimization.gen_diagrams" ] }, { "cell_type": "code", - "execution_count": 83, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "gen_diagrams (generic function with 1 method)" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "import MetagraphOptimization.QEDParticle\n", - "import MetagraphOptimization.caninteract\n", - "import MetagraphOptimization.interaction_result\n", - "import MetagraphOptimization.propagation_result\n", - "import MetagraphOptimization.direction\n", - "\n", - "import Base.copy\n", - "import Base.hash\n", - "import Base.==\n", - "import Base.show\n", - "\n", - "struct FeynmanParticle\n", - " particle::Type{<:QEDParticle}\n", - " id::Int\n", - "end\n", - "\n", - "show(io::IO, p::FeynmanParticle) = print(io, \"$(String(p.particle))_$(String(direction(p.particle)))_$(p.id)\")\n", - "\n", - "struct FeynmanVertex\n", - " in1::FeynmanParticle\n", - " in2::FeynmanParticle\n", - " out::FeynmanParticle\n", - "end\n", - "\n", - "show(io::IO, v::FeynmanVertex) = print(io, \"$(v.in1) + $(v.in2) -> $(v.out)\")\n", - "\n", - "function Base.hash(v::FeynmanVertex)\n", - " return hash(Set{FeynmanParticle}([v.in1, v.in2]))\n", - "end\n", - "\n", - "function ==(v1::FeynmanVertex, v2::FeynmanVertex)\n", - " return Set{FeynmanParticle}([v1.in1, v1.in2]) == Set{FeynmanParticle}([v2.in1, v2.in2])\n", - "end\n", - "\n", - "struct FeynmanTie\n", - " in1::FeynmanParticle\n", - " in2::FeynmanParticle\n", - "end\n", - "\n", - "show(io::IO, t::FeynmanTie) = print(io, \"$(t.in1) -- $(t.in2)\")\n", - "\n", - "function Base.hash(t::FeynmanTie)\n", - " return hash(Set{FeynmanParticle}([t.in1, t.in2]))\n", - "end\n", - "\n", - "function ==(t1::FeynmanTie, t2::FeynmanTie)\n", - " return Set{FeynmanParticle}([t1.in1, t1.in2]) == Set{FeynmanParticle}([t2.in1, t2.in2])\n", - "end\n", - "\n", - "struct FeynmanDiagram\n", - " vertices::Vector{Set{FeynmanVertex}}\n", - " ties::Vector{Set{FeynmanTie}}\n", - " particles::Vector{FeynmanParticle}\n", - "end\n", - "\n", - "function FeynmanDiagram(pd::QEDProcessDescription)\n", - " parts = Vector{FeynmanParticle}()\n", - " for (type, n) in pd.inParticles\n", - " for i in 1:n\n", - " push!(parts, FeynmanParticle(type, i))\n", - " end\n", - " end\n", - " for (type, n) in pd.outParticles\n", - " for i in 1:n\n", - " push!(parts, FeynmanParticle(type, i))\n", - " end\n", - " end\n", - " return FeynmanDiagram([], [], parts)\n", - "end\n", - "\n", - "function ==(d1::FeynmanDiagram, d2::FeynmanDiagram)\n", - " return d1.vertices == d2.vertices && d1.ties == d2.ties && d1.particles == d2.particles\n", - "end\n", - "\n", - "function Base.hash(d::FeynmanDiagram)\n", - " return hash((d.vertices, d.ties, d.particles))\n", - "end\n", - "\n", - "function show(io::IO, d::FeynmanDiagram)\n", - " print(io, \"Initial Particles: [\")\n", - " first = true\n", - " for p in d.particles\n", - " if first\n", - " first = false\n", - " print(io, \"$p\")\n", - " else\n", - " print(io, \", $p\")\n", - " end\n", - " end\n", - " print(io, \"]\\n\")\n", - " for l in eachindex(d.vertices)\n", - " print(io, \"Virtuality Level $l:\\n\")\n", - " print(io, \" Vertices: [\")\n", - " first = true\n", - " for v in d.vertices[l]\n", - " if first\n", - " first = false\n", - " print(io, \"$v\")\n", - " else\n", - " print(io, \", $v\")\n", - " end\n", - " end\n", - " print(io, \"]\\n Ties: [\")\n", - " first = true\n", - " for t in d.ties[l]\n", - " if first\n", - " first = false\n", - " print(io, \"$t\")\n", - " else\n", - " print(io, \", $t\")\n", - " end\n", - " end\n", - " print(io, \"]\\n\")\n", - " end\n", - "end\n", - "\n", - "copy(fd::FeynmanDiagram) = FeynmanDiagram(deepcopy(fd.vertices), deepcopy(fd.ties), deepcopy(fd.particles))\n", - "\n", - "function id_for_type(d::FeynmanDiagram, t::Type{<:QEDParticle})\n", - " id = 1\n", - " for l in 0:length(d.vertices)\n", - " particles = get_particles(d, l)\n", - " for p in particles\n", - " if (p.particle <: t)\n", - " id = max(id, p.id + 1)\n", - " end\n", - " end\n", - " end\n", - " return id\n", - "end\n", - "\n", - "function can_apply_vertex(particles::Vector{FeynmanParticle}, vertex::FeynmanVertex)\n", - " return vertex.in1 in particles && vertex.in2 in particles && !(vertex.out in particles)\n", - "end\n", - "\n", - "function apply_vertex!(particles::Vector{FeynmanParticle}, vertex::FeynmanVertex)\n", - " @assert can_apply_vertex(particles, vertex)\n", - " length_before = length(particles)\n", - " filter!(x -> x != vertex.in1 && x != vertex.in2, particles)\n", - " push!(particles, vertex.out)\n", - " @assert length(particles) == length_before - 1\n", - " return nothing\n", - "end\n", - "\n", - "function can_apply_tie(particles::Vector{FeynmanParticle}, tie::FeynmanTie)\n", - " return tie.in1 in particles && tie.in2 in particles\n", - "end\n", - "\n", - "function apply_tie!(particles::Vector{FeynmanParticle}, tie::FeynmanTie)\n", - " @assert can_apply_tie(particles, tie)\n", - " @assert can_tie(tie.in1.particle, tie.in2.particle)\n", - " length_before = length(particles)\n", - " filter!(x -> x != tie.in1 && x != tie.in2, particles)\n", - " @assert length(particles) == length_before - 2\n", - " return nothing\n", - "end\n", - "\n", - "function get_particles(fd::FeynmanDiagram, level::Int = -1)\n", - " if level == -1\n", - " level = length(fd.vertices)\n", - " end\n", - "\n", - " working_particles = copy(fd.particles)\n", - " for l in 1:length(fd.vertices)\n", - " if l > level\n", - " break\n", - " end\n", - " for v in fd.vertices[l]\n", - " apply_vertex!(working_particles, v)\n", - " end\n", - " for t in fd.ties[l]\n", - " apply_tie!(working_particles, t)\n", - " end\n", - " end\n", - "\n", - " return working_particles\n", - "end\n", - "\n", - "function add_vertex!(fd::FeynmanDiagram, vertex::FeynmanVertex)\n", - " for i in eachindex(fd.vertices)\n", - " if (can_apply_vertex(get_particles(fd, i - 1), vertex))\n", - " push!(fd.vertices[i], vertex)\n", - " return nothing\n", - " end\n", - " end\n", - "\n", - " if !can_apply_vertex(get_particles(fd), vertex)\n", - " @assert false \"Can't add vertex $vertex to diagram\"\n", - " end\n", - "\n", - " push!(fd.vertices, Set{FeynmanVertex}())\n", - " push!(fd.vertices[end], vertex)\n", - " push!(fd.ties, Set{FeynmanTie}())\n", - " return nothing\n", - "end\n", - "\n", - "function add_vertex(fd::FeynmanDiagram, vertex::FeynmanVertex)\n", - " newfd = copy(fd)\n", - " add_vertex!(newfd, vertex)\n", - " return newfd\n", - "end\n", - "\n", - "function add_tie!(fd::FeynmanDiagram, tie::FeynmanTie)\n", - " for i in eachindex(fd.ties)\n", - " if (can_apply_tie(get_particles(fd, i - 1), tie))\n", - " push!(fd.ties[i], tie)\n", - " return nothing\n", - " end\n", - " end\n", - "\n", - " if !can_apply_tie(get_particles(fd), tie)\n", - " @assert false \"Can't add tie $tie to diagram\"\n", - " end\n", - "\n", - " push!(fd.ties, Set{FeynmanTie}())\n", - " push!(fd.ties[end], tie)\n", - " push!(fd.vertices, Set{FeynmanVertex}())\n", - " return nothing\n", - "end\n", - "\n", - "function add_tie(fd::FeynmanDiagram, tie::FeynmanTie)\n", - " newfd = copy(fd)\n", - " add_tie!(newfd, tie)\n", - " return newfd\n", - "end\n", - "\n", - "# whether the diagram is connected and fully constructed\n", - "function isvalid(fd::FeynmanDiagram)\n", - " @assert length(fd.vertices) == length(fd.ties)\n", - "\n", - " if get_particles(fd) != []\n", - " return false\n", - " end\n", - "\n", - " return true\n", - "end\n", - "\n", - "\n", - "function possible_vertices(fd::FeynmanDiagram)\n", - " possibilities = Vector{FeynmanVertex}()\n", - " \n", - " particles = get_particles(fd)\n", - " for i in 1:length(particles)\n", - " for j in i+1:length(particles)\n", - " p1 = particles[i]\n", - " p2 = particles[j]\n", - " if (caninteract(p1.particle, p2.particle))\n", - " interaction_res = propagation_result(interaction_result(p1.particle, p2.particle))\n", - " v = FeynmanVertex(p1, p2, FeynmanParticle(interaction_res, id_for_type(fd, interaction_res)))\n", - " @assert !(v.out in particles) \"$v is in $fd\"\n", - " @assert can_apply_vertex(particles, v)\n", - " push!(possibilities, v)\n", - " end\n", - " end\n", - " end\n", - "\n", - " if (length(possibilities) == 0)\n", - " #println(\"No vertices found for $particles\")\n", - " end\n", - "\n", - " return possibilities\n", - "end\n", - "\n", - "function can_tie(p1::Type, p2::Type)\n", - " if p1 == propagation_result(p2)\n", - " return true\n", - " end\n", - " if (p1 <: PhotonStateful && p2 <: PhotonStateful)\n", - " return true\n", - " end\n", - " return false\n", - "end\n", - "\n", - "function possible_ties(fd::FeynmanDiagram)\n", - " possibilities = Vector{FeynmanTie}()\n", - "\n", - " particles = get_particles(fd)\n", - "\n", - " for i in 1:length(particles)\n", - " p1 = particles[i]\n", - " if p1 in fd.particles\n", - " continue\n", - " end\n", - " for j in i+1:length(particles)\n", - " p2 = particles[j]\n", - " if p2 in fd.particles\n", - " continue\n", - " end\n", - " if (can_tie(p1.particle, p2.particle))\n", - " t = FeynmanTie(p1, p2)\n", - " @assert can_apply_tie(particles, t)\n", - " push!(possibilities, t)\n", - " end\n", - " end\n", - " end\n", - " \n", - " return possibilities\n", - "end\n", - "\n", - "function gen_diagrams(fd::FeynmanDiagram)\n", - " working = Deque{FeynmanDiagram}()\n", - " results = Set{FeynmanDiagram}()\n", - "\n", - " push!(working, fd)\n", - "\n", - " while !isempty(working)\n", - " d = pop!(working)\n", - " if (isvalid(d))\n", - " push!(results, d)\n", - " continue\n", - " end\n", - "\n", - " possibilities = possible_vertices(d)\n", - " for v in possibilities\n", - " newfd = add_vertex(d, v)\n", - " push!(working, newfd)\n", - " end\n", - " possibilities = possible_ties(d)\n", - " for t in possibilities\n", - " push!(working, add_tie(d, t))\n", - " end\n", - " end\n", - "\n", - " return results\n", - "end\n" - ] - }, - { - "cell_type": "code", - "execution_count": 84, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Diagram 1: Initial Particles: [k_in_1, e_in_1, e_out_1, k_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [e_out_1 + k_out_1 -> e_out_2, k_in_1 + e_in_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [e_out_2 -- e_in_2]\n", + "Diagram 1: Initial Particles: [k_in_1, e_in_1, k_out_1, e_out_1]\n", + " Virtuality Level 1 Vertices: [k_out_1 + e_out_1 -> e_out_2, k_in_1 + e_in_1 -> e_in_2]\n", + " Tie: e_out_2 -- e_in_2\n", "\n", - "Diagram 2: Initial Particles: [k_in_1, e_in_1, e_out_1, k_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_1 -> e_out_2, e_in_1 + k_out_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [e_out_2 -- e_in_2]\n", + "Diagram 2: Initial Particles: [k_in_1, e_in_1, k_out_1, e_out_1]\n", + " Virtuality Level 1 Vertices: [k_in_1 + e_out_1 -> e_out_2, e_in_1 + k_out_1 -> e_in_2]\n", + " Tie: e_out_2 -- e_in_2\n", "\n" ] } @@ -418,22 +53,22 @@ }, { "cell_type": "code", - "execution_count": 101, + "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "BenchmarkTools.Trial: 1354 samples with 1 evaluation.\n", - " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m3.042 ms\u001b[22m\u001b[39m … \u001b[35m 6.234 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 34.23%\n", - " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m3.667 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", - " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m3.692 ms\u001b[22m\u001b[39m ± \u001b[32m577.114 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m2.87% ± 7.97%\n", + "BenchmarkTools.Trial: 3077 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m1.461 ms\u001b[22m\u001b[39m … \u001b[35m 3.180 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 47.86%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m1.557 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m1.624 ms\u001b[22m\u001b[39m ± \u001b[32m275.482 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m3.59% ± 9.19%\n", "\n", - " \u001b[39m▂\u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▂\u001b[39m▅\u001b[39m▂\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", - " \u001b[39m█\u001b[39m█\u001b[39m▅\u001b[39m▄\u001b[39m▆\u001b[39m▇\u001b[39m▅\u001b[39m▄\u001b[39m▄\u001b[39m▅\u001b[39m▄\u001b[39m▄\u001b[39m▅\u001b[39m▄\u001b[34m▄\u001b[39m\u001b[39m▅\u001b[39m▄\u001b[39m▅\u001b[39m▆\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▅\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▁\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▂\u001b[39m▃\u001b[39m▃\u001b[39m▂\u001b[39m▂\u001b[39m \u001b[39m▃\n", - " 3.04 ms\u001b[90m Histogram: frequency by time\u001b[39m 5.72 ms \u001b[0m\u001b[1m<\u001b[22m\n", + " \u001b[39m▃\u001b[39m▅\u001b[39m▇\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m▇\u001b[39m▄\u001b[32m▃\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\n", + " \u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[32m█\u001b[39m\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▅\u001b[39m▃\u001b[39m▄\u001b[39m▅\u001b[39m▃\u001b[39m▄\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▅\u001b[39m▆\u001b[39m▅\u001b[39m▅\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▄\u001b[39m▃\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▄\u001b[39m▅\u001b[39m▆\u001b[39m▇\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▇\u001b[39m▇\u001b[39m \u001b[39m█\n", + " 1.46 ms\u001b[90m \u001b[39m\u001b[90mHistogram: \u001b[39m\u001b[90m\u001b[1mlog(\u001b[22m\u001b[39m\u001b[90mfrequency\u001b[39m\u001b[90m\u001b[1m)\u001b[22m\u001b[39m\u001b[90m by time\u001b[39m 2.85 ms \u001b[0m\u001b[1m<\u001b[22m\n", "\n", - " Memory estimate\u001b[90m: \u001b[39m\u001b[33m2.54 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m24047\u001b[39m." + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m2.16 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m18208\u001b[39m." ] }, "metadata": {}, @@ -443,25 +78,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "Initial Diagram: Initial Particles: [k_in_1, k_in_2, e_in_1, e_out_1, k_out_1]\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 12 Diagrams for 2-Photon Compton\n", - "Diagram 1: Initial Particles: [k_in_1, k_in_2, e_in_1, e_out_1, k_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_2 + e_in_1 -> e_in_2, e_out_1 + k_out_1 -> e_out_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [k_in_1 + e_in_2 -> e_in_3]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_out_2 -- e_in_3]\n", + "Found 6 Diagrams for 2-Photon Compton\n", + "Diagram 1: Initial Particles: [k_in_1, k_in_2, e_in_1, k_out_1, e_out_1]\n", + " Virtuality Level 1 Vertices: [k_in_1 + e_in_1 -> e_in_2, k_out_1 + e_out_1 -> e_out_2]\n", + " Virtuality Level 2 Vertices: [k_in_2 + e_in_2 -> e_in_3]\n", + " Tie: e_out_2 -- e_in_3\n", "\n" ] } @@ -479,22 +100,22 @@ }, { "cell_type": "code", - "execution_count": 100, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "BenchmarkTools.Trial: 124 samples with 1 evaluation.\n", - " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m35.054 ms\u001b[22m\u001b[39m … \u001b[35m48.433 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 5.92%\n", - " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m40.638 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m3.66%\n", - " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m40.457 ms\u001b[22m\u001b[39m ± \u001b[32m 2.120 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m3.49% ± 2.97%\n", + "BenchmarkTools.Trial: 500 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m 9.130 ms\u001b[22m\u001b[39m … \u001b[35m 16.858 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m0.00% … 11.40%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m 9.611 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m0.00%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m10.018 ms\u001b[22m\u001b[39m ± \u001b[32m802.928 μs\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m4.38% ± 5.79%\n", "\n", - " \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▄\u001b[39m \u001b[39m▅\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▁\u001b[32m▁\u001b[39m\u001b[34m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m▄\u001b[39m█\u001b[39m█\u001b[39m▄\u001b[39m▅\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", - " \u001b[39m▃\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▅\u001b[39m▆\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▆\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▆\u001b[39m▅\u001b[39m▆\u001b[39m▆\u001b[39m▆\u001b[39m█\u001b[39m▃\u001b[39m█\u001b[39m▆\u001b[39m▁\u001b[39m▅\u001b[39m█\u001b[39m█\u001b[32m█\u001b[39m\u001b[34m▅\u001b[39m\u001b[39m▆\u001b[39m▅\u001b[39m▃\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m▃\u001b[39m▆\u001b[39m▅\u001b[39m▅\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▃\u001b[39m \u001b[39m▃\n", - " 35.1 ms\u001b[90m Histogram: frequency by time\u001b[39m 45.9 ms \u001b[0m\u001b[1m<\u001b[22m\n", + " \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m▂\u001b[39m▅\u001b[39m█\u001b[39m▃\u001b[34m▂\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m▄\u001b[39m▃\u001b[39m▅\u001b[39m█\u001b[39m▇\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m█\u001b[39m▆\u001b[39m▅\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[32m▁\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m▃\u001b[39m▂\u001b[39m▁\u001b[39m▃\u001b[39m▃\u001b[39m▄\u001b[39m▃\u001b[39m▅\u001b[39m█\u001b[39m▅\u001b[39m▅\u001b[39m▆\u001b[39m▅\u001b[39m▆\u001b[39m▅\u001b[39m▄\u001b[39m▄\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▃\u001b[39m▁\u001b[39m▂\u001b[39m▃\u001b[39m▃\u001b[39m▁\u001b[39m▃\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▂\u001b[39m \u001b[39m▃\n", + " 9.13 ms\u001b[90m Histogram: frequency by time\u001b[39m 12 ms \u001b[0m\u001b[1m<\u001b[22m\n", "\n", - " Memory estimate\u001b[90m: \u001b[39m\u001b[33m26.97 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m262392\u001b[39m." + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m14.19 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m117375\u001b[39m." ] }, "metadata": {}, @@ -504,28 +125,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "Initial Diagram: Initial Particles: [k_in_1, k_in_2, e_in_1, e_out_1, k_out_1]\n", - "\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Found 72 Diagrams for 3-Photon Compton\n", - "Diagram 1: Initial Particles: [k_in_1, k_in_2, k_in_3, e_in_1, e_out_1, k_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_2 + e_out_1 -> e_out_2, k_in_3 + e_in_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [k_out_1 + e_in_2 -> e_in_3]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: [k_in_1 + e_in_3 -> e_in_4]\n", - " Ties: []\n", - "Virtuality Level 4:\n", - " Vertices: []\n", - " Ties: [e_out_2 -- e_in_4]\n", + "Found 24 Diagrams for 3-Photon Compton\n", + "Diagram 1: Initial Particles: [k_in_1, k_in_2, k_in_3, e_in_1, k_out_1, e_out_1]\n", + " Virtuality Level 1 Vertices: [k_in_1 + e_in_1 -> e_in_2, k_in_2 + e_out_1 -> e_out_2]\n", + " Virtuality Level 2 Vertices: [k_in_3 + e_in_2 -> e_in_3, k_out_1 + e_out_2 -> e_out_3]\n", + " Tie: e_in_3 -- e_out_3\n", "\n" ] } @@ -543,22 +147,22 @@ }, { "cell_type": "code", - "execution_count": 103, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "BenchmarkTools.Trial: 10 samples with 1 evaluation.\n", - " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m520.818 ms\u001b[22m\u001b[39m … \u001b[35m588.348 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m3.87% … 6.33%\n", - " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m553.318 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m4.65%\n", - " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m556.689 ms\u001b[22m\u001b[39m ± \u001b[32m 19.426 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m4.75% ± 1.01%\n", + "BenchmarkTools.Trial: 27 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m182.038 ms\u001b[22m\u001b[39m … \u001b[35m203.672 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m4.83% … 11.23%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m187.399 ms \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m7.11%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m189.151 ms\u001b[22m\u001b[39m ± \u001b[32m 5.412 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m8.49% ± 2.73%\n", "\n", - " \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m█\u001b[39m \u001b[39m█\u001b[34m█\u001b[39m\u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \n", - " \u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m█\u001b[39m▁\u001b[39m█\u001b[34m█\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[32m▁\u001b[39m\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m▁\n", - " 521 ms\u001b[90m Histogram: frequency by time\u001b[39m 588 ms \u001b[0m\u001b[1m<\u001b[22m\n", + " \u001b[39m▃\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m▃\u001b[39m \u001b[39m \u001b[34m█\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \n", + " \u001b[39m█\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m█\u001b[39m▁\u001b[39m▇\u001b[34m█\u001b[39m\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[32m▇\u001b[39m\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m▇\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▇\u001b[39m \u001b[39m▁\n", + " 182 ms\u001b[90m Histogram: frequency by time\u001b[39m 204 ms \u001b[0m\u001b[1m<\u001b[22m\n", "\n", - " Memory estimate\u001b[90m: \u001b[39m\u001b[33m336.89 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m3305766\u001b[39m." + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m417.57 MiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m3203645\u001b[39m." ] }, "metadata": {}, @@ -568,20 +172,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "Found 480 Diagrams for 4-Photon Compton\n", - "Diagram 1: Initial Particles: [k_in_1, k_in_2, k_in_3, k_in_4, e_in_1, e_out_1, k_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_1 -> e_out_2, e_in_1 + k_out_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [k_in_2 + e_out_2 -> e_out_3, k_in_3 + e_in_2 -> e_in_3]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: [k_in_4 + e_out_3 -> e_out_4]\n", - " Ties: []\n", - "Virtuality Level 4:\n", - " Vertices: []\n", - " Ties: [e_in_3 -- e_out_4]\n", + "Found 120 Diagrams for 4-Photon Compton\n", + "Diagram 1: Initial Particles: [k_in_1, k_in_2, k_in_3, k_in_4, e_in_1, k_out_1, e_out_1]\n", + " Virtuality Level 1 Vertices: [k_in_3 + e_in_1 -> e_in_2, k_in_4 + e_out_1 -> e_out_2]\n", + " Virtuality Level 2 Vertices: [k_in_2 + e_out_2 -> e_out_3, k_out_1 + e_in_2 -> e_in_3]\n", + " Virtuality Level 3 Vertices: [k_in_1 + e_in_3 -> e_in_4]\n", + " Tie: e_out_3 -- e_in_4\n", "\n" ] } @@ -599,15 +195,22 @@ }, { "cell_type": "code", - "execution_count": 104, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "BenchmarkTools.Trial: 1 sample with 1 evaluation.\n", - " Single result which took \u001b[34m8.170 s\u001b[39m (7.15% GC) to evaluate,\n", - " with a memory estimate of \u001b[33m4.69 GiB\u001b[39m, over \u001b[33m47449329\u001b[39m allocations." + "BenchmarkTools.Trial: 2 samples with 1 evaluation.\n", + " Range \u001b[90m(\u001b[39m\u001b[36m\u001b[1mmin\u001b[22m\u001b[39m … \u001b[35mmax\u001b[39m\u001b[90m): \u001b[39m\u001b[36m\u001b[1m3.210 s\u001b[22m\u001b[39m … \u001b[35m 3.254 s\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmin … max\u001b[90m): \u001b[39m10.57% … 11.76%\n", + " Time \u001b[90m(\u001b[39m\u001b[34m\u001b[1mmedian\u001b[22m\u001b[39m\u001b[90m): \u001b[39m\u001b[34m\u001b[1m3.232 s \u001b[22m\u001b[39m\u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmedian\u001b[90m): \u001b[39m11.17%\n", + " Time \u001b[90m(\u001b[39m\u001b[32m\u001b[1mmean\u001b[22m\u001b[39m ± \u001b[32mσ\u001b[39m\u001b[90m): \u001b[39m\u001b[32m\u001b[1m3.232 s\u001b[22m\u001b[39m ± \u001b[32m30.898 ms\u001b[39m \u001b[90m┊\u001b[39m GC \u001b[90m(\u001b[39mmean ± σ\u001b[90m): \u001b[39m11.17% ± 0.84%\n", + "\n", + " \u001b[34m█\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[32m \u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m \u001b[39m█\u001b[39m \u001b[39m \n", + " \u001b[34m█\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[32m▁\u001b[39m\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m▁\u001b[39m█\u001b[39m \u001b[39m▁\n", + " 3.21 s\u001b[90m Histogram: frequency by time\u001b[39m 3.25 s \u001b[0m\u001b[1m<\u001b[22m\n", + "\n", + " Memory estimate\u001b[90m: \u001b[39m\u001b[33m8.12 GiB\u001b[39m, allocs estimate\u001b[90m: \u001b[39m\u001b[33m67276764\u001b[39m." ] }, "metadata": {}, @@ -617,26 +220,12 @@ "name": "stdout", "output_type": "stream", "text": [ - "Found 3600 Diagrams for 5-Photon Compton\n", - "Diagram 1: Initial Particles: [k_in_1, k_in_2, k_in_3, k_in_4, k_in_5, e_in_1, e_out_1, k_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_2 + e_out_1 -> e_out_2, k_in_1 + e_in_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [k_in_4 + e_in_2 -> e_in_3]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: [k_in_3 + e_in_3 -> e_in_4]\n", - " Ties: []\n", - "Virtuality Level 4:\n", - " Vertices: [k_out_1 + e_in_4 -> e_in_5]\n", - " Ties: []\n", - "Virtuality Level 5:\n", - " Vertices: [k_in_5 + e_in_5 -> e_in_6]\n", - " Ties: []\n", - "Virtuality Level 6:\n", - " Vertices: []\n", - " Ties: [e_out_2 -- e_in_6]\n", + "Found 720 Diagrams for 5-Photon Compton\n", + "Diagram 1: Initial Particles: [k_in_1, k_in_2, k_in_3, k_in_4, k_in_5, e_in_1, k_out_1, e_out_1]\n", + " Virtuality Level 1 Vertices: [k_in_3 + e_in_1 -> e_in_2, k_in_4 + e_out_1 -> e_out_2]\n", + " Virtuality Level 2 Vertices: [k_in_2 + e_out_2 -> e_out_3, k_in_5 + e_in_2 -> e_in_3]\n", + " Virtuality Level 3 Vertices: [k_in_1 + e_out_3 -> e_out_4, k_out_1 + e_in_3 -> e_in_4]\n", + " Tie: e_out_4 -- e_in_4\n", "\n" ] } @@ -654,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 87, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -662,20 +251,12 @@ "output_type": "stream", "text": [ "Diagram 1: Initial Particles: [p_in_1, e_in_1, p_out_1, e_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [p_in_1 + p_out_1 -> k_out_1, e_in_1 + e_out_1 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", + " Virtuality Level 1 Vertices: [p_out_1 + e_out_1 -> k_out_2, p_in_1 + e_in_1 -> k_out_1]\n", + " Tie: k_out_2 -- k_out_1\n", "\n", "Diagram 2: Initial Particles: [p_in_1, e_in_1, p_out_1, e_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [p_in_1 + e_in_1 -> k_out_1, p_out_1 + e_out_1 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", + " Virtuality Level 1 Vertices: [p_in_1 + p_out_1 -> k_out_2, e_in_1 + e_out_1 -> k_out_1]\n", + " Tie: k_out_2 -- k_out_1\n", "\n" ] } @@ -695,7 +276,7 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -703,20 +284,12 @@ "output_type": "stream", "text": [ "Diagram 1: Initial Particles: [e_in_1, e_in_2, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [e_in_1 + e_out_2 -> k_out_1, e_in_2 + e_out_1 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", + " Virtuality Level 1 Vertices: [e_in_1 + e_out_1 -> k_out_1, e_in_2 + e_out_2 -> k_out_2]\n", + " Tie: k_out_1 -- k_out_2\n", "\n", "Diagram 2: Initial Particles: [e_in_1, e_in_2, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [e_in_2 + e_out_2 -> k_out_2, e_in_1 + e_out_1 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [k_out_2 -- k_out_1]\n", + " Virtuality Level 1 Vertices: [e_in_1 + e_out_2 -> k_out_1, e_in_2 + e_out_1 -> k_out_2]\n", + " Tie: k_out_1 -- k_out_2\n", "\n" ] } @@ -736,7 +309,7 @@ }, { "cell_type": "code", - "execution_count": 89, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -744,20 +317,12 @@ "output_type": "stream", "text": [ "Diagram 1: Initial Particles: [p_in_1, e_in_1, k_out_1, k_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [p_in_1 + k_out_2 -> e_out_1, e_in_1 + k_out_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [e_out_1 -- e_in_2]\n", + " Virtuality Level 1 Vertices: [e_in_1 + k_out_1 -> e_in_2, p_in_1 + k_out_2 -> e_out_1]\n", + " Tie: e_in_2 -- e_out_1\n", "\n", "Diagram 2: Initial Particles: [p_in_1, e_in_1, k_out_1, k_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [p_in_1 + k_out_1 -> e_out_1, e_in_1 + k_out_2 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [e_out_1 -- e_in_2]\n", + " Virtuality Level 1 Vertices: [e_in_1 + k_out_2 -> e_in_2, p_in_1 + k_out_1 -> e_out_1]\n", + " Tie: e_in_2 -- e_out_1\n", "\n" ] } @@ -777,7 +342,7 @@ }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -785,20 +350,12 @@ "output_type": "stream", "text": [ "Diagram 1: Initial Particles: [k_in_1, k_in_2, p_out_1, e_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + p_out_1 -> e_in_1, k_in_2 + e_out_1 -> e_out_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [e_in_1 -- e_out_2]\n", + " Virtuality Level 1 Vertices: [k_in_1 + e_out_1 -> e_out_2, k_in_2 + p_out_1 -> e_in_1]\n", + " Tie: e_out_2 -- e_in_1\n", "\n", "Diagram 2: Initial Particles: [k_in_1, k_in_2, p_out_1, e_out_1]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_1 -> e_out_2, k_in_2 + p_out_1 -> e_in_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: []\n", - " Ties: [e_out_2 -- e_in_1]\n", + " Virtuality Level 1 Vertices: [k_in_1 + p_out_1 -> e_in_1, k_in_2 + e_out_1 -> e_out_2]\n", + " Tie: e_in_1 -- e_out_2\n", "\n" ] } @@ -818,189 +375,53 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Found 16 diagrams:\n", + "Found 8 diagrams:\n", "Diagram 1: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + p_out_1 -> e_in_2, e_in_1 + e_out_2 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_out_1 + k_out_1 -> e_out_3]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_in_2 -- e_out_3]\n", + " Virtuality Level 1 Vertices: [e_in_1 + e_out_1 -> k_out_1, k_in_1 + p_out_1 -> e_in_2]\n", + " Virtuality Level 2 Vertices: [e_out_2 + k_out_1 -> e_out_3]\n", + " Tie: e_in_2 -- e_out_3\n", "\n", "Diagram 2: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_2 -> e_out_3, e_in_1 + e_out_1 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [p_out_1 + e_out_3 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", + " Virtuality Level 1 Vertices: [k_in_1 + e_out_1 -> e_out_3, p_out_1 + e_out_2 -> k_out_1]\n", + " Virtuality Level 2 Vertices: [e_in_1 + e_out_3 -> k_out_2]\n", + " Tie: k_out_1 -- k_out_2\n", "\n", "Diagram 3: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + p_out_1 -> e_in_2, e_in_1 + e_out_1 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_out_2 + e_in_2 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", + " Virtuality Level 1 Vertices: [p_out_1 + e_out_1 -> k_out_1, k_in_1 + e_out_2 -> e_out_3]\n", + " Virtuality Level 2 Vertices: [e_in_1 + k_out_1 -> e_in_2]\n", + " Tie: e_out_3 -- e_in_2\n", "\n", "Diagram 4: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [e_in_1 + e_out_2 -> k_out_1, k_in_1 + e_out_1 -> e_out_3]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [p_out_1 + e_out_3 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", + " Virtuality Level 1 Vertices: [p_out_1 + e_out_2 -> k_out_1, k_in_1 + e_in_1 -> e_in_2]\n", + " Virtuality Level 2 Vertices: [e_out_1 + k_out_1 -> e_out_3]\n", + " Tie: e_in_2 -- e_out_3\n", "\n", "Diagram 5: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + p_out_1 -> e_in_2, e_in_1 + e_out_2 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_out_1 + e_in_2 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", + " Virtuality Level 1 Vertices: [e_in_1 + e_out_1 -> k_out_1, k_in_1 + e_out_2 -> e_out_3]\n", + " Virtuality Level 2 Vertices: [p_out_1 + k_out_1 -> e_in_2]\n", + " Tie: e_out_3 -- e_in_2\n", "\n", "Diagram 6: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + p_out_1 -> e_in_2, e_in_1 + e_out_1 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_out_2 + k_out_1 -> e_out_3]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_in_2 -- e_out_3]\n", + " Virtuality Level 1 Vertices: [k_in_1 + p_out_1 -> e_in_2, e_in_1 + e_out_2 -> k_out_1]\n", + " Virtuality Level 2 Vertices: [e_out_1 + k_out_1 -> e_out_3]\n", + " Tie: e_in_2 -- e_out_3\n", "\n", "Diagram 7: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [p_out_1 + e_out_2 -> k_out_1, k_in_1 + e_in_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_out_1 + k_out_1 -> e_out_3]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_in_2 -- e_out_3]\n", + " Virtuality Level 1 Vertices: [p_out_1 + e_out_1 -> k_out_1, k_in_1 + e_in_1 -> e_in_2]\n", + " Virtuality Level 2 Vertices: [e_out_2 + k_out_1 -> e_out_3]\n", + " Tie: e_in_2 -- e_out_3\n", "\n", "Diagram 8: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [p_out_1 + e_out_1 -> k_out_1, k_in_1 + e_in_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_out_2 + e_in_2 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", - "\n", - "Diagram 9: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [p_out_1 + e_out_2 -> k_out_1, k_in_1 + e_in_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_out_1 + e_in_2 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [k_out_1 -- k_out_2]\n", - "\n", - "Diagram 10: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_1 -> e_out_3, p_out_1 + e_out_2 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_in_1 + e_out_3 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [k_out_2 -- k_out_1]\n", - "\n", - "Diagram 11: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_2 -> e_out_3, p_out_1 + e_out_1 -> k_out_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_in_1 + e_out_3 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [k_out_2 -- k_out_1]\n", - "\n", - "Diagram 12: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_2 -> e_out_3, e_in_1 + e_out_1 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [p_out_1 + k_out_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_out_3 -- e_in_2]\n", - "\n", - "Diagram 13: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [p_out_1 + e_out_1 -> k_out_1, k_in_1 + e_in_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_out_2 + k_out_1 -> e_out_3]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_in_2 -- e_out_3]\n", - "\n", - "Diagram 14: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_1 -> e_out_3, p_out_1 + e_out_2 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_in_1 + k_out_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_out_3 -- e_in_2]\n", - "\n", - "Diagram 15: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [e_in_1 + e_out_2 -> k_out_1, k_in_1 + e_out_1 -> e_out_3]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [p_out_1 + k_out_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_out_3 -- e_in_2]\n", - "\n", - "Diagram 16: Initial Particles: [k_in_1, e_in_1, p_out_1, e_out_1, e_out_2]\n", - "Virtuality Level 1:\n", - " Vertices: [k_in_1 + e_out_2 -> e_out_3, p_out_1 + e_out_1 -> k_out_1]\n", - " Ties: []\n", - "Virtuality Level 2:\n", - " Vertices: [e_in_1 + k_out_1 -> e_in_2]\n", - " Ties: []\n", - "Virtuality Level 3:\n", - " Vertices: []\n", - " Ties: [e_out_3 -- e_in_2]\n", + " Virtuality Level 1 Vertices: [k_in_1 + e_out_1 -> e_out_3, e_in_1 + e_out_2 -> k_out_1]\n", + " Virtuality Level 2 Vertices: [p_out_1 + k_out_1 -> e_in_2]\n", + " Tie: e_out_3 -- e_in_2\n", "\n" ] } diff --git a/notebooks/profiling.ipynb b/notebooks/profiling.ipynb index f4032ee..e0be63d 100644 --- a/notebooks/profiling.ipynb +++ b/notebooks/profiling.ipynb @@ -35,11 +35,11 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ - "@ProfileView.profview comp_func = get_compute_function(graph, process)" + "@ProfileView.profview comp_func = get_compute_function(graph, process, get_machine_info())" ] }, { @@ -52,7 +52,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Julia 1.9.3", + "display_name": "Julia 1.9.4", "language": "julia", "name": "julia-1.9" }, @@ -60,7 +60,7 @@ "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", - "version": "1.9.3" + "version": "1.9.4" }, "orig_nbformat": 4 }, diff --git a/src/MetagraphOptimization.jl b/src/MetagraphOptimization.jl index bbf31ec..599bfba 100644 --- a/src/MetagraphOptimization.jl +++ b/src/MetagraphOptimization.jl @@ -63,6 +63,7 @@ export ComputeTaskABC_U export ComputeTaskABC_Sum # QED model +export FeynmanDiagram, FeynmanVertex, FeynmanTie, FeynmanParticle export PhotonStateful, FermionStateful, AntiFermionStateful export QEDParticle, QEDProcessDescription, QEDProcessInput, QEDModel export ComputeTaskQED_P @@ -95,6 +96,9 @@ export ==, in, show, isempty, delete!, length export bytes_to_human_readable +# TODO: this is probably not good +import QEDprocesses.compute + import Base.length import Base.show import Base.== @@ -174,6 +178,7 @@ include("models/abc/print.jl") include("models/qed/types.jl") include("models/qed/particle.jl") +include("models/qed/diagrams.jl") include("models/qed/compute.jl") include("models/qed/create.jl") include("models/qed/properties.jl") diff --git a/src/models/qed/create.jl b/src/models/qed/create.jl index c42b1f5..69646f8 100644 --- a/src/models/qed/create.jl +++ b/src/models/qed/create.jl @@ -55,3 +55,39 @@ function gen_process_input(processDescription::QEDProcessDescription) return return processInput end + +""" + gen_graph(process_description::QEDProcessDescription) + +For a given [`QEDProcessDescription`](@ref), return the [`DAG`](@ref) that computes it. +""" +function gen_graph(process_description::QEDProcessDescription) + initial_diagram = FeynmanDiagram(process_description) + diagrams = gen_diagrams(initial_diagram) + + graph = DAG() + + COMPLEX_SIZE = sizeof(ComplexF64) + + # TODO: Not all diagram outputs should always be summed at the end, if they differ by fermion exchange they need to be diffed + # Should not matter for n-Photon Compton processes though + sum_node = insert_node!(graph, make_node(ComputeTaskQED_Sum(0)), track = false, invalidate_cache = false) + global_data_out = insert_node!(graph, make_node(DataTask(COMPLEX_SIZE)), track = false, invalidate_cache = false) + insert_edge!(graph, sum_node, global_data_out, track = false, invalidate_cache = false) + + # remember the data out nodes for connection + dataOutNodes = Dict() + + for particle in initial_diagram.particles + # generate U tasks + + end + + for diagram in diagrams + for (vertices, ties) in zip(diagram.vertices, diagram.ties) + + end + end + + return graph +end diff --git a/src/models/qed/diagrams.jl b/src/models/qed/diagrams.jl new file mode 100644 index 0000000..cb84d43 --- /dev/null +++ b/src/models/qed/diagrams.jl @@ -0,0 +1,442 @@ + +import Base.copy +import Base.hash +import Base.== +import Base.show + +""" + FeynmanParticle + +Representation of a particle for use in [`FeynmanDiagram`](@ref)s. Consist of the [`QEDParticle`](@ref) type and an id. +""" +struct FeynmanParticle + particle::Type{<:QEDParticle} + id::Int +end + +""" + FeynmanVertex + +Representation of a vertex in a [`FeynmanDiagram`](@ref). Stores two input [`FeynmanParticle`](@ref)s and one output. +""" +struct FeynmanVertex + in1::FeynmanParticle + in2::FeynmanParticle + out::FeynmanParticle +end + +""" + FeynmanTie + +Representation of a "tie" in a [`FeynmanDiagram`](@ref). A tie ties two virtual particles in a diagram together and thus represent an inner line of the diagram. Not all inner lines are [`FeynmanTie`](@ref)s, in fact, a connected diagram only ever has exactly one tie. +""" +struct FeynmanTie + in1::FeynmanParticle + in2::FeynmanParticle +end + +""" + FeynmanDiagram + +Representation of a feynman diagram. It consists of its initial input/output particles, and a vector of sets of [`FeynmanVertex`](@ref)s. The vertices are to be applied level by level. +A [`FeynmanVertex`](@ref) will always be at the lowest level possible, i.e. the lowest level at which all input particles for it exist. +The [`FeynmanTie`](@ref) represents the final inner edge of the diagram. +""" +struct FeynmanDiagram + vertices::Vector{Set{FeynmanVertex}} + tie::Ref{Union{FeynmanTie, Missing}} + particles::Vector{FeynmanParticle} +end + +""" + FeynmanDiagram(pd::QEDProcessDescription) + +Create an initial [`FeynmanDiagram`](@ref) with only its initial particles set and no vertices or ties. + +Use [`gen_diagrams`](@ref) to generate all possible diagrams from this one. +""" +function FeynmanDiagram(pd::QEDProcessDescription) + parts = Vector{FeynmanParticle}() + for (type, n) in pd.inParticles + for i in 1:n + push!(parts, FeynmanParticle(type, i)) + end + end + for (type, n) in pd.outParticles + for i in 1:n + push!(parts, FeynmanParticle(type, i)) + end + end + return FeynmanDiagram([], missing, parts) +end + +function particle_after_tie(p::FeynmanParticle, t::FeynmanTie) + if p == t.in1 || p == t.in2 + return FeynmanParticle(FermionStateful{Incoming}, -1) # placeholder particle and id for tied particles + end + return p +end + +function vertex_after_tie(v::FeynmanVertex, t::FeynmanTie) + return FeynmanVertex(particle_after_tie(v.in1, t), particle_after_tie(v.in2, t), particle_after_tie(v.out, t)) +end + +function vertex_set_after_tie(vs::Set{FeynmanVertex}, t::FeynmanTie) + return Set{FeynmanVertex}(vertex_after_tie(v, t) for v in vs) +end + +function vertex_set_after_tie(vs::Set{FeynmanVertex}, t::Missing) + return vs +end + +""" + String(p::FeynmanParticle) + +Return a string representation of the [`FeynmanParticle`](@ref) in a format that is readable by [`type_index_from_name`](@ref). +""" +function String(p::FeynmanParticle) + return "$(String(p.particle))$(String(direction(p.particle)))$(p.id)" +end + +function hash(v::FeynmanVertex) + return hash(Set{FeynmanParticle}([v.in1, v.in2])) +end + +function hash(t::FeynmanTie) + return hash(Set{FeynmanParticle}([t.in1, t.in2])) +end + +function hash(d::FeynmanDiagram) + if (isempty(d.vertices)) + return hash(d.particles) + end + + return hash((vertex_set_after_tie(union(d.vertices...), d.tie[]), d.particles)) +end + +function ==(v1::FeynmanVertex, v2::FeynmanVertex) + return Set{FeynmanParticle}([v1.in1, v1.in2]) == Set{FeynmanParticle}([v2.in1, v2.in2]) +end + +function ==(t1::FeynmanTie, t2::FeynmanTie) + return Set{FeynmanParticle}([t1.in1, t1.in2]) == Set{FeynmanParticle}([t2.in1, t2.in2]) +end + +function ==(d1::FeynmanDiagram, d2::FeynmanDiagram) + if (!ismissing(d1.tie[]) && ismissing(d2.tie[])) || (ismissing(d1.tie[]) && !ismissing(d2.tie[])) + return false + end + if d1.particles != d2.particles + return false + end + + # TODO can i prove that this works? + return vertex_set_after_tie(vertex_set_after_tie(union(d1.vertices...), d1.tie[]), d2.tie[]) == + vertex_set_after_tie(vertex_set_after_tie(union(d2.vertices...), d1.tie[]), d2.tie[]) +end + +copy(fd::FeynmanDiagram) = FeynmanDiagram(deepcopy(fd.vertices), copy(fd.tie[]), deepcopy(fd.particles)) + +""" + id_for_type(d::FeynmanDiagram, t::Type{<:QEDParticle}) + +Return the highest id of any particle of the given type in the diagram + 1. +""" +function id_for_type(d::FeynmanDiagram, t::Type{<:QEDParticle}) + id = 1 + for l in 0:length(d.vertices) + particles = get_particles(d, l) + for p in particles + if (p.particle <: t) + id = max(id, p.id + 1) + end + end + end + return id +end + +""" + can_apply_vertex(particles::Vector{FeynmanParticle}, vertex::FeynmanVertex) + +Return true if the given [`FeynmanVertex`](@ref) can be applied to the given particles, i.e. both input particles of the vertex are in the vector and the output particle is not. +""" +function can_apply_vertex(particles::Vector{FeynmanParticle}, vertex::FeynmanVertex) + return vertex.in1 in particles && vertex.in2 in particles && !(vertex.out in particles) +end + +""" + apply_vertex!(particles::Vector{FeynmanParticle}, vertex::FeynmanVertex) + +Apply a [`FeynmanVertex`](@ref) to the given vector of [`FeynmanParticle`](@ref)s. +""" +function apply_vertex!(particles::Vector{FeynmanParticle}, vertex::FeynmanVertex) + #@assert can_apply_vertex(particles, vertex) + length_before = length(particles) + filter!(x -> x != vertex.in1 && x != vertex.in2, particles) + push!(particles, vertex.out) + #@assert length(particles) == length_before - 1 + return nothing +end + +""" + can_apply_tie(particles::Vector{FeynmanParticle}, tie::FeynmanTie) + +Return true if the given [`FeynmanTie`](@ref) can be applied to the given particles, i.e. both input particles of the tie are in the vector. +""" +function can_apply_tie(particles::Vector{FeynmanParticle}, tie::FeynmanTie) + return tie.in1 in particles && tie.in2 in particles +end + +""" + apply_tie!(particles::Vector{FeynmanParticle}, tie::FeynmanTie) + +Apply a [`FeynmanTie`](@ref) to the given vector of [`FeynmanParticle`](@ref)s. +""" +function apply_tie!(particles::Vector{FeynmanParticle}, tie::FeynmanTie) + @assert length(particles) == 2 + @assert can_apply_tie(particles, tie) + @assert can_tie(tie.in1.particle, tie.in2.particle) + empty!(particles) + @assert length(particles) == 0 + return nothing +end + +function apply_tie!(::Vector{FeynmanParticle}, ::Missing) + return nothing +end + +""" + get_particles(fd::FeynmanDiagram, level::Int) + +Return a vector of the particles after applying the vertices and tie of the diagram up to the given level. If no level is given, apply all. The tie comes last and is its own "level". +""" +function get_particles(fd::FeynmanDiagram, level::Int = -1) + if level == -1 + level = length(fd.vertices) + 1 + end + + working_particles = copy(fd.particles) + for l in 1:length(fd.vertices) + if l > level + break + end + for v in fd.vertices[l] + apply_vertex!(working_particles, v) + end + end + + if (level > length(fd.vertices)) + apply_tie!(working_particles, fd.tie[]) + end + + return working_particles +end + +""" + add_vertex!(fd::FeynmanDiagram, vertex::FeynmanVertex) + +Add the given vertex to the diagram, at the earliest level possible. +""" +function add_vertex!(fd::FeynmanDiagram, vertex::FeynmanVertex) + for i in eachindex(fd.vertices) + if (can_apply_vertex(get_particles(fd, i - 1), vertex)) + push!(fd.vertices[i], vertex) + return nothing + end + end + + if !can_apply_vertex(get_particles(fd), vertex) + #@assert false "Can't add vertex $vertex to diagram" + end + + push!(fd.vertices, Set{FeynmanVertex}()) + push!(fd.vertices[end], vertex) + return nothing +end + +""" + add_vertex(fd::FeynmanDiagram, vertex::FeynmanVertex) + +Add the given vertex to the diagram, at the earliest level possible. Return the new diagram without muting the given one. +""" +function add_vertex(fd::FeynmanDiagram, vertex::FeynmanVertex) + newfd = copy(fd) + add_vertex!(newfd, vertex) + return newfd +end + +""" + add_tie!(fd::FeynmanDiagram, tie::FeynmanTie) + +Add the given tie to the diagram, always at the last level. +""" +function add_tie!(fd::FeynmanDiagram, tie::FeynmanTie) + if !can_apply_tie(get_particles(fd), tie) + @assert false "Can't add tie $tie to diagram" + end + + fd.tie[] = tie + #= + @assert length(fd.vertices) >= 2 + #if the last vertex is involved in the tie and alone, lower it one level down + if (length(fd.vertices[end]) != 1) + return nothing + end + + vert = fd.vertices[end][1] + if (vert != vertex_after_tie(vert, tie)) + return nothing + end + + pop!(fd.vertices) + push!(fd.vertices[end], vert) + =# + return nothing +end + +""" + add_tie(fd::FeynmanDiagram, tie::FeynmanTie) + +Add the given tie to the diagram, at the earliest level possible. Return the new diagram without muting the given one. +""" +function add_tie(fd::FeynmanDiagram, tie::FeynmanTie) + newfd = copy(fd) + add_tie!(newfd, tie) + return newfd +end + +""" + isvalid(fd::FeynmanDiagram) + +Return whether the given diagram is valid. A diagram is valid iff the following are true: +- After applying all vertices and the tie, there are no more particles left +- The diagram is connected +""" +function isvalid(fd::FeynmanDiagram) + if ismissing(fd.tie[]) + # diagram is connected iff there is one tie + return false + end + + if get_particles(fd) != [] + return false + end + + return true +end + +""" + possible_vertices(fd::FeynmanDiagram) + +Return a vector of all possible vertices that can be applied to the diagram at its current state. +""" +function possible_vertices(fd::FeynmanDiagram) + possibilities = Vector{FeynmanVertex}() + fully_generated_particles = get_particles(fd) + + for l in 0:length(fd.vertices) + particles = get_particles(fd, l) + for i in 1:length(particles) + for j in (i + 1):length(particles) + p1 = particles[i] + p2 = particles[j] + if (caninteract(p1.particle, p2.particle)) + interaction_res = propagation_result(interaction_result(p1.particle, p2.particle)) + v = FeynmanVertex(p1, p2, FeynmanParticle(interaction_res, id_for_type(fd, interaction_res))) + #@assert !(v.out in particles) "$v is in $fd" + if !can_apply_vertex(fully_generated_particles, v) + continue + end + push!(possibilities, v) + end + end + end + if (!isempty(possibilities)) + return possibilities + end + end + return possibilities +end + +""" + can_tie(p1::Type, p2::Type) + +For two given [`QEDParitcle`](@ref) types, return whether they can be tied together. + +They can be tied iff one is the [`propagation_result`](@ref) of the other, or if both are photons, in which case their direction does not matter. +""" +function can_tie(p1::Type, p2::Type) + if p1 == propagation_result(p2) + return true + end + if (p1 <: PhotonStateful && p2 <: PhotonStateful) + return true + end + return false +end + +""" + possible_tie(fd::FeynmanDiagram) + +Return a possible tie or `missing` for the diagram at its current state. +""" +function possible_tie(fd::FeynmanDiagram) + particles = get_particles(fd) + if (length(particles) != 2) + return missing + end + + if (particles[1] in fd.particles || particles[2] in fd.particles) + return missing + end + + tie = FeynmanTie(particles[1], particles[2]) + if (can_apply_tie(particles, tie)) + return tie + end + return missing +end + +function remove_duplicates(my_set::Set{FeynmanDiagram}, is_eq) + new_set = Set() + + for x in my_set + if all(!is_eq(x, y) for y in new_set) + push!(new_set, x) + end + end + + return new_set +end + +""" + gen_diagrams(fd::FeynmanDiagram) + +From a given feynman diagram in its initial state, e.g. when created through the [`FeynmanDiagram(pd::ProcessDescription)`](@ref) constructor, generate and return all possible [`FeynmanDiagram`](@ref)s that describe that process. +""" +function gen_diagrams(fd::FeynmanDiagram) + working = Set{FeynmanDiagram}() + results = Set{FeynmanDiagram}() + + push!(working, fd) + + while !isempty(working) + d = pop!(working) + + possibilities = possible_vertices(d) + for v in possibilities + push!(working, add_vertex(d, v)) + end + + # can only find a tie when no vertices are possible anymore anyways + tie = possible_tie(d) + if !ismissing(tie) + add_tie!(d, tie) + if (isvalid(d)) + push!(results, d) + end + end + end + + return remove_duplicates(results, ==) +end diff --git a/src/models/qed/print.jl b/src/models/qed/print.jl index 1d8cad8..76f2166 100644 --- a/src/models/qed/print.jl +++ b/src/models/qed/print.jl @@ -59,3 +59,57 @@ function show(io::IO, particle::T) where {T <: QEDParticle} print(io, "$(String(typeof(particle))): $(particle.momentum)") return nothing end + +""" + show(io::IO, particle::FeynmanParticle) + +Pretty print a [`FeynmanParticle`](@ref) (no newlines). +""" +show(io::IO, p::FeynmanParticle) = print(io, "$(String(p.particle))_$(String(direction(p.particle)))_$(p.id)") + +""" + show(io::IO, particle::FeynmanVertex) + +Pretty print a [`FeynmanVertex`](@ref) (no newlines). +""" +show(io::IO, v::FeynmanVertex) = print(io, "$(v.in1) + $(v.in2) -> $(v.out)") + +""" + show(io::IO, particle::FeynmanTie) + +Pretty print a [`FeynmanTie`](@ref) (no newlines). +""" +show(io::IO, t::FeynmanTie) = print(io, "$(t.in1) -- $(t.in2)") + +""" + show(io::IO, particle::FeynmanDiagram) + +Pretty print a [`FeynmanDiagram`](@ref) (with newlines). +""" +function show(io::IO, d::FeynmanDiagram) + print(io, "Initial Particles: [") + first = true + for p in d.particles + if first + first = false + print(io, "$p") + else + print(io, ", $p") + end + end + print(io, "]\n") + for l in eachindex(d.vertices) + print(io, " Virtuality Level $l Vertices: [") + first = true + for v in d.vertices[l] + if first + first = false + print(io, "$v") + else + print(io, ", $v") + end + end + print(io, "]\n") + end + return print(io, " Tie: $(d.tie[])\n") +end