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

Complete serialization overhaul #263

Merged
merged 99 commits into from
Jul 17, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
99 commits
Select commit Hold shift + click to select a range
f8b4d2d
Add dict interface to StorageBackend
terrorfisch May 15, 2018
e340dee
Update file system storage interface
terrorfisch May 15, 2018
87f061a
Update zip file backend
terrorfisch May 15, 2018
a82f25a
Update Dict and CachingBackend
terrorfisch May 23, 2018
6eac5c8
Implement central register for serializables and a new format for ref…
terrorfisch May 23, 2018
cda7cc1
First draft of new serialization and pulse management ecosystem
terrorfisch May 23, 2018
23576e6
Update tests and remove tests for old Serializer class
terrorfisch May 23, 2018
fa33b51
Added missing type annotations.
lumip May 30, 2018
492d58c
Re-added old ExtendedJSONEncoder (and renamed new ones) to enable smo…
lumip May 30, 2018
6c61170
Re-added old Serializer tests, made new serialization routines compat…
lumip May 30, 2018
10b81d0
Adapting SequencePulseTemplate to new serialization routines.
lumip May 30, 2018
901cbad
Adapted remaining PulseTemplate classes to new serialization routines.
lumip Jun 7, 2018
6e42954
Fixes for get_serialization_data routines and corresponding tests.
lumip Jun 7, 2018
65f568c
qctoolkit.serialization.PulseStorage: Fixes to __getitem__.
lumip Jun 7, 2018
01dab0d
Serialization-deserializatioln-sequence tests for FunctionPT, PointPT…
lumip Jun 14, 2018
014b4b8
Changes to (Nested)DummySerializable.
lumip Jun 14, 2018
5b8d6e2
Made SerializableTests an abstract base class.
lumip Jun 14, 2018
ed93eae
Ensure that PulseStorage flushes temporary data to storage backend.
lumip Jun 14, 2018
5afe318
Added method to convert a single pulse from old to new serialization …
lumip Jun 7, 2018
a858158
Test for convert_stored_pulse_in_storage()
lumip Jun 14, 2018
cb79d11
Added list_contents() method to StorageBackend.
lumip Jun 7, 2018
17e0d1a
Tests for StorageBackend::list_contents() implementations.
lumip Jun 15, 2018
95bbbd5
Return value of StorageBackend.list_contents() is now a set consisten…
lumip Jun 16, 2018
408429e
Added convert_pulses_in_storage method.
lumip Jun 16, 2018
8a8e167
Completed __all__ in qctoolkit/serialization.py
lumip Jun 16, 2018
e3f334d
Fix for pulse registration in Serialziable.__init__
lumip Jun 17, 2018
789309a
PulseStorage can be conveniently replace default pulse registration.
lumip Jun 17, 2018
13e652c
All serialization tests now subclasses of tests.serialization_tests.S…
lumip Jun 21, 2018
6ab3563
PulseStorage now produces ordered and beautified JSON.
lumip Jun 21, 2018
7316cec
PulseStorage now immediately writes new pulses to storage backend.
lumip Jun 28, 2018
eca1d0e
Safer dealing with duplicate ids when storing pulses.
lumip Jun 28, 2018
6995a0a
Merge pull request #266 from qutech/issues/250_serialization_backward…
terrorfisch Jul 5, 2018
a5c0074
Rename pulse registration to registry and add it as a keyword argumen…
terrorfisch Jul 5, 2018
c799fcd
Fixed DummySerializable and tests.
lumip Jul 5, 2018
ea0c8e4
Restrict garbage collection to the case where there is a registered s…
terrorfisch Jul 5, 2018
0354e18
Merge pull request #288 from qutech/issues/276_registry_forwarding
lumip Jul 5, 2018
266d55d
Fixed variable naming as to not overwrite builtins.
lumip Jul 5, 2018
36ddb50
Merge branch 'issues/250_serialization' into issues/281_pulse_storage…
lumip Jul 5, 2018
1ea0878
Merge branch 'issues/250_serialization' into issues/281_pulse_storage…
lumip Jul 5, 2018
441b95b
Fixed failing tests.
lumip Jul 5, 2018
eee6037
Merge pull request #285 from qutech/issues/281_pulse_storage_flushing
lumip Jul 5, 2018
da57af8
Allow default registry to be None.
lumip Jul 5, 2018
dcfdd33
PulseStorage checks for duplicate id now considers storage backend. A…
lumip Jul 5, 2018
01aa987
Merge branch 'issues/250_serialization' into issues/270_beautified_js…
lumip Jul 5, 2018
b49b943
Merge branch 'issues/250_serialization' into issues/275_pulse_storage…
lumip Jul 5, 2018
bbfeabe
Merge pull request #290 from qutech/issues/270_beautified_json_output
lumip Jul 5, 2018
345a676
Merge issues/250_serialization
terrorfisch Jul 6, 2018
183e940
Merge pull request #291 from qutech/issues/275_pulse_storage_context_…
terrorfisch Jul 6, 2018
ada2754
Merge branch 'master' into issues/250_serialization
terrorfisch Jul 6, 2018
1d92720
Add test for __delitem__
terrorfisch Jul 6, 2018
4ab908d
Merge pull request #293 from qutech/issues/289_pulse_storage_delitem_…
terrorfisch Jul 6, 2018
80b7d90
Increase test coverage
terrorfisch Jul 6, 2018
bb757a0
Merge pull request #295 from qutech/issues/294_test_coverage
terrorfisch Jul 9, 2018
e739a49
Merge remote-tracking branch 'remotes/origin/issues/250_serialization…
lumip Jul 9, 2018
b7dc1e7
Fixing tests that failed due to merge.
lumip Jul 9, 2018
52fbbc5
Fix: MappingPulseTemplate had no implementation for new serialization…
lumip Jul 9, 2018
248b777
Ensured that no occurrence of get_serialization_data/deserialize requ…
lumip Jul 9, 2018
ac78907
Merge pull request #297 from qutech/issues/250_fix_mapping_pt
lumip Jul 12, 2018
9cb1190
Added methods set_default_pulse_registry() and new_default_pulse_regi…
lumip Jul 12, 2018
29b6064
default_pulse_registry is now None.
lumip Jul 12, 2018
27ae2cb
Test to demonstrate issue #301.
lumip Jul 12, 2018
07d6e71
Merge branch 'master' into issues/250_serialization
lumip Jul 12, 2018
648ddb8
Merge branch 'issues/250_serialization' into issues/250_serialization…
lumip Jul 12, 2018
bbc41b4
Merge branch 'issues/250_serialization' into issues/299_default_regis…
lumip Jul 12, 2018
e90cc1e
Merge branch 'issues/250_serialization' into issues/301_pulse_storage…
lumip Jul 12, 2018
c8a106d
Added tests for new methods.
lumip Jul 12, 2018
1d10fde
Fix: DummyPulseTemplate was incompatible with old serialization routi…
lumip Jul 12, 2018
06df6ed
Added test_conversion() to SerializableTests
lumip Jul 12, 2018
bc8bc0e
Suppress deprecation warnings in test_conversion.
lumip Jul 12, 2018
2b4624a
Fix #301: deserialization with PulseStorage now possible when it is d…
lumip Jul 12, 2018
dfc72ef
Renamed abstract assert_equal_instance -> assert_equal_instance_excep…
lumip Jul 12, 2018
f2cd50d
Added renamed() method to Serializable.
lumip Jul 12, 2018
bb935b8
PulseStorage now raises a ValueError when a Serializable/PT is stored…
lumip Jul 12, 2018
18634f7
Generalize type requirements of Decoder and Encoder
terrorfisch Jul 12, 2018
0bca178
Generalizing type annotations for set/get_default_pulse_registry() an…
lumip Jul 12, 2018
9ef8a0f
Merge pull request #305 from qutech/issues/301_pulse_storage_as_defau…
lumip Jul 12, 2018
8573607
Test to ensure that registration of Serializables does not occur befo…
lumip Jul 12, 2018
87749df
Merge branch 'issues/250_serialization' into issues/298_early_pulse_r…
lumip Jul 12, 2018
d70a29b
Merge branch 'issues/250_serialization' into issues/299_default_regis…
terrorfisch Jul 12, 2018
5c4b212
Fix #298 : PulseTemplates(/Serializables) are only registered in the …
lumip Jul 12, 2018
45042a5
Fix test that assumes default pulse registry
terrorfisch Jul 12, 2018
d763147
PulseStorage now "implements" MutableMapping.
lumip Jul 12, 2018
68b2ac5
Merge branch 'issues/250_serialization' into issues/250_serialization…
lumip Jul 12, 2018
fe9c3b7
Merge pull request #300 from qutech/issues/299_default_registry_none
terrorfisch Jul 12, 2018
5a5b5d7
Merge pull request #304 from qutech/issues/250_serialization_conversi…
terrorfisch Jul 12, 2018
81b7891
Merge branch 'issues/250_serialization' into issues/272_PulseStorage_…
terrorfisch Jul 12, 2018
5faafcc
Merge branch 'issues/250_serialization' into issues/298_early_pulse_r…
terrorfisch Jul 12, 2018
62d18ad
Merge pull request #306 from qutech/issues/272_PulseStorage_id_incons…
terrorfisch Jul 12, 2018
f638d24
Merge branch 'issues/250_serialization' into issues/298_early_pulse_r…
terrorfisch Jul 12, 2018
b796ab1
Merge pull request #307 from qutech/issues/298_early_pulse_registration
terrorfisch Jul 12, 2018
6f08c7d
Merge branch 'issues/250_serialization' into issues/308_consistent_ty…
lumip Jul 13, 2018
a8732f9
Introduced PulseRegistryType and changed type annotations for pulse r…
lumip Jul 13, 2018
c6ab296
Tests for new methods in PulseStorage.
lumip Jul 13, 2018
42b888d
Merge pull request #310 from qutech/issues/308_consistent_type_annota…
terrorfisch Jul 13, 2018
ae21951
Added test to ensure that PulseStorage duplicate id check is consiste…
lumip Jul 13, 2018
2925c89
Removed get_type_identifier() method which was unused.
lumip Jul 13, 2018
9548742
Added tests to (hopefully) complete test coverage of serialization.py
lumip Jul 13, 2018
0d1f9df
Only invoke garbage collection if registry is WeakValueDict and a tes…
terrorfisch Jul 16, 2018
47338ee
Merge pull request #311 from qutech/issues/250_one_more_test
lumip Jul 17, 2018
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
51 changes: 30 additions & 21 deletions qctoolkit/pulses/function_pulse_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import sympy

