DisCoPy
DisCoPy is a Python toolkit for computing with string diagrams .
DisCoPy began as an implementation of DisCoCat and QNLP . This has now become its own library: lambeq .
Features
an Arrow
data structure for free dagger categories with formal sums, unary operators and symbolic variables from SymPy a Diagram
data structure for planar string diagrams in any (pre )monoidal category in the hierarchy of graphical languages (with braids, twists, spiders, etc.) a Hypergraph
data structure for string diagrams in hypergraph categories and its restrictions to symmetric, traced, compact and Markov categories methods for diagram composition, drawing, rewriting and Functor
evaluation into:
an implementation of categorical quantum mechanics interfacing with:
an implementation of formal grammars (context-free , categorial , pregroup or dependency ) with interfaces to lambeq , spaCy and NLTK
Example: Cooking
This example is inspired from Pawel Sobocinski's blog post Crema di Mascarpone and Diagrammatic Reasoning .
from discopy.symmetric import Ty as Ingredient, Box as Step, Diagram as Recipe
egg, white, yolk = Ingredient("egg" ), Ingredient("white" ), Ingredient("yolk" )
crack = Step("crack" , egg, white @ yolk)
merge = lambda x: Step("merge" , x @ x, x)
@Recipe.from_callable(egg @ egg, white @ yolk )
def crack_two_eggs (left_egg, right_egg ):
left_white, left_yolk = crack(left_egg)
right_white, right_yolk = crack(right_egg)
return (merge(white)(left_white, right_white),
merge(yolk)(left_yolk, right_yolk))
assert crack_two_eggs == crack @ crack\
>> white @ Recipe.swap(yolk, white) @ yolk\
>> merge(white) @ merge(yolk)
crack_two_eggs.draw()
Quickstart
pip install discopy
If you want to see DisCoPy in action, check out the QNLP tutorial !
Contribute
We're keen to welcome new contributors!
First, read the contributing guidelines .
Then get in touch on Discord
or open an issue .
How to cite
If you used DisCoPy in the context of an academic publication, we suggest you cite:
G. de Felice, A. Toumi & B. Coecke, DisCoPy: Monoidal Categories in Python , EPTCS 333, 2021, pp. 183-197, DOI: 10.4204/EPTCS.333.13
If furthermore your work is related to quantum computing, you can also cite:
A. Toumi, G. de Felice & R. Yeung, DisCoPy for the quantum computer scientist , arXiv:2205.05190
If you use any of the recent features (e.g. Hypergraph
) you should also mention:
A. Toumi, R. Yeung, B. Poór & G. de Felice, DisCoPy: the Hierarchy of Graphical Languages in Python arXiv:2311.10608