diff --git a/qiskit/circuit/parameterexpression.py b/qiskit/circuit/parameterexpression.py index 68f093c1125e..31879cf57e31 100644 --- a/qiskit/circuit/parameterexpression.py +++ b/qiskit/circuit/parameterexpression.py @@ -535,11 +535,10 @@ def is_real(self): # expression's is_real attribute returns false that we have a # non-zero imaginary if _optionals.HAS_SYMENGINE: - if symbol_expr.imag != 0.0: - return False - else: - return False - return True + if symbol_expr.imag == 0.0: + return True + return False + return symbol_expr.is_real def sympify(self): """Return symbolic expression as a raw Sympy or Symengine object. diff --git a/releasenotes/notes/fix-parameter-is_real-8b8f99811e58075e.yaml b/releasenotes/notes/fix-parameter-is_real-8b8f99811e58075e.yaml new file mode 100644 index 000000000000..9ac6d184beae --- /dev/null +++ b/releasenotes/notes/fix-parameter-is_real-8b8f99811e58075e.yaml @@ -0,0 +1,6 @@ +--- +fixes: + - | + Fixed a bug where :meth:`.Parameter.is_real` did not return ``None`` when + the parameter is not bound. + Fixed `#8619 `__. diff --git a/test/python/circuit/test_parameters.py b/test/python/circuit/test_parameters.py index 74ac785d9448..5f49f026a7a5 100644 --- a/test/python/circuit/test_parameters.py +++ b/test/python/circuit/test_parameters.py @@ -1759,10 +1759,24 @@ def test_parameter_expression_grad(self): def test_bound_expression_is_real(self): """Test is_real on bound parameters.""" x = Parameter("x") + self.assertEqual(x.is_real(), None) + self.assertEqual((1j * x).is_real(), None) + expr = 1j * x bound = expr.bind({x: 2}) + self.assertEqual(bound.is_real(), False) + + bound = x.bind({x: 0 + 0j}) + self.assertEqual(bound.is_real(), True) + + bound = x.bind({x: 0 + 1j}) + self.assertEqual(bound.is_real(), False) + + bound = x.bind({x: 1 + 0j}) + self.assertEqual(bound.is_real(), True) - self.assertFalse(bound.is_real()) + bound = x.bind({x: 1 + 1j}) + self.assertEqual(bound.is_real(), False) class TestParameterEquality(QiskitTestCase):