from qctoolkit.expressions import ExpressionScalar
from qctoolkit.serialization import Serializer
from qctoolkit.serialization import Serializer, PulseRegistryType

from qctoolkit.utils.types import ChannelID, TimeType, time_from_float
from qctoolkit.pulses.parameters import Parameter, ParameterConstrainer, ParameterConstraint
Expand Down Expand Up @@ -44,7 +44,8 @@ def __init__(self,
identifier: Optional[str] = None,
*,
measurements: Optional[List[MeasurementDeclaration]]=None,
parameter_constraints: Optional[List[Union[str, ParameterConstraint]]]=None) -> None:
parameter_constraints: Optional[List[Union[str, ParameterConstraint]]]=None,
registry: PulseRegistryType=None) -> None:
"""
Args:
expression: The function represented by this FunctionPulseTemplate
Expand All @@ -68,6 +69,8 @@ def __init__(self,
self.__parameter_names = {*self.__duration_expression.variables, *self.__expression.variables} - {'t'}
self.__channel = channel

self._register(registry=registry)

@property
def expression(self) -> ExpressionScalar:
return self.__expression
Expand Down Expand Up @@ -119,31 +122,37 @@ def requires_stop(self,
for name in parameters.keys() if (name in self.parameter_names)
)

def get_serialization_data(self, serializer: Serializer) -> Dict[str, Any]:
return dict(
def get_serialization_data(self, serializer: Optional[Serializer]=None) -> Dict[str, Any]:
data = super().get_serialization_data(serializer)

if serializer: # compatibility to old serialization routines, deprecated
return dict(
duration_expression=self.__duration_expression,
expression=self.__expression,
channel=self.__channel,
measurement_declarations=self.measurement_declarations,
parameter_constraints=[str(c) for c in self.parameter_constraints]
)

local_data = dict(
duration_expression=self.__duration_expression,
expression=self.__expression,
channel=self.__channel,
measurement_declarations=self.measurement_declarations,
measurements=self.measurement_declarations,
parameter_constraints=[str(c) for c in self.parameter_constraints]
)

@staticmethod
def deserialize(serializer: Serializer,
expression: Any,
duration_expression: Any,
channel: 'ChannelID',
measurement_declarations: List[MeasurementDeclaration],
parameter_constraints: List,
identifier: Optional[bool]=None) -> 'FunctionPulseTemplate':
return FunctionPulseTemplate(
expression,
duration_expression,
channel=channel,
identifier=identifier,
measurements=measurement_declarations,
parameter_constraints=parameter_constraints
)
data.update(**local_data)
return data

@classmethod
def deserialize(cls,
serializer: Optional[Serializer]=None,
**kwargs) -> 'FunctionPulseTemplate':
if serializer:
kwargs['measurements'] = kwargs['measurement_declarations'] # compatibility to old serialization routines, deprecated
del kwargs['measurement_declarations']
return super().deserialize(None, **kwargs)

@property
def integral(self) -> Dict[ChannelID, ExpressionScalar]:
Expand Down
89 changes: 46 additions & 43 deletions qctoolkit/pulses/loop_pulse_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import sympy

from qctoolkit.serialization import Serializer
from qctoolkit.serialization import Serializer, PulseRegistryType

from qctoolkit.expressions import ExpressionScalar
from qctoolkit.utils import checked_int_cast
Expand All @@ -24,7 +24,8 @@

class LoopPulseTemplate(PulseTemplate):
"""Base class for loop based pulse templates. This class is still abstract and cannot be instantiated."""
def __init__(self, body: PulseTemplate, identifier: Optional[str]=None):
def __init__(self, body: PulseTemplate,
identifier: Optional[str]):
super().__init__(identifier=identifier)
self.__body = body

Expand Down Expand Up @@ -109,7 +110,8 @@ def __init__(self,
identifier: Optional[str]=None,
*,
measurements: Optional[Sequence[MeasurementDeclaration]]=None,
parameter_constraints: Optional[Sequence]=None):
parameter_constraints: Optional[Sequence]=None,
registry: PulseRegistryType=None) -> None:
"""
Args:
body: The loop body. It is expected to have `loop_index` as an parameter
Expand Down Expand Up @@ -149,6 +151,8 @@ def __init__(self,
"To constrain the loop index, put the constraint in the body subtemplate.\n" \
"Loop index is {} and offending constraints are: {}".format(self._loop_index, constraints))

