def test_unary_states(target_space: list):
    UPS = UnaryStatePrep(target_space=target_space)
    qubits = len(target_space)
    coeff = 1.0 / numpy.sqrt(
        qubits
    )  # fails for the 3-Qubit Case because the wrong sign is picked in the solution
    coeffs = [coeff for i in range(qubits)]

    wfn = QubitWaveFunction()
    for i, c in enumerate(coeffs):
        wfn += c * QubitWaveFunction.from_string("1.0|" + target_space[i] +
                                                 ">")

    U = UPS(wfn=wfn)
    wfn = BackendCircuitSymbolic(abstract_circuit=U,
                                 variables=None).simulate(variables=None)

    checksum = 0.0
    for k, v in wfn.items():
        assert (v.imag == 0.0)
        vv = numpy.float(v.real)
        cc = numpy.float(coeff.real)
        assert (numpy.isclose(vv, cc, atol=1.e-4))
        checksum += vv

    assert (numpy.isclose(checksum, qubits * coeff, atol=1.e-4))
def test_random_instances(target_space):

    # can happen that a tests fails, just start again ... if all tests fail: start to worry
    # it happens from time to time that UPS can not disentangle
    # it will throw the error/
    # OpenVQEException: Could not disentangle the given state after 100 restarts
    qubits = len(target_space)
    coeffs = numpy.random.uniform(0, 1, qubits)

    wfn = QubitWaveFunction()
    for i, c in enumerate(coeffs):
        wfn += c * QubitWaveFunction.from_string("1.0|" + target_space[i] +
                                                 ">")
    wfn = wfn.normalize()

    try:
        UPS = UnaryStatePrep(target_space=target_space)
        U = UPS(wfn=wfn)

        # now the coeffs are normalized
        bf2c = dict()
        for i, c in enumerate(coeffs):
            bf2c[target_space[i]] = coeffs[i]

        wfn2 = tequila.simulators.simulator_api.simulate(U,
                                                         initial_state=0,
                                                         variables=None)

        for k, v in wfn.items():
            assert (numpy.isclose(wfn2[k], v))

    except TequilaUnaryStateException:
        print("caught a tolerated excpetion")
Example #3
0
    def do_sample(self,
                  samples,
                  circuit,
                  noise_model=None,
                  initial_state=None,
                  *args,
                  **kwargs) -> QubitWaveFunction:
        """
        Helper function for performing sampling.

        Parameters
        ----------
        samples: int:
            the number of samples to be taken.
        circuit:
            the circuit to sample from.
        noise_model: optional:
            noise model to be applied to the circuit.
        initial_state:
            sampling supports initial states for qulacs. Indicates the initial state to which circuit is applied.
        args
        kwargs

        Returns
        -------
        QubitWaveFunction:
            the results of sampling, as a Qubit Wave Function.
        """
        n_qubits = max(self.highest_qubit + 1, self.n_qubits,
                       self.abstract_circuit.max_qubit() + 1)
        if initial_state is not None:
            if isinstance(initial_state, int):
                wave = QubitWaveFunction.from_int(i=initial_state,
                                                  n_qubits=n_qubits)
            elif isinstance(initial_state, str):
                wave = QubitWaveFunction.from_string(
                    string=initial_state).to_array()
            elif isinstance(initial_state, QubitWaveFunction):
                wave = initial_state
            elif isinstance(initial_state, np.ndarray):
                wave = QubitWaveFunction.from_array(
                    arr=initial_state,
                    n_qubits=n_qubits)  # silly but necessary
            else:
                raise TequilaQiboException(
                    'received an unusable initial state of type {}'.format(
                        type(initial_state)))
            state = wave.to_array()
            result = circuit(state, nshots=samples)
        else:
            result = circuit(nshots=samples)

        back = self.convert_measurements(backend_result=result)
        return back
Example #4
0
    def do_simulate(self, variables, initial_state=None, *args, **kwargs):
        """
        Helper function to perform simulation.

        Parameters
        ----------
        variables: dict:
            variables to supply to the circuit.
        initial_state:
            information indicating the initial state on which the circuit should act.
        args
        kwargs

        Returns
        -------
        QubitWaveFunction:
            QubitWaveFunction representing result of the simulation.
        """
        n_qubits = max(self.highest_qubit + 1, self.n_qubits,
                       self.abstract_circuit.max_qubit() + 1)
        if initial_state is not None:
            if isinstance(initial_state, int) or isinstance(
                    initial_state, np.int):
                wave = QubitWaveFunction.from_int(i=initial_state,
                                                  n_qubits=n_qubits)
            elif isinstance(initial_state, str):
                wave = QubitWaveFunction.from_string(
                    string=initial_state).to_array()
            elif isinstance(initial_state, QubitWaveFunction):
                wave = initial_state
            elif isinstance(initial_state, np.ndarray):
                wave = QubitWaveFunction.from_array(initial_state)
            else:
                raise TequilaQiboException(
                    'could not understand initial state of type {}'.format(
                        type(initial_state)))
            state = wave.to_array()
            result = self.circuit(state)
        else:
            result = self.circuit()
        back = QubitWaveFunction.from_array(arr=result.numpy())
        return back
import tequila.simulators.simulator_api
from tequila.apps import UnaryStatePrep
from tequila.apps.unary_state_prep import TequilaUnaryStateException
import numpy
from tequila import BitString
from tequila.simulators.simulator_api import BackendCircuitSymbolic
from tequila.wavefunction.qubit_wavefunction import QubitWaveFunction
import pytest


@pytest.mark.parametrize(
    "target_space",
    [['00', '11'], ['01', '11'], ['001', '010', '100'], ['0011', '1010'],
     QubitWaveFunction.from_string("1.0|00> - 2.0|11>")])
def test_construction(target_space: list):
    print("ts=", target_space)
    UPS = UnaryStatePrep(target_space=target_space)


@pytest.mark.parametrize(
    "target_space",
    [['01', '10'], ['001', '010', '100'], ['0011', '0110', '1100', '1001']])
def test_unary_states(target_space: list):
    UPS = UnaryStatePrep(target_space=target_space)
    qubits = len(target_space)
    coeff = 1.0 / numpy.sqrt(
        qubits
    )  # fails for the 3-Qubit Case because the wrong sign is picked in the solution
    coeffs = [coeff for i in range(qubits)]

    wfn = QubitWaveFunction()