Source code for pyquest_cffi.utils.dataoperation

"""Manage QuEST environments and quantum registers"""
# Copyright 2019 HQS Quantum Simulations GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from pyquest_cffi.questlib import quest, _PYQUEST, tquestenv, tqureg, paulihamil
from typing import List
from pyquest_cffi import cheat


[docs]class createQuestEnv(_PYQUEST): r"""Creates the QuEST simulator environment, needed for all simulations"""
[docs] def call_interactive(self) -> tquestenv: r"""Interactive call of PyQuest-cffi Returns: tquestenv """ return quest.createQuESTEnv()
[docs]class destroyQuestEnv(_PYQUEST): r"""Deallocate QuEST simulation environment Args: env: QuEST environment to be deallocated """
[docs] def call_interactive(self, env: tquestenv) -> None: r"""Interactive call of PyQuest-cffi Args: env: QuEST environment to be deallocated """ quest.destroyQuESTEnv(env)
[docs]class createQureg(_PYQUEST): r"""Allocate memory for a wavefunction quantum/qubit register (qureg) Args: num_qubits: number of qubits in the quantum register env: QuEST environment in which the qureg exists """
[docs] def call_interactive(self, num_qubits: int, env: tquestenv) -> tqureg: r"""Interactive call of PyQuest-cffi Args: num_qubits: number of qubits in the quantum register env: QuEST environment in which the qureg exists Returns: tqureg """ return quest.createQureg(num_qubits, env)
[docs]class createDensityQureg(_PYQUEST): r"""Allocate memory for a density matrix quantum/qubit register (qureg) Args: num_qubits: number of qubits in the quantum register env: QuEST environment in which the qureg exists """
[docs] def call_interactive(self, num_qubits: int, env: tquestenv) -> tqureg: r"""Interactive call of PyQuest-cffi Args: num_qubits: number of qubits in the quantum register env: QuEST environment in which the qureg exists Returns: tqureg """ return quest.createDensityQureg(num_qubits, env)
[docs]class destroyQureg(_PYQUEST): r"""Deallocate memory for a quantum/qubit register Args: qubits: Qubits in system env: QuEST environment in which the qureg exists """
[docs] def call_interactive(self, qubits: List[int], env: tquestenv) -> None: r"""Interactive call of PyQuest-cffi Args: qubits: Qubits in system env: QuEST environment in which the qureg exists """ quest.destroyQureg(qubits, env)
[docs]class createCloneQureg(_PYQUEST): r"""Create a clone of the qureg in a certain environment Args: qureg: Qureg to be cloned env: QuEST environment the clone is created in """
[docs] def call_interactive(self, qureg: tqureg, env: tquestenv) -> tqureg: r"""Interactive call of PyQuest-cffi Args: qureg: Qureg to be cloned env: QuEST environment the clone is created in Returns: tqureg: cloned qureg """ return quest.createCloneQureg(qureg, env)
[docs]class cloneQureg(_PYQUEST): r"""Clone a qureg state into another one Set qureg_clone to be a clone of qureg_original Args: qureg_original: Qureg to be cloned qureg_clone: Cloned qureg """
[docs] def call_interactive(self, qureg_clone: tqureg, qureg_original: tqureg) -> None: r"""Interactive call of PyQuest-cffi Args: qureg_original: Qureg to be cloned qureg_clone: Cloned qureg Raises: TypeError: The quregs need to be of the same type, so either both density matrices OR both wave functions ValueError: The quregs need to contain the same number of qubits """ if qureg_clone.isDensityMatrix and qureg_original.isDensityMatrix: if cheat.getNumQubits()(qureg=qureg_clone) == cheat.getNumQubits()(qureg=qureg_clone): quest.cloneQureg(qureg_clone, qureg_original) else: raise ValueError("The quregs need to contain the same number of qubits") elif not qureg_clone.isDensityMatrix and not qureg_original.isDensityMatrix: if cheat.getNumQubits()(qureg=qureg_clone) == cheat.getNumQubits()(qureg=qureg_clone): quest.cloneQureg(qureg_clone, qureg_original) else: raise ValueError("The quregs need to contain the same number of qubits") else: raise TypeError("The quregs need to be of the same type, so either both " + "density matrices OR both wave functions")
[docs]class createPauliHamil(_PYQUEST): r"""Create a Hamiltonian expressed as a real-weighted sum of products of Pauli operators Args: number_qubits: the number of qubits on which this Hamiltonian acts number_pauliprods: the number of weighted terms in the sum, or the number of Pauli products """
[docs] def call_interactive(self, number_qubits: int, number_pauliprods: int) -> 'quest.PauliHamil': r"""Interactive call of PyQuest-cffi Args: number_qubits: the number of qubits on which this Hamiltonian acts number_pauliprods: the number of weighted terms in the sum/number of Pauli products Returns: PauliHamil: created Pauli Hamiltonian Raises: RuntimeError: number_qubits and number_pauliprods need to be positive integers """ if number_pauliprods <= 0 or number_pauliprods <= 0: raise RuntimeError("number_qubits and number_pauliprods need to be positive integers") return quest.createPauliHamil(number_qubits, number_pauliprods)
[docs]class destroyPauliHamil(_PYQUEST): r"""Destroy a PauliHamil instance Args: pauli_hamil: PauliHamil to be destroyed """
[docs] def call_interactive(self, pauli_hamil: paulihamil) -> None: r"""Interactive call of PyQuest-cffi Args: pauli_hamil: PauliHamil to be destroyed """ quest.destroyPauliHamil(pauli_hamil)