def _replace_pauli_sums(cls, operator):
        try:
            from qiskit.providers.aer.library import SaveExpectationValue
        except ImportError as ex:
            raise MissingOptionalLibraryError(
                libname="qiskit-aer",
                name="AerPauliExpectation",
                pip_install="pip install qiskit-aer",
            ) from ex
        # The 'expval_measurement' label on the save instruction is special - the
        # CircuitSampler will look for it to know that the circuit is a Expectation
        # measurement, and not simply a
        # circuit to replace with a DictStateFn
        if operator.__class__ == ListOp:
            return operator.traverse(cls._replace_pauli_sums)

        if isinstance(operator, PauliSumOp):
            save_instruction = SaveExpectationValue(operator.primitive,
                                                    "expval_measurement")
            return CircuitStateFn(save_instruction,
                                  coeff=operator.coeff,
                                  is_measurement=True,
                                  from_operator=True)

        # Change to Pauli representation if necessary
        if {"Pauli"} != operator.primitive_strings():
            logger.warning(
                "Measured Observable is not composed of only Paulis, converting to "
                "Pauli representation, which can be expensive.")
            # Setting massive=False because this conversion is implicit. User can perform this
            # action on the Observable with massive=True explicitly if they so choose.
            operator = operator.to_pauli_op(massive=False)

        if isinstance(operator, SummedOp):
            sparse_pauli = reduce(add,
                                  (meas.coeff * SparsePauliOp(meas.primitive)
                                   for meas in operator.oplist))
            save_instruction = SaveExpectationValue(sparse_pauli,
                                                    "expval_measurement")
            return CircuitStateFn(save_instruction,
                                  coeff=operator.coeff,
                                  is_measurement=True,
                                  from_operator=True)

        if isinstance(operator, PauliOp):
            sparse_pauli = operator.coeff * SparsePauliOp(operator.primitive)
            save_instruction = SaveExpectationValue(sparse_pauli,
                                                    "expval_measurement")
            return CircuitStateFn(save_instruction,
                                  is_measurement=True,
                                  from_operator=True)

        raise TypeError(
            f"Conversion of OperatorStateFn of {operator.__class__.__name__} is not defined."
        )
Esempio n. 2
0
 def test_pershot_kwarg(self):
     """Test pershot kwarg"""
     key = 'test_key'
     instr = SaveExpectationValue(key, Pauli('X'), pershot=True)
     self.assertEqual(instr.name, 'save_expval')
     self.assertEqual(instr._key, key)
     self.assertEqual(instr._subtype, 'list')
Esempio n. 3
0
 def test_unnorm_kwarg(self):
     """Test unnormalized kwarg"""
     key = 'test_key'
     instr = SaveExpectationValue(key, Pauli('X'), unnormalized=True)
     self.assertEqual(instr.name, 'save_expval')
     self.assertEqual(instr._key, key)
     self.assertEqual(instr._subtype, 'accum')
Esempio n. 4
0
 def test_cond_kwarg(self):
     """Test conditional kwarg"""
     key = 'test_key'
     instr = SaveExpectationValue(key, Pauli('X'), conditional=True)
     self.assertEqual(instr.name, 'save_expval')
     self.assertEqual(instr._key, key)
     self.assertEqual(instr._subtype, 'c_average')
Esempio n. 5
0
 def test_default_kwarg(self):
     """Test default kwargs"""
     key = 'test_key'
     instr = SaveExpectationValue(key, Pauli('X'))
     self.assertEqual(instr.name, 'save_expval')
     self.assertEqual(instr._key, key)
     self.assertEqual(instr._subtype, 'average')
Esempio n. 6
0
 def test_pershot_cond_kwarg(self):
     """Test pershot, conditonal kwargs"""
     key = 'test_key'
     instr = SaveExpectationValue(key,
                                  Pauli('X'),
                                  conditional=True,
                                  pershot=True)
     self.assertEqual(instr.name, 'save_expval')
     self.assertEqual(instr._key, key)
     self.assertEqual(instr._subtype, 'c_list')
Esempio n. 7
0
 def test_unnorm_cond_kwarg(self):
     """Test unnormalized, conditonal kwargs"""
     key = 'test_key'
     instr = SaveExpectationValue(Pauli('X'),
                                  key,
                                  conditional=True,
                                  unnormalized=True)
     self.assertEqual(instr.name, 'save_expval')
     self.assertEqual(instr._label, key)
     self.assertEqual(instr._subtype, 'c_accum')
Esempio n. 8
0
 def test_nonhermitian_raises(self):
     """Test non-Hermitian op raises exception."""
     op = [[0, 1j], [1j, 0]]
     self.assertRaises(ExtensionError,
                       lambda: SaveExpectationValue('expval', op))
Esempio n. 9
0
 def test_invalid_key_raises(self):
     """Test save instruction key is str"""
     self.assertRaises(ExtensionError,
                       lambda: SaveExpectationValue(1, Pauli('Z')))