Function Resource

DiagramProcess

(WIP) Construct a computable diagram of an underlying abstract process

ResourceFunction["DiagramProcess"][expr]

returns a process object with computable diagram properties.

Details and Options

DiagramProcess accespts following options:
DiagramProcess Options
"Simplify"Falsesimplify diagram by dropping topological processes
"Double"Nonedouble or undouble a process
"Composite"Nonecomposite or uncomposite a process
Diagram Options also work for "Diagram" property
"Outline"Falseoutline all processes with dashed contour
"ComposeDistance"Automaticvertical distance between processes
"ParallelComposeDistance"Automatichorizontal distnace between processes
"Size"Automaticsize of a diagram
"ShowProcessLabels"Truewhether to show process labels
"ShowWireLabels"Truewhether to show wire labels
"ShowArrowLabels"Falsewhether to show arrow labels
"ShowProcessArrows"Falsewhether to show arrows inside processes
"ArrowPosition"Automaticrelative position of arrowheads
"AddTerminals"Falsewhether to show ingoing and outgoing diagram wires
"ThickDoubleWires"Falsethicken double wires
"ShowComposites"Falsewhether to show internals of composite processes
"Interactive"Falsereturn graph with draggable vertices
DiagramProcess accepts following properties:
PropertyDescription
"Properties"list all available properties
"Diagram"|"Graph"return a digram for a process
"Process"return an underlying process object
"Tensor"tensor interpretation of a process
"Matrix"matrix interpretation of a process

Examples

Basic Examples

A process with no inputs or outputs:

In[1]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][f]
Out[1]=

Inputs are specified with Subscript or Underscript:

In[2]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][Subscript[f, A]]
Out[2]=

Ouputs are specified with Power, Superscript or Overscript:

In[3]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][f^A]
Out[3]=

Specify multiple inputs/ouputs with List or Row:

In[4]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][
\!\(\*SubsuperscriptBox[\(f\), \({A, B}\), 
TemplateBox[{"S", "T", "U"},
"RowDefault"]]\)]
Out[4]=

Composition builds diagram vertically:

In[5]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"A", "B"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"A", "B"},
"RowDefault"]]\)]
Out[5]=

Parallel composition (CircleTimes) builds diagram horizontally:

In[6]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"P", "B"},
"RowDefault"], "F"]\[CircleTimes]\*
SubsuperscriptBox["f", 
TemplateBox[{"A", "J"},
"RowDefault"], 
TemplateBox[{"B", "G"},
"RowDefault"]]\)]
Out[6]=

Scope

Diagram graph

Extract diagram as a Graph:

In[7]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"P", "B"},
"RowDefault"], "F"]\[CircleTimes]\(\*
SubsuperscriptBox["h", 
TemplateBox[{"B", "G"},
"RowDefault"], "P"]@*\*
SubsuperscriptBox["f", 
TemplateBox[{"A", "J"},
"RowDefault"], 
TemplateBox[{"B", "G"},
"RowDefault"]]\)\)]["Diagram", "AddTerminals" -> True]
Out[7]=

Special processes

In[8]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Id"[A]]
Out[8]=
In[9]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Cup"[A]]
Out[9]=
In[10]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Cap"[A]]
Out[10]=
In[11]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Swap"[A, B]]
Out[11]=
In[12]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][
 "Permutation"[Cycles[{{2, 1, 3}}], {A, B, C}]]
Out[12]=
In[13]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Copy"[A]]
Out[13]=
In[14]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Match"[A]]
Out[14]=
In[15]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Curry"[A, B]]
Out[15]=
In[16]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Uncurry"[A, B]]
Out[16]=
In[17]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Discard"[A]]
Out[17]=
In[18]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["MaximallyMixed"[A]]
Out[18]=
In[19]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Empty"]
Out[19]=
In[20]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Zero"]
Out[20]=
In[21]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Spider"[2, 3, A]]
Out[21]=
In[22]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["ZSpider"[Pi, 3, 2, A]]
Out[22]=
In[23]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["XSpider"[Pi/2, 1, 2, A]]
Out[23]=
In[24]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Delete"[A]]
Out[24]=
In[25]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Encode"[A]]
Out[25]=
In[26]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Measure"[A]]
Out[26]=
In[27]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Decoherence"[A]]
Out[27]=
In[28]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["CNOT"[A]]
Out[28]=
In[29]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["QCNOT"[A]]
Out[29]=

