Skip to content

Commit

Permalink
Merge pull request #877 from qutech/feat/linspace_measurements_reversed
Browse files Browse the repository at this point in the history
reversed loopbuilder into dev
  • Loading branch information
Nomos11 authored Dec 19, 2024
2 parents 55a4e6b + f93e02f commit 6facb1f
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 14 deletions.
3 changes: 3 additions & 0 deletions qupulse/program/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,9 @@ def with_iteration(self, index_name: str, rng: range,
def evaluate_nested_stepping(self, scope: Scope, parameter_names: set[str]) -> bool:
return False

def time_reversed(self) -> ContextManager['ProgramBuilder']:
pass

def to_program(self, defined_channels: Set[ChannelID]) -> Optional[Program]:
"""Further addition of new elements might fail after finalizing the program."""

Expand Down
11 changes: 10 additions & 1 deletion qupulse/program/loop.py
Original file line number Diff line number Diff line change
Expand Up @@ -817,7 +817,16 @@ def with_iteration(self, index_name: str, rng: range,
for value in rng:
top_frame.iterating = (index_name, value)
yield self


@contextmanager
def time_reversed(self) -> ContextManager['LoopBuilder']:
inner_builder = LoopBuilder()
yield inner_builder
inner_program = inner_builder.to_program()
if inner_program:
inner_program.reverse_inplace()
self._try_append(inner_program, None)

@contextmanager
def with_sequence(self, measurements: Optional[Sequence[MeasurementWindow]] = None) -> ContextManager['ProgramBuilder']:
top_frame = StackFrame(LoopGuard(self._top, measurements), None)
Expand Down
2 changes: 1 addition & 1 deletion qupulse/program/waveforms.py
Original file line number Diff line number Diff line change
Expand Up @@ -1270,7 +1270,7 @@ def unsafe_sample(self, channel: ChannelID, sample_times: np.ndarray,
else:
inner_output_array = output_array[::-1]
inner_output_array = self._inner.unsafe_sample(channel, inner_sample_times, output_array=inner_output_array)
if inner_output_array.base not in (output_array, output_array.base):
if id(inner_output_array.base) not in (id(output_array), id(output_array.base)):
# TODO: is there a guarantee by numpy we never end up here?
output_array[:] = inner_output_array[::-1]
return output_array
Expand Down
16 changes: 4 additions & 12 deletions qupulse/pulses/time_reversal_pulse_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ class TimeReversalPulseTemplate(PulseTemplate):
def __init__(self, inner: PulseTemplate,
identifier: Optional[str] = None,
registry: PulseRegistryType = None):
raise NotImplementedError("Not yet adapted to ProgramBuilder formalism")
super(TimeReversalPulseTemplate, self).__init__(identifier=identifier)
self._inner = inner
self._register(registry=registry)
Expand Down Expand Up @@ -120,17 +119,10 @@ def defined_channels(self) -> Set['ChannelID']:
def integral(self) -> Dict[ChannelID, ExpressionScalar]:
return self._inner.integral

def _internal_create_program(self, *, parent_loop: Loop, **kwargs) -> None:

raise NotImplementedError("Not yet adapted to ProgramBuilder formalism")

# inner_loop = Loop()
# self._inner._internal_create_program(parent_loop=inner_loop, **kwargs)
# inner_loop.reverse_inplace()

# parent_loop.append_child(inner_loop)


def _internal_create_program(self, *, program_builder: ProgramBuilder, **kwargs) -> None:
with program_builder.time_reversed() as reversed_builder:
self._inner._internal_create_program(program_builder=reversed_builder, **kwargs)

def build_waveform(self,
*args, **kwargs) -> Optional[Waveform]:
wf = self._inner.build_waveform(*args, **kwargs)
Expand Down

0 comments on commit 6facb1f

Please sign in to comment.