コード例 #1
0
    def expand(self):

        weights = self.parameters[0]

        with qml.tape.QuantumTape() as tape:

            for i, pauli_word in enumerate(
                    _all_pauli_words_but_identity(len(self.wires))):
                PauliRot(weights[i], pauli_word, wires=self.wires)

        return tape
コード例 #2
0
    def expand(self):

        hamiltonian = self.parameters[0]
        time = self.parameters[1]
        n = self.parameters[2]

        pauli = {"Identity": "I", "PauliX": "X", "PauliY": "Y", "PauliZ": "Z"}

        theta = []
        pauli_words = []
        wires = []

        for i, term in enumerate(hamiltonian.ops):

            word = ""

            try:
                if isinstance(term.name, str):
                    word = pauli[term.name]

                if isinstance(term.name, list):
                    word = "".join(pauli[j] for j in term.name)

            except KeyError as error:
                raise ValueError(
                    "hamiltonian must be written in terms of Pauli matrices, got {}".format(error)
                ) from error

            # skips terms composed solely of identities
            if word.count("I") != len(word):
                theta.append((2 * time * hamiltonian.coeffs[i]) / n)
                pauli_words.append(word)
                wires.append(term.wires)

        with qml.tape.QuantumTape() as tape:

            for i in range(n):
                for j, term in enumerate(pauli_words):
                    PauliRot(theta[j], term, wires=wires[j])

        return tape