Dual types

Dual types (SuperStar) go in reverse direction (topbottom):

In[30]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(g\), 
SuperscriptBox[\(A\), \(*\)], \(B\)]@*
\*SubsuperscriptBox[\(f\), \(B\), 
SuperscriptBox[\(A\), \(*\)]]\)]["Diagram"]
Out[30]=

Transposition

Transposition rotates diagram 180°:

In[31]:=
GraphicsRow@{ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"B", "A", "M"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"N", "A"},
"RowDefault"]]\)]["Diagram"], "\[Rule]", ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][Transpose[\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"B", "A", "M"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"N", "A"},
"RowDefault"]]\)]]["Diagram"]}
Out[31]=

Adjoint

Adjoint (SuperDagger) flips digram vertically:

In[32]:=
GraphicsRow@{ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"B", "A", "M"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"N", "A"},
"RowDefault"]]\)]["Diagram"], "\[Rule]", ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][SuperDagger[(\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"B", "A", "M"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"N", "A"},
"RowDefault"]]\))]]["Diagram"]}
Out[32]=

Conjugate

Conjugate (OverBar) flips diagram horizontally:

In[33]:=
GraphicsRow@{ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"B", "A", "M"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"N", "A"},
"RowDefault"]]\)]["Diagram"], "\[Rule]", ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][
\!\(\*OverscriptBox[\(\*
SubsuperscriptBox["g", 
TemplateBox[{"B", "A", "M"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"N", "A"},
"RowDefault"]]\), \(_\)]\)]["Diagram"]}
Out[33]=

Trace

Trace creates a loop using cup and cap processes:

In[34]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][Tr[
\!\(\*SubsuperscriptBox[\(g\), 
TemplateBox[{"A", "C"},
"RowDefault"], 
TemplateBox[{"A", "B"},
"RowDefault"]]\)]]["Diagram"]
Out[34]=

Specify indices to be traced:

In[35]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Tr"[\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"A", "C"},
"RowDefault"], 
TemplateBox[{"A", "B"},
"RowDefault"]], 2, 4\)]]["Diagram"]
Out[35]=

Smart composition

Permutation and identity processes are added automatically to complete composition:

In[36]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"B", "A", "M"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"N", "A", "B"},
"RowDefault"]]\)]["Diagram", "ShowProcessArrows" -> True, "Outline" -> True]
Out[36]=

Simplify diagram

Simplification drops all topological processes from a diagram:

In[37]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(\*
SubsuperscriptBox["g", 
TemplateBox[{"B", "A", "M"},
"RowDefault"], "F"]@*\*
SubsuperscriptBox["f", "A", 
TemplateBox[{"N", "A", "B"},
"RowDefault"]]\), "Simplify" -> True]["Diagram"]
Out[37]=

Summation

In[38]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(\[Sum]\), \(i = 1\), \(5\)]\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)]\[SmallCircle]\*
TemplateBox[{"i", "A"},
"Superscript"]\)\)]
Out[38]=

Doubling

Doubling process parallel composes it with its dual conjugate currying inputs and outputs, then wrapping it in a special bold border process:

In[39]:=
GraphicsRow[{ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][(\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(A\)]\[CircleTimes]
\*SubsuperscriptBox[\(g\), \(B\), \(B\)]\))@*
\!\(\*SubsuperscriptBox[\(h\), \(C\), 
TemplateBox[{"A", "B"},
"RowDefault"]]\)]["Diagram", "AddTerminals" -> True], "\[Rule]", ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"]["Double"[(\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(A\)]\[CircleTimes]
\*SubsuperscriptBox[\(g\), \(B\), \(B\)]\))@*
\!\(\*SubsuperscriptBox[\(h\), \(C\), 
TemplateBox[{"A", "B"},
"RowDefault"]]\)]]["Diagram", "AddTerminals" -> True, "ThickDoubleWire" -> True], "=", ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"]["Double"[(\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(A\)]\[CircleTimes]
\*SubsuperscriptBox[\(g\), \(B\), \(B\)]\))@*
\!\(\*SubsuperscriptBox[\(h\), \(C\), 
TemplateBox[{"A", "B"},
"RowDefault"]]\)], "Double" -> False]["Diagram"]}, ImageSize -> 1024]
Out[39]=

