Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support QuTiP's Hamiltonian #97

Merged
merged 8 commits into from
Nov 19, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ For optional dependencies:
```bash
pip install qamomile[qiskit] # For Qiskit integration
pip install qamomile[quri-parts] # For QuriParts integration
pip install qamomile[qutip] # For QuTiP integration
```

## Quick Start
Expand Down
40 changes: 39 additions & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ black = "^24.3.0"
quri-parts-circuit = "^0.19.0"
qiskit = "^1.1.1"
matplotlib = "^3.9.2"
qutip = "^5.0.4"


[tool.poetry.group.dev.dependencies]
Expand All @@ -43,7 +44,7 @@ matplotlib = "^3.9.2"
[tool.poetry.extras]
qiskit = ["qiskit"]
quri-parts = ["quri-parts-qulacs"]

qutip = ["qutip"]

[tool.pytest.ini_options]
addopts = "--doctest-modules"
Expand Down
7 changes: 7 additions & 0 deletions qamomile/qutip/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from qamomile.qutip.transpiler import QuTiPTranspiler
from qamomile.qutip.exceptions import QamomileQuTiPTranspileError

__all__ = [
"QuTiPTranspiler",
"QamomileQuTiPTranspileError"
]
4 changes: 4 additions & 0 deletions qamomile/qutip/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class QamomileQuTiPTranspileError(Exception):
"""Exception raised for errors in the Qamomile to QuTiP conversion process."""

pass
76 changes: 76 additions & 0 deletions qamomile/qutip/transpiler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"""
Qamomile to QuTiP Transpiler Module

This module provides functionality to convert Qamomile hamiltonians to their QuTiP equivalents. It includes a QuTiPTranspiler
class that implements the QuantumSDKTranspiler interface for QuTiP compatibility.

Key features:
- Convert Qamomile Hamiltonians to QuTip Hamiltonians

Usage:
from qamomile.qutip.transpiler import QuTiPTranspiler

transpiler = QuTiPTranspiler()
qp_operator = transpiler.transpile_hamiltonian(qamomile_hamiltonian)


Note: This module requires both Qamomile and QuTiP to be installed.
"""

import qamomile.core.operator as qm_o

import collections
from qamomile.core.transpiler import QuantumSDKTranspiler
from qutip import Qobj, sigmaz, sigmax, sigmay, tensor, qzero, qeye

class QuTiPTranspiler(
QuantumSDKTranspiler[tuple[collections.Counter[int], int]]
):
"""
Transpiler class for converting between Qamomile and QuTiP quantum objects.

This class implements the QuantumSDKTranspiler interface for QuTiP compatibility,
providing methods to convert Hamiltonians.
"""

def transpile_hamiltonian(
self,
operator: qm_o.Hamiltonian
) -> Qobj:
"""
Convert a Qamomile Hamiltonian to a QuTiP Hamiltonian.

Args:
operator (qm_o.Hamiltonian): The Qamomile Hamiltonian to convert.

Returns:
Qobj: The converted Hamiltonian.

Raises:
NotImplementedError: If an unsupported Pauli operator is encountered.
"""
n = operator.num_qubits
H = tensor([qzero(2)]*n)
for term, coeff in operator.terms.items():
op_list = [qeye(2)] * n
for pauli in term:
match pauli.pauli:
case qm_o.Pauli.X:
op_list[pauli.index] = sigmax()
case qm_o.Pauli.Y:
op_list[pauli.index] = sigmay()
case qm_o.Pauli.Z:
op_list[pauli.index] = sigmaz()
case _:
raise NotImplementedError("Only Pauli X, Y, and Z are supported")
H += coeff* tensor(op_list)
return Qobj(H)

def transpile_circuit(
self
) -> None:
pass
bluest93 marked this conversation as resolved.
Show resolved Hide resolved
def convert_result(
self
) -> None:
pass
bluest93 marked this conversation as resolved.
Show resolved Hide resolved
22 changes: 22 additions & 0 deletions tests/qutip/test_qutip_transpiler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import pytest
import qamomile.core.operator as qm_o
from qamomile.qutip.transpiler import QuTiPTranspiler
from qutip import Qobj, sigmaz, sigmax, sigmay, tensor

@pytest.fixture
def transpiler():
return QuTiPTranspiler()

def test_transpile_hamiltonian(transpiler):
hamiltonian = qm_o.Hamiltonian()
hamiltonian += qm_o.X(0) * qm_o.Z(1)
qutip_hamiltonian = transpiler.transpile_hamiltonian(hamiltonian)

assert isinstance(qutip_hamiltonian, Qobj)
assert qutip_hamiltonian.shape == (2**hamiltonian.num_qubits, 2**hamiltonian.num_qubits)

hamiltonian2 = qm_o.Hamiltonian()
hamiltonian2 += qm_o.X(0) * qm_o.Y(1) + qm_o.Z(0) * qm_o.X(1)
qutip_hamiltonian2 = transpiler.transpile_hamiltonian(hamiltonian2)
H = tensor([sigmax(),sigmay()]) + tensor([sigmaz(),sigmax()])
assert H == qutip_hamiltonian2
Loading