import numpy as np
import qcodes
import qtt.data
from typing import Any
from qilib.utils.serialization import NumpyKeys, Serializer, JsonSerializeKey, serializer
from qcodes.data.data_set import DataSet
[docs]class QttSerializer(Serializer):
def __init__(self):
super().__init__()
self.register(qcodes.Instrument, encode_qcodes_instrument, '__qcodes_instrument__',
decode_qcodes_instrument)
self.register(DataSet, encode_qcodes_dataset, '__qcodes_dataset__', decode_qcodes_dataset)
self.register(np.ndarray, encode_numpy_array, np.array.__name__, decode_numpy_array)
for numpy_integer_type in [np.int16, np.int32, np.int64, np.float16, np.float32, np.float64, np.bool_]:
self.register(numpy_integer_type, encode_numpy_number, '__npnumber__', decode_numpy_number)
[docs]def encode_qcodes_instrument(item):
return {
JsonSerializeKey.OBJECT: '__qcodes_instrument__',
JsonSerializeKey.CONTENT: {'name': item.name, 'qcodes_instrument': str(item)}
}
[docs]def decode_qcodes_instrument(item):
return item
[docs]def encode_qcodes_dataset(item):
dataset_dictionary = qtt_serializer.encode_data(qtt.data.dataset_to_dictionary(item))
return {
JsonSerializeKey.OBJECT: '__qcodes_dataset__',
JsonSerializeKey.CONTENT: {
'__dataset_dictionary__': dataset_dictionary,
}
}
[docs]def decode_qcodes_dataset(item):
obj = item[JsonSerializeKey.CONTENT]
return qtt.data.dictionary_to_dataset(obj['__dataset_dictionary__'])
[docs]def encode_numpy_array(item):
""" Encode a numpy array to JSON """
return serializer.encode_data(item)
[docs]def decode_numpy_array(item):
""" Decode a numpy array from JSON """
if 'dtype' in item[JsonSerializeKey.CONTENT]:
item[JsonSerializeKey.CONTENT][NumpyKeys.DATA_TYPE] = item[JsonSerializeKey.CONTENT].pop('dtype')
if 'shape' in item[JsonSerializeKey.CONTENT]:
item[JsonSerializeKey.CONTENT][NumpyKeys.SHAPE] = item[JsonSerializeKey.CONTENT].pop('shape')
return serializer.decode_data(item)
[docs]def encode_numpy_number(item):
""" Encode a numpy scalar to JSON """
return serializer.encode_data(item)
[docs]def decode_numpy_number(item):
""" Decode a numpy scalar from JSON """
if 'dtype' in item[JsonSerializeKey.CONTENT]:
item[JsonSerializeKey.CONTENT][NumpyKeys.DATA_TYPE] = item[JsonSerializeKey.CONTENT].pop('dtype')
return serializer.decode_data(item)
[docs]def encode_json(data: object) -> str:
""" Encode Python object to JSON
Args:
data: data to be encoded
Returns
String with formatted JSON
"""
return qtt_serializer.serialize(data)
[docs]def decode_json(json_string: str) -> Any:
""" Decode Python object to JSON
Args:
json_string: data to be decoded
Returns
Python object
"""
return qtt_serializer.unserialize(json_string)
[docs]def save_json(data: Any, filename: str):
""" Write a Python object to a JSON file
Args:
data (object): object to be serialized
filename (str): filename to write data to
"""
with open(filename, 'wt') as fid:
fid.write(encode_json(data))
[docs]def load_json(filename: str) -> object:
""" Write a Python object from a JSON file
Args:
filename (str): filename to write data to
Returns:
object: object loaded from JSON file
"""
with open(filename, 'rt') as fid:
data = fid.read()
return decode_json(data)
qtt_serializer = QttSerializer()