Skip to content

Commit

Permalink
Avoid lossing precision when scaling frequencies (#12392) (#12480)
Browse files Browse the repository at this point in the history
* Avoid lossing precision when scaling frequencies

Classes in pulse_instruction.py scale frequency values to GHz by
multipliying `ParameterExpression` with float 1e9. This can lead
to numerical errors on some systems using symengine. Instead, this
scaling can be done multiplying by integer 10**9.

See: #12359 (comment)

* Add release note

---------

Co-authored-by: Jake Lishman <[email protected]>
(cherry picked from commit 96607f6)

Co-authored-by: Iyán <[email protected]>
Co-authored-by: Luciano Bello <[email protected]>
  • Loading branch information
3 people authored Jun 4, 2024
1 parent 7da7bf4 commit 8db5490
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 6 deletions.
12 changes: 6 additions & 6 deletions qiskit/qobj/converters/pulse_instruction.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ def _convert_set_frequency(
"name": "setf",
"t0": time_offset + instruction.start_time,
"ch": instruction.channel.name,
"frequency": instruction.frequency / 1e9,
"frequency": instruction.frequency / 10**9,
}
return self._qobj_model(**command_dict)

Expand All @@ -266,7 +266,7 @@ def _convert_shift_frequency(
"name": "shiftf",
"t0": time_offset + instruction.start_time,
"ch": instruction.channel.name,
"frequency": instruction.frequency / 1e9,
"frequency": instruction.frequency / 10**9,
}
return self._qobj_model(**command_dict)

Expand Down Expand Up @@ -836,7 +836,7 @@ def _convert_setf(
.. note::
We assume frequency value is expressed in string with "GHz".
Operand value is thus scaled by a factor of 1e9.
Operand value is thus scaled by a factor of 10^9.
Args:
instruction: SetFrequency qobj instruction
Expand All @@ -845,7 +845,7 @@ def _convert_setf(
Qiskit Pulse set frequency instructions
"""
channel = self.get_channel(instruction.ch)
frequency = self.disassemble_value(instruction.frequency) * 1e9
frequency = self.disassemble_value(instruction.frequency) * 10**9

yield instructions.SetFrequency(frequency, channel)

Expand All @@ -858,7 +858,7 @@ def _convert_shiftf(
.. note::
We assume frequency value is expressed in string with "GHz".
Operand value is thus scaled by a factor of 1e9.
Operand value is thus scaled by a factor of 10^9.
Args:
instruction: ShiftFrequency qobj instruction
Expand All @@ -867,7 +867,7 @@ def _convert_shiftf(
Qiskit Pulse shift frequency schedule instructions
"""
channel = self.get_channel(instruction.ch)
frequency = self.disassemble_value(instruction.frequency) * 1e9
frequency = self.disassemble_value(instruction.frequency) * 10**9

yield instructions.ShiftFrequency(frequency, channel)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
fixes:
- |
Fixed a floating-point imprecision when scaling certain pulse units
between seconds and nanoseconds. If the pulse was symbolically defined,
an unnecessary floating-point error could be introduced by the scaling
for certain builds of ``symengine``, which could manifest in unexpected
results once the symbols were fully bound. See `#12392 <https://github.com/Qiskit/qiskit/pull/12392>`__.

0 comments on commit 8db5490

Please sign in to comment.