quPython
pip install qupython
quPython compiles Python functions into quantum programs, executes the
programs, and returns the results as bool-like objects.
Initialize a quPython.Qubit object just like any other object and use it
inside a @quantum function. These are the only two imports you'll need.
from qupython import Qubit, quantum
@quantum
def random_bit():
qubit = Qubit() # Allocate new qubit
qubit.h() # Mutate qubit
return qubit.measure() # Measure qubit to bool
When you run random_bit, quPython compiles your function to a quantum
program, executes it, and returns results.
>>> random_bit()
True
Python-like data management
Create classes for quantum data just as you would conventional data. The following example creates a simple logical qubit class. See the Logical qubit example for a more complete class.
from qupython import Qubit, quantum
from qupython.typing import BitPromise
class LogicalQubit:
"""
Simple logical qubit using the five-qubit code.
See https://en.wikipedia.org/wiki/Five-qubit_error_correcting_code
"""
def __init__(self):
"""
Create new logical qubit and initialize to logical |0>.
Uses initialization procedure from https://quantumcomputing.stackexchange.com/a/14449
"""
self.qubits = [Qubit() for _ in range(5)]
self.qubits[4].z()
for q in self.qubits[:4]:
q.h()
with q.as_control():
self.qubits[4].x()
for a, b in [(0,4),(0,1),(2,3),(1,2),(3,4)]:
with self.qubits[b].as_control():
self.qubits[a].z()
def measure(self) -> BitPromise:
"""
Measure logical qubit to single classical bit
"""
out = Qubit().h()
for q in self.qubits:
with out.as_control():
q.z()
return out.h().measure()
This abstracts the bit-level operations away from the user.
@quantum
def logical_qubit_demo() -> BitPromise:
q = LogicalQubit()
return q.measure()
>>> logical_qubit_demo()
False
Generate Qiskit circuits
If you want, you can just use quPython to create Qiskit circuits with Pythonic
syntax (rather than the assembly-like syntax of qc.cx(0, 1) in native
Qiskit).
# Compile using quPython
logical_qubit_demo.compile()
# Draw compiled Qiskit circuit
logical_qubit_demo.circuit.draw()
┌───┐
q_0: ┤ H ├────────────■────────■───────────■─────■───────────────
├───┤ │ │ │ │
q_1: ┤ H ├──■─────────┼────────┼──■──■──■──┼─────┼───────────────
├───┤ │ │ │ │ │ │ │ │
q_2: ┤ H ├──┼────■────┼────────┼──┼──■──┼──■──■──┼───────────────
├───┤┌─┴─┐┌─┴─┐┌─┴─┐┌───┐ │ │ │ │ │
q_3: ┤ Z ├┤ X ├┤ X ├┤ X ├┤ X ├─┼──■──■──┼─────┼──┼─────■─────────
├───┤└───┘└───┘└───┘└─┬─┘ │ │ │ │ │ │ ┌───┐┌─┐
q_4: ┤ H ├─────────────────┼───┼─────┼──■─────■──■──■──■─┤ H ├┤M├
├───┤ │ │ │ │ └───┘└╥┘
q_5: ┤ H ├─────────────────■───■─────■──────────────■──────────╫─
└───┘ ║
c: 1/══════════════════════════════════════════════════════════╩═
0
You can compile the function without executing it, optimize the cirucit, execute it however you like, then use quPython to interpret the results.
from qiskit_aer.primitives import Sampler
qiskit_result = Sampler().run(logical_qubit_demo.circuit).result()
logical_qubit_demo.interpret_result(qiskit_result) # returns `False`
Metadata
Release files for qupython 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| qupython-0.2.0.tar.gz | 11.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| qupython-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 22.2 kB
Release files / qupython-0.2.0.tar.gz
| Download URL | qupython-0.2.0.tar.gz |
|---|---|
| Size | 11.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
b4384f4fd76b0c99f1b65433748a6905da3052a8d9faf93f72a9e639755a6536
|
|
BLAKE2b-256 checksum How to use checksums |
7426e941be27d5630f65e6fc01e7ad4bc292a6e584eb177d3715aa79bac64ec0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/5.0.0 CPython/3.12.2
|
Release files / qupython-0.2.0-py3-none-any.whl
| Download URL | qupython-0.2.0-py3-none-any.whl |
|---|---|
| Size | 10.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d1d69de568d0eaea0e87d0cdecfa0ee31ad7d587ec079b92801e9c2d3be034c9
|
|
BLAKE2b-256 checksum How to use checksums |
02ea16b3fb7752b3d9e45bfd53dde573e04796b0ade299c1a63f4e59f9f360bc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/5.0.0 CPython/3.12.2
|