Execution

Sequential and parallel process execution:

In[40]:=
proc = Labeled[(Echo["Start"]; Pause[1]; True) &, "f"];
In[41]:=
sequentialProcess = ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(proc\), \(A\), \(A\)]@*
\*SuperscriptBox[\(proc\), \(A\)]\)]
Out[41]=
In[42]:=
parallelProcess = ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][proc^A\[CircleTimes]proc^B]
Out[42]=
In[43]:=
sequentialProcess[] // AbsoluteTiming
Out[43]=
In[44]:=
parallelProcess[] // AbsoluteTiming
Out[44]=

Tensor notation

Overscript \[Breve] and \[DownBreve] indicate input and output respectively:

In[45]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][{\[Psi]^Row[{Subscript[B, 1], 
\!\(\*OverscriptBox[
SubscriptBox[\(A\), \(1\)], \(˘\)]\)}], 
\!\(\*SubsuperscriptBox[\(g\), 
TemplateBox[{
SubscriptBox["B", "1"], 
OverscriptBox[
SubscriptBox["A", "1"], "˘"]},
"RowDefault"], 
TemplateBox[{
SubscriptBox["B", "1"], 
OverscriptBox[
SubscriptBox["C", "1"], "\[DownBreve]"]},
"RowDefault"]]\), 
\!\(\*SubsuperscriptBox[\(h\), 
SubscriptBox[\(A\), \(2\)], 
OverscriptBox[
SubscriptBox[\(C\), \(1\)], \(\[DownBreve]\)]]\), f^Subscript[A, 2]}]["Diagram", "AddTerminals" -> True]
Out[45]=

Matrix and tensor interpretation

Perform tensor products and contractions of a tensor process:

In[46]:=
With[{d = ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][Tr["Double"[
\!\(\*SubsuperscriptBox[\({\*GridBox[{
{1, 2},
{3, 4}
}], \*GridBox[{
{I, 6},
{7, 8}
}]}\), 
TemplateBox[{"A", "A"},
"RowDefault"], \(A\)]\)]@*"Double"["Swap"[A, A]]@*"Double"[
\!\(\*SubsuperscriptBox[\({\*GridBox[{
{7, 4},
{2, 9}
}], \*GridBox[{
{1, 0},
{8, 2}
}]}\), \(A\), 
TemplateBox[{"A", "A"},
"RowDefault"]]\)]@*"Composite"["Double"[ 
\!\(\*SubsuperscriptBox[GridBox[{
{\(1\), \(3\)},
{\(I\), \(2\)}
}], \(A\), \(A\)]\) ]]], "Simplify" -> False]},
 GraphicsRow[{d["Diagram", "Outline" -> True, "ShowProcessArrows" -> True], "\[Rule]", d["Matrix"]}, ImageSize -> 512]
 ]
Out[46]=

Circuits

There is a way to build circuit like diagrams using empty types and some hackery (parallel composition: NWSE, composition: SWNW):

In[47]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][
  "Circuit"[("Spider"[{1, A}, {A, 1}]\[CircleTimes]"Spider"[\[Pi], {1,
         A}, {A, 1}]\[CircleTimes]"Spider"[\[Pi]/2, {C, A}, {A, 1}])@*("CircuitId"[
       A]\[CircleTimes]"XSpider"[\[Pi], {B, A}, {A, C}]\[CircleTimes]"XSpider"[{1, A}, {A, 1}])@*("Spider"[{1, A}, {A, B}]\[CircleTimes]Subsuperscript[\[Psi],{1, A},{A, 1}]\[CircleTimes]"CircuitId"[A])]]["Diagram", "ShowArrowLabels" -> True, "ShowWireLabels" -> False, "Outline" -> True]
Out[47]=

Options

Outline

Some special processes render differently than generic ones, "OutlineProcess" draws an additional dashed outline around all processes:

