From 0c318c2834109b18356b739b4093ea17bc83ff21 Mon Sep 17 00:00:00 2001 From: Sameer Dambal Date: Tue, 19 Sep 2023 23:39:50 -0400 Subject: [PATCH] Add sign() method to ParameterExpression This method allows applying the sign operation to an expression with possibly unassigned parameters. --- qiskit/circuit/parameterexpression.py | 11 +++++++++++ ...e-parameterexpression-57693dd69103dc8c.yaml | 18 ++++++++++++++++++ test/python/circuit/test_parameters.py | 9 +++++++++ 3 files changed, 38 insertions(+) create mode 100644 releasenotes/notes/added-sign-feature-parameterexpression-57693dd69103dc8c.yaml diff --git a/qiskit/circuit/parameterexpression.py b/qiskit/circuit/parameterexpression.py index dc7614a30586..71b9fb7761a5 100644 --- a/qiskit/circuit/parameterexpression.py +++ b/qiskit/circuit/parameterexpression.py @@ -451,6 +451,17 @@ def log(self): return self._call(_log) + def sign(self): + """Sign of a ParameterExpression""" + if _optionals.HAS_SYMENGINE: + import symengine + + return self._call(symengine.sign) + else: + from sympy import sign as _sign + + return self._call(_sign) + def __repr__(self): return f"{self.__class__.__name__}({str(self)})" diff --git a/releasenotes/notes/added-sign-feature-parameterexpression-57693dd69103dc8c.yaml b/releasenotes/notes/added-sign-feature-parameterexpression-57693dd69103dc8c.yaml new file mode 100644 index 000000000000..b9738207167c --- /dev/null +++ b/releasenotes/notes/added-sign-feature-parameterexpression-57693dd69103dc8c.yaml @@ -0,0 +1,18 @@ +--- +features: + - | + Added support for expressing the sign of a :class: 'ParameterExpression' + Instead of assigning a concrete value and using ''numpy.sign'' or other library functions, the user can use the instance of the ParameterExpression + class to calculate the sign and can work with the sign before the expression is fully assigned. + + It can be used as follows:: + + from qiskit.circuit import Parameter + + b = Parameter("phi") + sign_value = b.sign() + print("sign of an unassigned Parameter is: ", sign_value) + print("Sign of a Parameter assigned to -3 is: ", sign_value.assign(b,-3)) + + Refer to ' #10360'__ for more details. + diff --git a/test/python/circuit/test_parameters.py b/test/python/circuit/test_parameters.py index caa3a148cd7f..9d14a4d766df 100644 --- a/test/python/circuit/test_parameters.py +++ b/test/python/circuit/test_parameters.py @@ -950,6 +950,15 @@ def test_rebinding_instruction_copy(self): self.assertEqual(expected1, output1) self.assertEqual(expected2, output2) + def test_sign_of_parameter(self): + """Test returning the sign of the value of the parameter""" + + b = Parameter("phi") + sign_of_parameter = b.sign() + self.assertEqual(sign_of_parameter.assign(b, -3), -1) + self.assertEqual(sign_of_parameter.assign(b, 2), 1) + self.assertEqual(sign_of_parameter.assign(b, 0), 0) + @combine(target_type=["gate", "instruction"], parameter_type=["numbers", "parameters"]) def test_decompose_propagates_bound_parameters(self, target_type, parameter_type): """Verify bind-before-decompose preserves bound values."""