From 8e64ffeb5b0695a4e96e5fb3a85e6dff44e30035 Mon Sep 17 00:00:00 2001 From: "Kevin J. Sung" Date: Mon, 19 Dec 2022 00:47:06 -0500 Subject: [PATCH 1/3] bind parameters recursively --- qiskit_nature/second_q/operators/sparse_label_op.py | 4 +++- test/second_q/operators/test_sparse_label_op.py | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/qiskit_nature/second_q/operators/sparse_label_op.py b/qiskit_nature/second_q/operators/sparse_label_op.py index 7652038abe..583e59d1f8 100644 --- a/qiskit_nature/second_q/operators/sparse_label_op.py +++ b/qiskit_nature/second_q/operators/sparse_label_op.py @@ -511,7 +511,9 @@ def assign_parameters(self, parameters: Mapping[ParameterExpression, _TCoeff]) - A new operator with the parameters assigned. """ data = { - key: parameters[value] if value in parameters else value + key: value.bind(parameters, allow_unknown_parameters=True) + if isinstance(value, ParameterExpression) + else value for key, value in self._data.items() } return self._new_instance(data, other=self) diff --git a/test/second_q/operators/test_sparse_label_op.py b/test/second_q/operators/test_sparse_label_op.py index 5ff924fb2d..65ef8865ff 100644 --- a/test/second_q/operators/test_sparse_label_op.py +++ b/test/second_q/operators/test_sparse_label_op.py @@ -143,6 +143,12 @@ def test_add(self): self.assertEqual(test_op, target_op) + with self.subTest("parameter + parameter"): + test_op = DummySparseLabelOp({"+_0 -_1": a}) + DummySparseLabelOp({"+_1 -_0": a}) + target_op = DummySparseLabelOp({"+_0 -_1": a, "+_1 -_0": a}) + + self.assertEqual(test_op, target_op) + with self.subTest("new key"): test_op = DummySparseLabelOp(op1) + DummySparseLabelOp(op3) target_op = DummySparseLabelOp( @@ -418,6 +424,10 @@ def test_assign_parameters(self): self.assertEqual(assigned_op, DummySparseLabelOp({"+_0 -_1": 1.0, "+_0 -_2": b})) self.assertEqual(op, DummySparseLabelOp({"+_0 -_1": a, "+_0 -_2": b})) + op = DummySparseLabelOp({"+_0 -_1": a + 1}) + DummySparseLabelOp({"+_1 -_0": a}) + assigned_op = op.assign_parameters({a: 1}) + self.assertEqual(assigned_op, DummySparseLabelOp({"+_0 -_1": 2, "+_1 -_0": 1})) + def test_round(self): """test round function""" with self.subTest("round just real part"): From 1af5fe1a40dd037e75cee65c5db168d8609161f7 Mon Sep 17 00:00:00 2001 From: "Kevin J. Sung" Date: Mon, 19 Dec 2022 07:16:52 -0500 Subject: [PATCH 2/3] use slower workaround that works with current Terra version --- qiskit_nature/second_q/operators/sparse_label_op.py | 6 +++++- test/second_q/operators/test_sparse_label_op.py | 10 ++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/qiskit_nature/second_q/operators/sparse_label_op.py b/qiskit_nature/second_q/operators/sparse_label_op.py index 583e59d1f8..88fbfb9fad 100644 --- a/qiskit_nature/second_q/operators/sparse_label_op.py +++ b/qiskit_nature/second_q/operators/sparse_label_op.py @@ -511,7 +511,11 @@ def assign_parameters(self, parameters: Mapping[ParameterExpression, _TCoeff]) - A new operator with the parameters assigned. """ data = { - key: value.bind(parameters, allow_unknown_parameters=True) + # TODO use this line once + # https://github.com/Qiskit/qiskit-terra/pull/9304 + # is merged: + # key: value.bind(parameters, allow_unknown_parameters=True) + key: value.bind({k: v for k, v in parameters.items() if k in value.parameters}) if isinstance(value, ParameterExpression) else value for key, value in self._data.items() diff --git a/test/second_q/operators/test_sparse_label_op.py b/test/second_q/operators/test_sparse_label_op.py index 65ef8865ff..6ddf8c15b7 100644 --- a/test/second_q/operators/test_sparse_label_op.py +++ b/test/second_q/operators/test_sparse_label_op.py @@ -143,12 +143,6 @@ def test_add(self): self.assertEqual(test_op, target_op) - with self.subTest("parameter + parameter"): - test_op = DummySparseLabelOp({"+_0 -_1": a}) + DummySparseLabelOp({"+_1 -_0": a}) - target_op = DummySparseLabelOp({"+_0 -_1": a, "+_1 -_0": a}) - - self.assertEqual(test_op, target_op) - with self.subTest("new key"): test_op = DummySparseLabelOp(op1) + DummySparseLabelOp(op3) target_op = DummySparseLabelOp( @@ -428,6 +422,10 @@ def test_assign_parameters(self): assigned_op = op.assign_parameters({a: 1}) self.assertEqual(assigned_op, DummySparseLabelOp({"+_0 -_1": 2, "+_1 -_0": 1})) + op = DummySparseLabelOp({"+_0 -_1": a + 1}) + DummySparseLabelOp({"+_1 -_0": b}) + assigned_op = op.assign_parameters({a: 1}) + self.assertEqual(assigned_op, DummySparseLabelOp({"+_0 -_1": 2, "+_1 -_0": b})) + def test_round(self): """test round function""" with self.subTest("round just real part"): From e1fabc604539655b13e8048ecc240206120e3380 Mon Sep 17 00:00:00 2001 From: "Kevin J. Sung" Date: Mon, 19 Dec 2022 07:19:01 -0500 Subject: [PATCH 3/3] add release note --- releasenotes/notes/fix-bind-params-a2851b14e3b8e247.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 releasenotes/notes/fix-bind-params-a2851b14e3b8e247.yaml diff --git a/releasenotes/notes/fix-bind-params-a2851b14e3b8e247.yaml b/releasenotes/notes/fix-bind-params-a2851b14e3b8e247.yaml new file mode 100644 index 0000000000..a6e90ea516 --- /dev/null +++ b/releasenotes/notes/fix-bind-params-a2851b14e3b8e247.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixes :meth:`.SparseLabelOp.assign_parameters` failing to + assign parameters recursively. \ No newline at end of file