Skip to main content

discopy

DisCoPy: Python library for computing with string diagrams - monoidal categories, quantum circuits, QNLP, operads, and tensor networks.

Ir para a instalação

Informações da origem

Repositório
plurigrid/asi
Última atividade na origem
10 de junho de 2026 às 11:55
Idioma detectado do SKILL.md
inglês
Estrelas
64
Forks
12

Opções de instalação

Por padrão, está selecionado o prompt que primeiro revisa a origem. Você pode mudar para um comando direto ou baixar uma cópia local.

Revise os arquivos de origem

Leia o SKILL.md e os arquivos complementares exibidos pelo SkillsMP antes de decidir se vai instalar.

Explorador de arquivos
2 arquivos

Exibindo SKILL.md

SKILL.md
Instruções da origem · Visualização somente leitura
name
discopy
description
DisCoPy: Python library for computing with string diagrams - monoidal categories, quantum circuits, QNLP, operads, and tensor networks.
license
BSD-3-Clause
metadata
{"source":"discopy/discopy + DeepWiki (8 interactions 2025-12-22)","xenomodern":true,"ironic_detachment":0.42,"trit":0,"version":"2.0.0","triangulated":"2025-12-22T00:00:00.000Z"}
# DisCoPy: String Diagrams in Python > *"String diagrams are the syntax, functors are the semantics."* ## Overview DisCoPy is a Python library for computing with **string diagrams** - the graphical language of monoidal categories. It provides: 1. **Categorical Framework**: Ty, Ob, Box, Arrow, Diagram, Category 2. **Operads**: CFG as free operads, operad algebras, colored operads 3. **Quantum Computing**: Circuits, gates, ZX-calculus, pytket/qiskit integration 4. **QNLP**: Pregroup grammars, DisCoCat, ansätze for quantum NLP 5. **Tensor Networks**: NumPy/JAX/PyTorch backends, tensornetwork contraction 6. **Visualization**: Matplotlib/TikZ drawing with color customization --- ## Core Architecture (DeepWiki 2025-12-22) ### Class Hierarchy ``` Category ├── ob: Ob (objects/systems) └── ar: Arrow (morphisms/processes) Ob → Ty (monoidal: tuple of objects, tensor = concatenation) Arrow → Diagram (monoidal: boxes + offsets, parallel composition) └── Box (atomic operations with dom/cod) ``` ### Composition Operators | Operator | Method | Description | |----------|--------|-------------| | `>>` | `then` | Sequential: f >> g (f.cod == g.dom) | | `@` | `tensor` | Parallel: f @ g (side-by-side) | | `[::-1]` | `dagger` | Adjoint/reverse | ```python from discopy.monoidal import Ty, Box, Diagram x, y, z = Ty('x'), Ty('y'), Ty('z') f = Box('f', x, y) g = Box('g', y, z) # Sequential: x → y → z sequential = f >> g # Parallel: x ⊗ y → y ⊗ z parallel = f @ g # Both: (f ⊗ id) >> (id ⊗ g) mixed = f @ Diagram.id(y) >> Diagram.id(y) @ g ``` --- ## Operads (DeepWiki 2025-12-22) DisCoPy implements operads via `discopy.grammar.cfg`: ### Operad Structure - **Colors**: `Ty` objects (types of operations) - **Operations**: `Tree` objects (composable rules) - **Algebras**: `Functor` from free operad to target operad ```python from discopy.grammar.cfg import Ty, Rule, Word, Tree # Define colors (types) n, v, s = Ty('N'), Ty('V'), Ty('S') vp, np = Ty('VP'), Ty('NP') # Define operations (rules) Caesar = Word('Caesar', n) crossed = Word('crossed', v) VP = Rule(n @ v, vp) NP = Rule(Ty('D') @ n, np) S = Rule(vp @ np, s) # Build tree (operadic composition) sentence = S(VP(Caesar, crossed), NP(Word('the', Ty('D')), Word('Rubicon', n))) # Axioms of multicategories (operads) hold on the nose ``` ### Colored Operads Types (`Ty`) act as colors - operations can have different input/output colors: ```python x, y = Ty('x'), Ty('y') f = Rule(x @ x, x, name='f') # x ⊗ x → x g = Rule(x @ y, x, name='g') # x ⊗ y → x h = Rule(y @ x, x, name='h') # y ⊗ x → x # Operadic composition assert f(g, h) == Tree(f, *[g, h]) ``` --- ## Color Configuration (DeepWiki 2025-12-22) ### Default Color Palette ```python from discopy.config import COLORS COLORS = { "white": "#ffffff", "red": "#e8a5a5", "green": "#d8f8d8", "blue": "#776ff3", "yellow": "#f7f700", "black": "#000000" } ``` ### ZX-Calculus Colors ```python from discopy.quantum.zx import Z, X, Y # Z spiders: GREEN Z(1, 1, phase=0.5).color # "green" # X spiders: RED X(1, 1, phase=0.25).color # "red" # Y spiders: BLUE Y(1, 1).color # "blue" ``` ### Custom Box Colors ```python from discopy.monoidal import Ty, Box x = Ty('x') blue_box = Box('f', x, x, color="blue") blue_box.draw() # Spider with custom color from discopy.frobenius import Spider spider = Spider(2, 3, x) spider.color = "red" spider.draw_as_spider = True ``` ### Drawing API ```python diagram.draw( figsize=(8, 6), color="blue", # Default box color draw_as_nodes=True, # Draw boxes as nodes wire_labels=True, # Show type labels on wires draw_box_labels=True, # Show box names path="output.png", # Save to file to_tikz=True # Output TikZ code ) ``` --- ## Quantum Computing (DeepWiki 2025-12-22) ### Quantum Circuits ```python from discopy.quantum import qubit, H, X, CX, Ket, Bra, Measure # Bell state preparation bell = Ket(0, 0) >> H @ qubit >> CX # Evaluation state_vector = bell.eval() # Returns Tensor[complex] # Measurement probability experiment = Ket(0, 0) >> bell >> Bra(0, 0) amplitude = experiment.eval().array probability = abs(amplitude) ** 2 ``` ### Gate Library | Gate | Description | Code | |------|-------------|------| | H | Hadamard | `H` | | X, Y, Z | Pauli | `X`, `Y`, `Z` | | CX, CZ | Controlled | `CX`, `CZ` | | Rx, Ry, Rz | Rotation | `Rx(phase)`, `Ry(phase)`, `Rz(phase)` | | Ket, Bra | State prep/measure | `Ket(0, 1)`, `Bra(0, 0)` | ### External Integration ```python # pytket integration from discopy.quantum.tk import mockBackend circuit = H @ qubit >> CX >> Measure() @ Measure() tk_circuit = circuit.to_tk() # Convert to pytket # Run on backend backend = mockBackend({(0, 1): 512, (1, 0): 512}) counts = circuit.eval(backend=backend, n_shots=1024) # PennyLane integration pennylane_qnode = circuit.to_pennylane() ``` ### ZX-Calculus ```python from discopy.quantum.zx import Z, X, circuit2zx # Convert circuit to ZX diagram zx_diagram = circuit2zx(circuit) # Z spider (green) with phase z_spider = Z(2, 1, phase=0.5) # X spider (red) with phase x_spider = X(1, 2, phase=0.25) # PyZX integration for optimization pyzx_graph = zx_diagram.to_pyzx() # Apply PyZX simplification algorithms simplified = pyzx_graph.simplify() ``` --- ## QNLP (DeepWiki 2025-12-22) ### Pregroup Grammar ```python from discopy.grammar.pregroup import Ty, Word, Cup, Diagram s, n = Ty('s'), Ty('n') Alice = Word('Alice', n) loves = Word('loves', n.r @ s @ n.l) Bob = Word('Bob', n) # Parse sentence sentence = Alice @ loves @ Bob >> Cup(n, n.r) @ s @ Cup(n.l, n) sentence.draw() ``` ### DisCoCat: Diagrams to Quantum Circuits ```python from discopy.quantum import circuit, qubit, Ket, H, CX from discopy.cat import Category # Define semantic functor F = circuit.Functor( ob={s: qubit ** 0, n: qubit ** 1}, # Type → Qubits ar={ Alice: Ket(0), loves: sqrt(2) @ Ket(0, 0) >> H @ X >> CX, Bob: Ket(1) } ) F.dom = Category(Ty, Diagram) # Apply functor to get quantum circuit quantum_sentence = F(sentence) quantum_sentence.draw() ``` ### Ansätze Parameterized quantum circuits for word meanings: ```python from discopy.quantum.ansatze import IQPAnsatz, Sim14Ansatz # IQP ansatz for nouns noun_ansatz = IQPAnsatz(n_qubits=2, n_layers=3) # Sim14 ansatz for verbs verb_ansatz = Sim14Ansatz(n_qubits=4, n_layers=2) ``` --- ## Tensor Networks (DeepWiki 2025-12-22) ### Multi-Backend Support ```python from discopy.tensor import Tensor, backend import jax.numpy import torch # Default: NumPy assert isinstance(Tensor.id().array, np.ndarray) # JAX backend with backend('jax'): assert isinstance(Tensor.id().array, jax.numpy.ndarray) # PyTorch backend with backend('pytorch'): assert isinstance(Tensor.id().array, torch.Tensor) ``` ### Functor to Tensors ```python from discopy.tensor import Dim, Tensor, Functor from discopy.cat import Category # Define tensor functor F = Functor( ob={n: Dim(2), s: Dim(1)}, ar={ Alice: [1, 0], loves: [[0, 1], [1, 0]], Bob: [0, 1] }, cod=Category(Dim, Tensor) ) result = F(sentence) ``` ### Contraction with tensornetwork ```python import tensornetwork as tn from discopy.tensor import Box, Dim vector = Box('v', Dim(1), Dim(2), [0, 1]) contracted = (vector >> vector[::-1]).eval(contractor=tn.contractors.auto) ``` --- ## Advanced Categories (DeepWiki 2025-12-22) ### Hypergraph Categories ```python from discopy.hypergraph import Hypergraph # Canonical form for diagram equality hyp = diagram.to_hypergraph() # Composition via pushouts ``` ### Frobenius Algebras and Spiders ```python from discopy.frobenius import Spider, Diagram x = Ty('x') # Special commutative Frobenius algebra spider = Spider(n_legs_in=2, n_legs_out=3, typ=x) # Unfuse to canonical primitives primitives = diagram.unfuse() ``` ### Markov Categories ```python from discopy.markov import Copy, Merge, Discard, Diagram x = Ty('x') # Copy wire n times copy = Diagram.copy(x, n=2) # Merge n wires to one merge = Diagram.merge(x, n=2) # Discard wire discard = Diagram.copy(x, n=0) # Copy with n=0 ``` ### Traced Categories ```python from discopy.traced import Diagram # Feedback loop: output fed back to input traced = diagram.trace() ``` --- ## GF(3) Triad Integration DisCoPy as ERGODIC coordinator (trit 0): ``` three-match (-1) ⊗ discopy (0) ⊗ gay-mcp (+1) = 0 ✓ [Diagram Coloring] sheaf-cohomology (-1) ⊗ discopy (0) ⊗ operad-compose (+1) = 0 ✓ [Operadic] proofgeneral-narya (-1) ⊗ discopy (0) ⊗ rubato-composer (+1) = 0 ✓ [Music] persistent-homology (-1) ⊗ discopy (0) ⊗ gay-mcp (+1) = 0 ✓ [Quantum] ``` ### Color ↔ Gay.jl Integration ```python from discopy.monoidal import Box, Ty # Use Gay.jl deterministic colors for boxes def gay_colored_box(name, dom, cod, seed, index): """Create box with deterministic color from Gay.jl""" # Gay.jl: golden angle dispersion hue = ((seed * 0x9E3779B97F4A7C15 + index) >> 16) % 360 hex_color = hsl_to_hex(hue, 0.7, 0.55) return Box(name, dom, cod, color=hex_color) # Example: colored diagram x = Ty('x')
Ver no GitHub
Este SKILL.md e muito grande, entao o SkillsMP mostra aqui apenas a primeira secao. Ver no GitHub