diff --git a/qupulse/program/linspace.py b/qupulse/program/linspace.py index 6c8dc9b96..d7f9170c8 100644 --- a/qupulse/program/linspace.py +++ b/qupulse/program/linspace.py @@ -4,6 +4,8 @@ import contextlib import dataclasses +import warnings + import numpy as np import math import copy @@ -16,7 +18,7 @@ from qupulse.parameter_scope import Scope, MappedScope, FrozenDict from qupulse.program import (ProgramBuilder, HardwareTime, HardwareVoltage, Waveform, RepetitionCount, TimeType, SimpleExpression) -from qupulse.program.waveforms import MultiChannelWaveform +from qupulse.program.volatile import VolatileRepetitionCount, InefficientVolatility # this resolution is used to unify increments # the increments themselves remain floats @@ -256,6 +258,10 @@ def with_repetition(self, repetition_count: RepetitionCount, measurements: Optional[Sequence[MeasurementWindow]] = None) -> Iterable['ProgramBuilder']: if repetition_count == 0: return + if isinstance(repetition_count, VolatileRepetitionCount): + warnings.warn(f"{type(self).__name__} does not support volatile repetition counts.", + category=InefficientVolatility) + self._stack.append([]) yield self blocks = self._stack.pop() diff --git a/qupulse/program/loop.py b/qupulse/program/loop.py index 9e59f9d32..1c61f3a10 100644 --- a/qupulse/program/loop.py +++ b/qupulse/program/loop.py @@ -15,7 +15,7 @@ from qupulse.parameter_scope import Scope from qupulse.program import ProgramBuilder, RepetitionCount, HardwareTime, HardwareVoltage from qupulse.program.transformation import Transformation -from qupulse.program.volatile import VolatileRepetitionCount, VolatileProperty +from qupulse.program.volatile import VolatileRepetitionCount, VolatileProperty, VolatileModificationWarning from qupulse.program.waveforms import SequenceWaveform, RepetitionWaveform from qupulse.program.waveforms import TransformingWaveform from qupulse.program.waveforms import Waveform, ConstantWaveform @@ -727,11 +727,6 @@ class MakeCompatibleWarning(ResourceWarning): pass -class VolatileModificationWarning(RuntimeWarning): - """This warning is emitted if the colatile part of a program gets modified. This might imply that the volatile - parameter cannot be change anymore.""" - - class DroppedMeasurementWarning(RuntimeWarning): """This warning is emitted if a measurement was dropped because there was no waveform attached.""" diff --git a/qupulse/program/volatile.py b/qupulse/program/volatile.py index ab0925ae1..30e66420b 100644 --- a/qupulse/program/volatile.py +++ b/qupulse/program/volatile.py @@ -13,7 +13,8 @@ from qupulse.utils import is_integer -__all__ = ['VolatileProperty', 'VolatileValue', 'VolatileRepetitionCount'] +__all__ = ['VolatileProperty', 'VolatileValue', 'VolatileRepetitionCount', + 'InefficientVolatility', 'VolatileModificationWarning'] VolatileProperty = NamedTuple('VolatileProperty', [('expression', Expression), @@ -75,3 +76,12 @@ def __eq__(self, other): return self._scope is other._scope and self._expression == other._expression else: return NotImplemented + + +class InefficientVolatility(RuntimeWarning): + """This warning is emitted if the requested volatility of a parameter cannot be implemented efficiently by the backend.""" + + +class VolatileModificationWarning(InefficientVolatility): + """This warning is emitted if the volatile part of a program gets modified. + This might imply that the volatile parameter cannot be changed anymore."""