In[48]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Cap"[A], "Outline" -> True]
Out[48]=

AddTerminals

Terminal processes are added by default on top and bottom of a diagram's summary box to make ingoing and outgoing wires visible, specify "AddTerminals" False to turn it off:

In[49]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)], \("\<AddTerminals\>" -> False\)\)]
Out[49]=

ShowProcessLabels

Show or hide process labels:

In[50]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)], \("\<ShowProcessLabels\>" \
-> True\)\)]
Out[50]=
In[51]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)], \("\<ShowProcessLabels\>" \
-> False\)\)]
Out[51]=

ShowWireLabels

Summary box doesn't include wire labels by default, "ShowWireLabels"True to show them:

In[52]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)], \("\<ShowWireLabels\>" -> False\)\)]
Out[52]=
In[53]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)], \("\<ShowWireLabels\>" -> True\)\)]
Out[53]=

ShowArrowLabels

Show or hide composition arrow labels:

In[54]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)]@*
\*SuperscriptBox[\(g\), \(A\)]\), "ShowArrowLabels" -> False]
Out[54]=
In[55]:=
ResourceFunction[
 "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)]@*
\*SuperscriptBox[\(g\), \(A\)]\), "ShowArrowLabels" -> True]
Out[55]=

Size

Size of a digram can be controlled:

In[56]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)]@*
\*SuperscriptBox[\(g\), \(A\)]\)]["Diagram", "Size" -> {3, Automatic}]
Out[56]=

ComposeDistance

Specify vertical distance between processes:

In[57]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)]@*
\*SuperscriptBox[\(g\), \(A\)]\)]["Diagram", "ComposeDistance" -> 0.1]
Out[57]=

ParallelComposeDistance

Specify horizontal distance between processes:

In[58]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)]\[CircleTimes]
\*SuperscriptBox[\(g\), \(A\)]\)]["Diagram", "ParallelComposeDistance" -> 0]
Out[58]=

ArrowPosition

Specify relative position of wire arrows:

In[59]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][\!\(
\*SubsuperscriptBox[\(f\), \(A\), \(B\)]@*
\*SuperscriptBox[\(g\), \(A\)]\)]["Diagram", "ArrowPosition" -> 0.9]
Out[59]=

ThickDoubleWire

Thicken double wires:

In[60]:=
GraphicsRow[{ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"]["Double"[
\!\(\*SubsuperscriptBox[\(f\), \(A\), \(B\)]\)]]["Diagram", "AddTerminals" -> True], "\[Rule]", ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"]["Double"[
\!\(\*SubsuperscriptBox[\(f\), \(A\), \(B\)]\)]]["Diagram", "AddTerminals" -> True, "ThickDoubleWire" -> True]}]
Out[60]=

ShowComposites

Reveal composit processes:

In[61]:=
d = ResourceFunction[
   "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][
   "Composite"["MaximallyMixed"[A]\[CircleTimes]"Double"["Id"[A]], "U"]];
GraphicsRow[{d["Diagram", "AddTerminals" -> True, "Outline" -> True], "\[Rule]", d["Diagram", "AddTerminals" -> True, "ShowComposites" -> True, "Outline" -> True]}]
Out[62]=

ShowProcessArrows

There is no arrows draws inside topological processes by default:

In[63]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Cap"[A]@*"Cup"[SuperStar[A]]]["Diagram", "Outline" -> True]
Out[63]=

Show them:

In[64]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"]["Cap"[A]@*"Cup"[SuperStar[A]]]["Diagram", "Outline" -> True, "ShowProcessArrows" -> True]
Out[64]=

Neat Examples

Quantum Teleportation

A diagram of quantum teleportation protocol teleporting state ρ with simplest quantum isometry map U that realizes it and classical channel between them, with its matrix interpretation:

In[65]:=
U = ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][
    "Composite"["MaximallyMixed"[A]\[CircleTimes]"Double"["Id"[A]], "U"]]["Process"];
