Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

reversed loopbuilder into dev #877

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading