Esempio n. 1
0
    def simulate(self, variables, *args, **kwargs):
        self.update_variables(variables)
        result = []
        for H in self.H:
            final_E = 0.0
            if self.use_mapping:
                # The hamiltonian can be defined on more qubits as the unitaries
                qubits_h = H.qubits
                qubits_u = self.U.qubits
                all_qubits = list(
                    set(qubits_h) | set(qubits_u)
                    | set(range(self.U.abstract_circuit.max_qubit() + 1)))
                keymap = KeyMapSubregisterToRegister(subregister=qubits_u,
                                                     register=all_qubits)
            else:
                if H.qubits != self.U.qubits:
                    raise TequilaException(
                        "Can not compute expectation value without using qubit mappings."
                        " Your Hamiltonian and your Unitary do not act on the same set of qubits. "
                        "Hamiltonian acts on {}, Unitary acts on {}".format(
                            H.qubits, self.U.qubits))
                keymap = KeyMapSubregisterToRegister(subregister=self.U.qubits,
                                                     register=self.U.qubits)
            # TODO inefficient, let the backend do it if possible or interface some library
            simresult = self.U.simulate(variables=variables, *args, **kwargs)
            wfn = simresult.apply_keymap(keymap=keymap)
            final_E += wfn.compute_expectationvalue(operator=H)

            result.append(to_float(final_E))
        return numpy.asarray(result)
Esempio n. 2
0
    def simulate(self, variables, initial_state=0, *args, **kwargs) -> QubitWaveFunction:
        """
        Simulate the wavefunction
        :param returntype: specifies how the result should be given back
        :param initial_state: The initial state of the simulation,
        if given as an integer this is interpreted as the corresponding multi-qubit basis state
        :return: The resulting state
        """
        self.update_variables(variables)
        if isinstance(initial_state, BitString):
            initial_state = initial_state.integer
        if isinstance(initial_state, QubitWaveFunction):
            if len(initial_state.keys()) != 1:
                raise TequilaException("only product states as initial states accepted")
            initial_state = list(initial_state.keys())[0].integer

        all_qubits = [i for i in range(self.abstract_circuit.n_qubits)]
        if self.use_mapping:
            active_qubits = self.abstract_circuit.qubits
            # maps from reduced register to full register
            keymap = KeyMapSubregisterToRegister(subregister=active_qubits, register=all_qubits)
        else:
            keymap = KeyMapSubregisterToRegister(subregister=all_qubits, register=all_qubits)

        result = self.do_simulate(variables=variables, initial_state=keymap.inverted(initial_state).integer, *args, **kwargs)
        result.apply_keymap(keymap=keymap, initial_state=initial_state)
        return result
Esempio n. 3
0
    def simulate(self,
                 variables,
                 initial_state=0,
                 *args,
                 **kwargs) -> QubitWaveFunction:
        """
        simulate the circuit via the backend.

        Parameters
        ----------
        variables:
            the parameters with which to simulate the circuit.
        initial_state: Default = 0:
            one of several types; determines the base state onto which the circuit is applied.
            Default: the circuit is applied to the all-zero state.
        args
        kwargs

        Returns
        -------
        QubitWaveFunction:
            the wavefunction of the system produced by the action of the circuit on the initial state.

        """

        self.update_variables(variables)
        if isinstance(initial_state, BitString):
            initial_state = initial_state.integer
        if isinstance(initial_state, QubitWaveFunction):
            if len(initial_state.keys()) != 1:
                return self.do_simulate(variables=variables,
                                        initial_state=initial_state,
                                        *args,
                                        **kwargs)
            initial_state = list(initial_state.keys())[0].integer
        if isinstance(initial_state, np.ndarray):
            return self.do_simulate(variables=variables,
                                    initial_state=initial_state,
                                    *args,
                                    **kwargs)
        all_qubits = [i for i in range(self.abstract_circuit.n_qubits)]
        active_qubits = self.abstract_circuit.qubits
        # maps from reduced register to full register
        keymap = KeyMapSubregisterToRegister(subregister=active_qubits,
                                             register=all_qubits)

        result = self.do_simulate(
            variables=variables,
            initial_state=keymap.inverted(initial_state).integer,
            *args,
            **kwargs)
        return result
Esempio n. 4
0
    def simulate(self, variables, *args, **kwargs):
        """
        Simulate the expectationvalue.

        Parameters
        ----------
        variables:
            variables to supply to the unitary.
        args
        kwargs

        Returns
        -------
        numpy array:
            the result of simulation.
        """
        self.update_variables(variables)
        result = []
        for H in self.H:
            final_E = 0.0
            # The hamiltonian can be defined on more qubits as the unitaries
            qubits_h = H.qubits
            qubits_u = self.U.abstract_qubits
            all_qubits = list(
                set(qubits_h) | set(qubits_u)
                | set(range(self.U.abstract_circuit.max_qubit() + 1)))
            keymap = KeyMapSubregisterToRegister(subregister=qubits_u,
                                                 register=all_qubits)
            # TODO inefficient, let the backend do it if possible or interface some library
            simresult = self.U.simulate(variables=variables, *args, **kwargs)
            wfn = simresult.apply_keymap(keymap=keymap)
            final_E += wfn.compute_expectationvalue(operator=H)

            result.append(to_float(final_E))
        return numpy.asarray(result)
Esempio n. 5
0
def test_keymaps():
    initial_state = 0

    small = QubitWaveFunction.from_int(i=int("0b1111", 2))
    large = QubitWaveFunction.from_int(i=int("0b01010101", 2))
    large.n_qubits = 8

    keymap = KeyMapSubregisterToRegister(register=[0, 1, 2, 3, 4, 5, 6, 7], subregister=[1, 3, 5, 7])

    assert (small.apply_keymap(keymap=keymap, initial_state=initial_state).isclose(large))