self._register(registry=registry)

@property
def loop_index(self) -> str:
return self._loop_index
Expand Down Expand Up @@ -232,34 +236,30 @@ def requires_stop(self,
conditions: Dict[str, 'Condition']) -> bool:
return any(parameters[parameter_name].requires_stop for parameter_name in self._loop_range.parameter_names)

def get_serialization_data(self, serializer: Serializer) -> Dict[str, Any]:
data = dict(
body=serializer.dictify(self.body),
loop_range=self._loop_range.to_tuple(),
loop_index=self._loop_index,
)
def get_serialization_data(self, serializer: Optional[Serializer]=None) -> Dict[str, Any]:
data = super().get_serialization_data(serializer)

data['body'] = self.body

if serializer: # compatibility to old serialization routines, deprecated
data = dict()
data['body'] = serializer.dictify(self.body)

data['loop_range'] = self._loop_range.to_tuple()
data['loop_index'] = self._loop_index

if self.parameter_constraints:
data['parameter_constraints'] = [str(c) for c in self.parameter_constraints]
if self.measurement_declarations:
data['measurements'] = self.measurement_declarations

return data

@staticmethod
def deserialize(serializer: Serializer,
body: Dict[str, Any],
loop_range: Tuple,
loop_index: str,
identifier: Optional[str]=None,
measurements: Optional[Sequence[str]]=None,
parameter_constraints: Optional[Sequence[str]]=None) -> 'ForLoopPulseTemplate':
body = cast(PulseTemplate, serializer.deserialize(body))
return ForLoopPulseTemplate(body=body,
identifier=identifier,
loop_range=loop_range,
loop_index=loop_index,
measurements=measurements,
parameter_constraints=parameter_constraints
)
@classmethod
def deserialize(cls, serializer: Optional[Serializer]=None, **kwargs) -> 'ForLoopTemplate':
if serializer: # compatibility to old serialization routines, deprecated
kwargs['body'] = cast(PulseTemplate, serializer.deserialize(kwargs['body']))
return super().deserialize(None, **kwargs)