quantumTeleportation = ResourceFunction[
   "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][("Id"[A]\[CircleTimes]"Dual"[SuperDagger[
       U]])@*("Id"[A]\[CircleTimes]"Encode"[A]\[CircleTimes]"Double"[
       "Id"[A]])@*("Spider"[1, 2, A]\[CircleTimes]"Double"[
       "Id"[A]])@*("Measure"[A]\[CircleTimes]"Double"[
       "Cap"[SuperStar[A]]]\[CircleTimes]"Double"[
       "Id"[A]])@*(U\[CircleTimes]"Double"[
       "Id"[SuperStar[A]]]\[CircleTimes]"Double"[
       "Id"[A]])@*("Double"[\[Rho]^A]\[CircleTimes]"Double"[
       "Cup"[A]])];
GraphicsRow[{quantumTeleportation["Diagram", "AddTerminals" -> True, "Outline" -> True, "ShowWireLabels" -> False, "ThickDoubleWire" -> True, "ShowComposites" -> False],
  "=",
  quantumTeleportation["Diagram", "AddTerminals" -> True, "Outline" -> True, "ShowWireLabels" -> False, "ThickDoubleWire" -> True, "ShowComposites" -> True],
  "\[Implies]",
  quantumTeleportation["Matrix"] // FullSimplify // MatrixForm // TraditionalForm
  }
 ]
Out[66]=

Which is equivalent to:

In[67]:=
GraphicsRow[{ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][
    "Spider"[0, 1, A]\[CircleTimes]"Double"[\[Rho]^A]]["Diagram", "AddTerminals" -> True, "Outline" -> True, "ShowWireLabels" -> False, "ThickDoubleWire" -> True, "ShowComposites" -> False],
  "\[Implies]",
  ResourceFunction[
       "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][
       "Spider"[0, 1, A]\[CircleTimes]"Double"[\[Rho]^A]]["Matrix"] //
      FullSimplify // MatrixForm // TraditionalForm
  }
 ]
Out[67]=

Dense coding

In[68]:=
U = ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][
    "Composite"[
     Labeled[1/Sqrt[2], "d"]\[CircleTimes]"MaximallyMixed"[
       A]\[CircleTimes]"Double"["Id"[A]], "U"]]["Process"];
denseCoding = ResourceFunction[
   "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][(i^A) /* "Encode"[A] /* "Tr"[U@*"Dual"[SuperDagger[U]], 1, 1] /* "Measure"[A]];
In[69]:=
GraphicsRow[{denseCoding["Diagram", "AddTerminals" -> True, "ThickDoubleWire" -> True], "=", ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][i^A]["Diagram", "AddTerminals" -> True], "\[Implies]", denseCoding["Matrix"]}]
Out[69]=

Entanglement swapping

In[70]:=
U = ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][
    "Composite"["Double"["Id"[A]]\[CircleTimes]"MaximallyMixed"[A], "U"]]["Process"];
