Skip to content

Commit

Permalink
Avoid lossing precision when scaling frequencies (#12392) (#12416)
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]>
  • Loading branch information
mergify[bot] and iyanmv authored May 16, 2024
1 parent 54059f8 commit 0a05ea2
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 @@ -234,7 +234,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 @@ -257,7 +257,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 @@ -746,7 +746,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 @@ -755,7 +755,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 @@ -768,7 +768,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 @@ -777,7 +777,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 0a05ea2

Please sign in to comment.