Metadata-Version: 2.4
Name: parityos-qiskit
Version: 0.1.0
Summary: Qiskit extension for ParityOS
Project-URL: Homepage, https://parityqc.com/
Author-email: ParityQC <parityos@parityqc.com>
License-Expression: BSD-3-Clause
License-File: LICENSE.txt
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: attrs
Requires-Dist: parityos>=3.0.0
Requires-Dist: qiskit-addon-opt-mapper==0.1.0
Requires-Dist: qiskit-aer
Requires-Dist: qiskit-ibm-runtime
Requires-Dist: qiskit<3.0,>2.0
Requires-Dist: sympy
Description-Content-Type: text/markdown

# ParityOS Qiskit

ParityOS extension adding an interface to [Qiskit](https://www.ibm.com/quantum/qiskit). 

## Installation

It is recommended to install this package in a separate Python virtual environment. For example:

```shell
# To create a standard Python virtual environment:
python -m venv my_new_venv && source my_new_venv/bin/activate
# Alternatively, to create a Anaconda/Miniconda environment:
conda create --name my_new_conda_env python=<version> && conda activate my_new_conda_env
# or a pyenv environment
pyenv virtualenv <version> my_new_venv && pyenv activate my_new_venv
# or a uv managed environment
uv venv -p <version>
```
where `<version>` is a python version and one of `[3.11, 3.12, 3.13]`.

After activating the virtual environment, install via your favorite package manager, e.g.:

```shell
# using pip
pip install parityos-qiskit
# using uv
uv pip install parityos-qiskit
```

## Exporter

`parityos-qiskit` offers an exporter of ParityOS to Qiskit quantum circuits.

```python
from parityos.bits import get_q
from parityos.operators.circuit import Circuit
from parityos.operators.controlled_operator import CNOT
from parityos.operators.elementary_operator import H, Z
from parityos.operators.rotation_operator import RX
from parityos_qiskit.exporter import export_parityos_to_qiskit

# Create circuit qubits.
qubits = [get_q(name) for name in ("a", "b", "c")]

# Create the following circuit as sequence of gates, followed by a measurement of all qubits.
#     ┌───────┐┌───┐┌───┐   ┌─┐
# qa: ┤ Rx(2) ├┤ H ├┤ Z ├───┤M├
#     └───────┘├───┤└┬─┬┘   └╥┘
# qb: ─────────┤ X ├─┤M├─────╫─
#       ┌───┐  └─┬─┘ └╥┘ ┌─┐ ║ 
# qc: ──┤ H ├────■────╫──┤M├─╫─
#       └───┘         ║  └╥┘ ║ 
# c: 3/═══════════════╩═══╩══╩═
#                     1   2  0 
circuit = Circuit(
    [
        RX(qubits[0], 2),
        H(qubits[0]),
        H(qubits[2]),
        CNOT(qubits[2], qubits[1]),
        Z(qubits[0]),
    ]
).measure_all()

# Export to Qiskit. 
# Qiskit qubits are integer labeled. Passing `qubits` explicitly controls how ParityOS qubits are
# mapped to Qiskit qubits.
qiskit_result = export_parityos_to_qiskit(circuit, qubits=reversed(qubits))

print(qiskit_result.circuit.draw("text"))
#        ┌───┐               ┌─┐   
# q_0: ──┤ H ├────■──────────┤M├───
#        └───┘  ┌─┴─┐     ┌─┐└╥┘   
# q_1: ─────────┤ X ├─────┤M├─╫────
#      ┌───────┐├───┤┌───┐└╥┘ ║ ┌─┐
# q_2: ┤ Rx(2) ├┤ H ├┤ Z ├─╫──╫─┤M├
#      └───────┘└───┘└───┘ ║  ║ └╥┘
# c: 3/════════════════════╩══╩══╩═
#                          1  2  0 

print(qiskit_result.qubit_map)  # Maps ParityOS qubits to Qiskit Qubit integer labels
# {Qubit(id='c'): 0, Qubit(id='b'): 1, Qubit(id='a'): 2}

print(qiskit_result.cbit_map)  # Maps ParityOS cbits to Qiskit Clbit integer labels
# {Cbit(id=0): 0, Cbit(id=1): 1, Cbit(id=2): 2}
```

## License

This software package is made available under the 3-Clause BSD License. 
See `License.txt` for details.