In[71]:=
nonDemolitionMeasurement = ResourceFunction[
   "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][("Dual"[
\!\(\*OverscriptBox[\(U\), \(_\)]\)]\[CircleTimes]"Double"[
       "Id"[SuperStar[A]]]) /* ("Double"[
       "Id"[A]]\[CircleTimes]"Double"["Cap"[SuperStar[A]]]) /* "Spider"[
\!\(\*UnderoverscriptBox[\(s\), \(
\*SuperscriptBox[\(A\), \(*\)]\[CircleTimes]A\), \({
\*SuperscriptBox[\(A\), \(*\)]\[CircleTimes]A, 
\*SuperscriptBox[\(A\), \(*\)]}\)]\)] /* ("Id"[
       SuperStar[A]\[CircleTimes]A]\[CircleTimes]"Double"[
       "Cup"[SuperStar[A]]]\[CircleTimes]"Id"[SuperStar[
       A]]) /* (Transpose[
      U]\[CircleTimes]"Double"["Id"[SuperStar[A]]]\[CircleTimes]"Id"[
       SuperStar[A]])];
In[72]:=
GraphicsRow[{nonDemolitionMeasurement["Diagram"], "=", nonDemolitionMeasurement["Diagram", "ShowComposites" -> True]}]
Out[72]=
In[73]:=
controledU = ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][
    "Dual"[SuperDagger[
      U]]@*("Double"["Id"[A]]\[CircleTimes]"Encode"[A])]["Process"];
In[74]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][controledU]["Diagram", "ThickDoubleWire" -> True]
Out[74]=
In[75]:=
entanglementSwapping = ResourceFunction[
   "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][("Double"["Cup"[A]]\[CircleTimes]"Double"[
       "Cup"[A]]) /* ("Double"[
       "Id"[SuperStar[A]]]\[CircleTimes]nonDemolitionMeasurement[
       "Process"]\[CircleTimes]"Double"["Id"[A]]) /* ("Double"[
       "Id"[SuperStar[A]]]\[CircleTimes]"Double"[
       "Id"[A]]\[CircleTimes]"Double"[
       "Id"[SuperStar[A]]]\[CircleTimes]"Spider"[1, 2, SuperStar[
       A]]\[CircleTimes]"Double"["Id"[A]]) /* ("Double"[
       "Id"[SuperStar[A]]]\[CircleTimes]"Double"[
       "Id"[A]]\[CircleTimes]"Dual"[controledU\[CircleTimes]
\!\(\*OverscriptBox[\(controledU\), \(_\)]\)])];
entanglementSwapping["Diagram", "AddTerminals" -> True, "ThickDoubleWire" -> True, "ShowComposites" -> False]
Out[76]=
In[77]:=
entanglementSwapping["Matrix"] == 2 ResourceFunction[
    "https://www.wolframcloud.com/obj/murzin.nikolay/\
DeployedResources/Function/DiagramProcess"][
    "Double"[
      "Cup"[A]] /* ("Double"[
        "Id"[SuperStar[A]]]\[CircleTimes]"Double"[
        "Cup"[A]]\[CircleTimes]"Double"["Id"[A]])]["Matrix"]
Out[77]=

Quantum teleportation spider circuit

In[78]:=
ResourceFunction[
  "https://www.wolframcloud.com/obj/murzin.nikolay/DeployedResources/\
Function/DiagramProcess"][("Id"[
      SuperStar[A]\[CircleTimes]A]\[CircleTimes]"Double"[
      "Cup"[SuperStar[A]]]) /* "Circuit"[("Double"[
        "XSpider"[{1, A}, {A, A}]]\[CircleTimes]"CircuitId"[
        SuperStar[A]\[CircleTimes]A]\[CircleTimes]"CircuitId"[
        A\[CircleTimes]SuperStar[A]]) /* ("Spider"[{1, SuperStar[A]\[CircleTimes]A}, {A, 1}]\[CircleTimes]"Double"[
        "Spider"[{A, A}, {A, 1}]]\[CircleTimes]"CircuitId"[
        A\[CircleTimes]SuperStar[A]]) /* ("Spider"[{1, A}, {SuperStar[A]\[CircleTimes]A, 1}]\[CircleTimes]"XSpider"[{1, SuperStar[A]\[CircleTimes]A}, {A, 1}]\[CircleTimes]"CircuitId"[
        A\[CircleTimes]SuperStar[A]]) /* ("CircuitId"[
        SuperStar[A]\[CircleTimes]A]\[CircleTimes]"XSpider"[{1, A}, {SuperStar[A]\[CircleTimes]A, 1}]\[CircleTimes]"CircuitId"[
        A\[CircleTimes]SuperStar[A]]) /* ("Double"[
        "Spider"[{1, A}, {1, A}]]\[CircleTimes]"Double"[
        "Spider"[{1, A}, {1, A}]]\[CircleTimes]"CircuitId"[
        A\[CircleTimes]SuperStar[A]]) /* ("Spider"[
        "Empty"]\[CircleTimes]"Id"[
        SuperStar[A]\[CircleTimes]A]\[CircleTimes]"Double"[
        "Spider"[{A, SuperStar[A]}, {A, 1}]]) /* ("Spider"[
        "Empty"]\[CircleTimes]"Spider"["Empty"]\[CircleTimes]"Double"[
        "XSpider"[{A, A}, {A, 1}]])]]["Diagram", "AddTerminals" -> True, "ThickDoubleWire" -> True, "Interactive" -> False, "Outline" -> True]
Out[78]=

Source Metadata