Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/negative_feature_10360' into neg…
Browse files Browse the repository at this point in the history
…ative_feature_10360
  • Loading branch information
SamD-1998 committed Sep 19, 2023
2 parents 75c2ff3 + 981c470 commit 53e6676
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 0 deletions.
66 changes: 66 additions & 0 deletions 10360.patch.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
diff --git a/qiskit/circuit/parameterexpression.py b/qiskit/circuit/parameterexpression.py
index dc7614a30..71b9fb776 100644
--- a/qiskit/circuit/parameterexpression.py
+++ b/qiskit/circuit/parameterexpression.py
@@ -451,6 +451,17 @@ class ParameterExpression:

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 000000000..b97382071
--- /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<https://github.com/Qiskit/qiskit-terra/issues/10360>'__ for more details.
+
diff --git a/test/python/circuit/test_parameters.py b/test/python/circuit/test_parameters.py
index 31b73c55a..b74eef431 100644
--- a/test/python/circuit/test_parameters.py
+++ b/test/python/circuit/test_parameters.py
@@ -939,6 +939,15 @@ class TestParameters(QiskitTestCase):
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."""
11 changes: 11 additions & 0 deletions qiskit/circuit/parameterexpression.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)})"

Expand Down
9 changes: 9 additions & 0 deletions test/python/circuit/test_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
Expand Down

0 comments on commit 53e6676

Please sign in to comment.