@property
def integral(self) -> Dict[ChannelID, ExpressionScalar]:
Expand Down Expand Up @@ -288,15 +288,17 @@ def integral(self) -> Dict[ChannelID, ExpressionScalar]:
return body_integrals



class WhileLoopPulseTemplate(LoopPulseTemplate):
"""Conditional looping in a pulse.

A LoopPulseTemplate is a PulseTemplate whose body is repeated
during execution as long as a certain condition holds.
"""

def __init__(self, condition: str, body: PulseTemplate, identifier: Optional[str]=None) -> None:
def __init__(self, condition: str,
body: PulseTemplate,
identifier: Optional[str]=None,
registry: PulseRegistryType=None) -> None:
"""Create a new LoopPulseTemplate instance.

Args:
Expand All @@ -308,6 +310,7 @@ def __init__(self, condition: str, body: PulseTemplate, identifier: Optional[str
"""
super().__init__(body=body, identifier=identifier)
self._condition = condition
self._register(registry=registry)

def __str__(self) -> str:
return "LoopPulseTemplate: Condition <{}>, Body <{}>".format(self._condition, self.body)
Expand Down Expand Up @@ -352,24 +355,24 @@ def requires_stop(self,
conditions: Dict[str, Condition]) -> bool:
return self.__obtain_condition_object(conditions).requires_stop()

