From 3e98e1722bef88360a5a09bb9db847407b35d2b2 Mon Sep 17 00:00:00 2001 From: "Stefan K. Seritan" Date: Wed, 13 Sep 2023 11:25:55 -0700 Subject: [PATCH 1/2] Bugfix for instrument dim in report. --- pygsti/report/reportables.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pygsti/report/reportables.py b/pygsti/report/reportables.py index 216bba4ac..2e5e13bcd 100644 --- a/pygsti/report/reportables.py +++ b/pygsti/report/reportables.py @@ -2547,15 +2547,16 @@ def instrument_half_diamond_norm(a, b, mx_basis): float """ #Turn instrument into a CPTP map on qubit + classical space. - mx_basis = _Basis.cast(mx_basis, dim=a.dim) + adim = a.state_space.dim + mx_basis = _Basis.cast(mx_basis, dim=adim) nComps = len(a.keys()) sumbasis = _DirectSumBasis([mx_basis] * nComps) - composite_op = _np.zeros((a.dim * nComps, a.dim * nComps), 'd') - composite_top = _np.zeros((a.dim * nComps, a.dim * nComps), 'd') + composite_op = _np.zeros((adim * nComps, adim * nComps), 'd') + composite_top = _np.zeros((adim * nComps, adim * nComps), 'd') for i, clbl in enumerate(a.keys()): - aa, bb = i * a.dim, (i + 1) * a.dim + aa, bb = i * adim, (i + 1) * adim for j in range(nComps): - cc, dd = j * a.dim, (j + 1) * a.dim + cc, dd = j * adim, (j + 1) * adim composite_op[aa:bb, cc:dd] = a[clbl].to_dense(on_space='HilbertSchmidt') composite_top[aa:bb, cc:dd] = b[clbl].to_dense(on_space='HilbertSchmidt') return half_diamond_norm(composite_op, composite_top, sumbasis) From 843d7143ee569a481368806ec0d80f64913b169b Mon Sep 17 00:00:00 2001 From: "Stefan K. Seritan" Date: Wed, 13 Sep 2023 12:10:17 -0700 Subject: [PATCH 2/2] Bugfix for models from pspecs with instruments. Should also fix StandardGST runs with instruments. --- pygsti/models/explicitmodel.py | 6 ++++-- pygsti/models/modelconstruction.py | 19 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/pygsti/models/explicitmodel.py b/pygsti/models/explicitmodel.py index 8187a8513..1798c77cf 100644 --- a/pygsti/models/explicitmodel.py +++ b/pygsti/models/explicitmodel.py @@ -1565,10 +1565,12 @@ def add_availability(opkey, op): if all([udim == 2 for udim in all_udims]): return _QubitProcessorSpec(nqudits, list(gate_unitaries.keys()), gate_unitaries, availability, - qubit_labels=qudit_labels) + qubit_labels=qudit_labels, + instrument_names=list(self.instruments.keys()), nonstd_instruments=self.instruments) else: return _QuditProcessorSpec(qudit_labels, all_udims, list(gate_unitaries.keys()), gate_unitaries, - availability) + availability, + instrument_names=list(self.instruments.keys()), nonstd_instruments=self.instruments) def create_modelmember_graph(self): return _MMGraph({ diff --git a/pygsti/models/modelconstruction.py b/pygsti/models/modelconstruction.py index 3c477f8c3..b986f2c4e 100644 --- a/pygsti/models/modelconstruction.py +++ b/pygsti/models/modelconstruction.py @@ -936,13 +936,18 @@ def _spec_to_densevec(spec, is_prep): inst_members = {} for k, lst in instrument_spec.items(): member = None - for effect_spec, prep_spec in lst: - effect_vec = _spec_to_densevec(effect_spec, is_prep=False) - prep_vec = _spec_to_densevec(prep_spec, is_prep=True) - if member is None: - member = _np.outer(effect_vec, prep_vec) - else: - member += _np.outer(effect_vec, prep_vec) + if len(lst) == 2: + for effect_spec, prep_spec in lst: + effect_vec = _spec_to_densevec(effect_spec, is_prep=False) + prep_vec = _spec_to_densevec(prep_spec, is_prep=True) + if member is None: + member = _np.outer(effect_vec, prep_vec) + else: + member += _np.outer(effect_vec, prep_vec) + else: # elements are key, array of outer product already + # TODO: This appears to be the new standard format. Deprecate outer prod code above? + # But old code could still be useful. + member = lst.copy() assert (member is not None), \ "You must provide at least one rank-1 specifier for each instrument member!"