def get_serialization_data(self, serializer: Serializer) -> Dict[str, Any]:
data = dict(
type=serializer.get_type_identifier(self),
condition=self._condition,
body=serializer.dictify(self.body)
)
def get_serialization_data(self, serializer: Optional[Serializer]=None) -> Dict[str, Any]:
data = super().get_serialization_data(serializer)
data['body'] = self.body

if serializer: # compatibility to old serialization routines, deprecated
data = dict()
data['body'] = serializer.dictify(self.body)

data['condition'] = self._condition

return data

@staticmethod
def deserialize(serializer: Serializer,
condition: str,
body: Dict[str, Any],
identifier: Optional[str]=None) -> 'WhileLoopPulseTemplate':
body = serializer.deserialize(body)
result = WhileLoopPulseTemplate(condition=condition,
body=body,
identifier=identifier)
return result
@classmethod
def deserialize(cls, serializer: Optional[Serializer]=None, **kwargs) -> 'WhileLoopPulseTemplate':
if serializer: # compatibility to old serialization routines, deprecated
kwargs['body'] = serializer.deserialize(kwargs['body'])

return super().deserialize(**kwargs)

@property
def integral(self) -> Dict[ChannelID, ExpressionScalar]:
Expand Down
37 changes: 22 additions & 15 deletions qctoolkit/pulses/multi_channel_pulse_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import numpy


from qctoolkit.serialization import Serializer
from qctoolkit.serialization import Serializer, PulseRegistryType

from qctoolkit.utils.types import ChannelID, TimeType
from qctoolkit.pulses.instructions import Waveform
Expand Down Expand Up @@ -139,7 +139,8 @@ def __init__(self,
external_parameters: Optional[Set[str]]=None,
identifier: Optional[str]=None,
parameter_constraints: Optional[List]=None,
measurements: Optional[List[MeasurementDeclaration]]=None) -> None:
measurements: Optional[List[MeasurementDeclaration]]=None,
registry: PulseRegistryType=None) -> None:
AtomicPulseTemplate.__init__(self, identifier=identifier, measurements=measurements)
ParameterConstrainer.__init__(self, parameter_constraints=parameter_constraints)

Expand Down Expand Up @@ -182,6 +183,8 @@ def __init__(self,
raise ValueError('Could not assert duration equality of {} and {}'.format(duration,
subtemplate.duration))

self._register(registry=registry)

@property
def duration(self) -> Expression:
return self._subtemplates[0].duration
Expand Down Expand Up @@ -225,26 +228,30 @@ def requires_stop(self,
conditions: Dict[str, 'Condition']) -> bool:
return any(st.requires_stop(parameters, conditions) for st in self._subtemplates)

def get_serialization_data(self, serializer: Serializer) -> Dict[str, Any]:
data = dict(subtemplates=[serializer.dictify(subtemplate) for subtemplate in self.subtemplates])
def get_serialization_data(self, serializer: Optional[Serializer]=None) -> Dict[str, Any]:
data = super().get_serialization_data(serializer)
data['subtemplates'] = self.subtemplates

if serializer: # compatibility to old serialization routines, deprecated
data = dict()
data['subtemplates'] = [serializer.dictify(subtemplate) for subtemplate in self.subtemplates]

if self.parameter_constraints:
data['parameter_constraints'] = [str(constraint) for constraint in self.parameter_constraints]

if self.measurement_declarations:
data['measurements'] = self.measurement_declarations

return data

@staticmethod
def deserialize(serializer: Serializer,
subtemplates: Iterable[Dict[str, Any]],
parameter_constraints: Optional[Any]=None,
identifier: Optional[str]=None,
measurements: Optional[List[MeasurementDeclaration]]=None) -> 'AtomicMultiChannelPulseTemplate':
subtemplates = [serializer.deserialize(st) for st in subtemplates]
return AtomicMultiChannelPulseTemplate(*subtemplates,
parameter_constraints=parameter_constraints,
identifier=identifier, measurements=measurements)
@classmethod
def deserialize(cls, serializer: Optional[Serializer]=None, **kwargs) -> 'AtomicMultiChannelPulseTemplate':
subtemplates = kwargs['subtemplates']
del kwargs['subtemplates']

if serializer: # compatibility to old serialization routines, deprecated
subtemplates = [serializer.deserialize(st) for st in subtemplates]

return cls(*subtemplates, **kwargs)

@property
def integral(self) -> Dict[ChannelID, ExpressionScalar]:
Expand Down
24 changes: 14 additions & 10 deletions qctoolkit/pulses/point_pulse_template.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Optional, List, Union, Set, Dict, Sequence
from typing import Optional, List, Union, Set, Dict, Sequence, Any
from numbers import Real
import itertools
import numbers
Expand All @@ -14,6 +14,7 @@
from qctoolkit.pulses.pulse_template import AtomicPulseTemplate, MeasurementDeclaration
from qctoolkit.pulses.table_pulse_template import TableEntry, EntryInInit, TableWaveform, TableWaveformEntry
from qctoolkit.pulses.multi_channel_pulse_template import MultiChannelWaveform
from qctoolkit.serialization import Serializer, PulseRegistryType


__all__ = ["PointWaveform", "PointPulseTemplate", "PointPulseEntry", "PointWaveformEntry", "InvalidPointDimension"]
Expand Down Expand Up @@ -44,7 +45,8 @@ def __init__(self,
*,
parameter_constraints: Optional[List[Union[str, ParameterConstraint]]]=None,
measurements: Optional[List[MeasurementDeclaration]]=None,
identifier=None):
identifier: Optional[str]=None,
registry: PulseRegistryType=None) -> None:

AtomicPulseTemplate.__init__(self, identifier=identifier, measurements=measurements)
ParameterConstrainer.__init__(self, parameter_constraints=parameter_constraints)
Expand All @@ -53,6 +55,8 @@ def __init__(self,
self._entries = [PointPulseEntry(*tpt)
for tpt in time_point_tuple_list]

self._register(registry=registry)

@property
def defined_channels(self) -> Set[ChannelID]:
return set(self._channels)
Expand Down Expand Up @@ -99,20 +103,20 @@ def build_waveform(self,
def point_pulse_entries(self) -> Sequence[PointPulseEntry]:
return self._entries

def get_serialization_data(self, serializer) -> Dict:
data = {'time_point_tuple_list': [entry.get_serialization_data()
for entry in self._entries],
'channel_names': self._channels}
def get_serialization_data(self, serializer: Optional[Serializer]=None) -> Dict[str, Any]:
data = super().get_serialization_data(serializer)

if serializer: # compatibility to old serialization routines, deprecated
data = dict()

data['time_point_tuple_list'] = [entry.get_serialization_data() for entry in self._entries]
data['channel_names'] = self._channels
if self.parameter_constraints:
data['parameter_constraints'] = [str(c) for c in self.parameter_constraints]
if self.measurement_declarations:
data['measurements'] = self.measurement_declarations
return data

@staticmethod
def deserialize(serializer, **kwargs) -> 'PointPulseTemplate':
return PointPulseTemplate(**kwargs)

@property
def duration(self) -> Expression:
return self._entries[-1].t
Expand Down
2 changes: 1 addition & 1 deletion qctoolkit/pulses/pulse_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class PulseTemplate(Serializable, SequencingElement, metaclass=DocStringABCMeta)

def __init__(self, *,
identifier: Optional[str]) -> None:
super().__init__(identifier)
super().__init__(identifier=identifier)

@property
@abstractmethod
Expand Down
Loading