This tutorials show how model parameters are labelled, and how this can be used to create more complex parameterizations for a model.
import pygsti
import numpy as np
from pygsti.modelpacks import smq1Q_XY as std
from pygsti.baseobjs import Label
mdl1 = std.target_model("H+s") # choose a H+s model because it has a simple parameterization
A Model
's parameters have corresponding labels, which can be accessed in a variety of ways. Individual operators also have labeled parameters. An OpModel
(e.g. an ExplicitModel
or ImplicitModel
) sets default parameter labels based on the parameter labels of its contained operators, but the model's parameters can vary independently.
# print the raw labels, straight up
mdl1.parameter_labels
# model parameters can be set to arbitrary user-defined values
mdl1.set_parameter_label(index=0, label="My favorite parameter")
# Model parameters in a nice format for printing
mdl1.parameter_labels_pretty
# For a single operator: you can get it's "local" parameter labels (in general different from the model's parameter labels)
mdl1.operations[('Gxpi2',0)].parameter_labels
# The parameters of all the operators, with mappings to non-default model parameters
mdl1.print_parameters_by_op()
You can combined multiple parameters into one using the collect_parameters
method. This effectively ties the values for all the original parameters together.
mdl1.collect_parameters([ (('Gxpi2',0), 'X Hamiltonian error coefficient'),
(('Gypi2',0), 'Y Hamiltonian error coefficient')],
new_param_label='Over-rotation')
# Using "pretty" labels works too:
mdl1.collect_parameters(['Gxpi2:0: Y stochastic coefficient',
'Gxpi2:0: Z stochastic coefficient' ],
new_param_label='Gxpi2 off-axis stochastic')
# You can also use integer indices, and parameter labels can be tuples too.
mdl1.collect_parameters([3,4,5], new_param_label=("rho0", "common stochastic coefficient"))
# There are now fewer parameters
mdl1.parameter_labels_pretty
# And you can see how they're wired up for each op:
mdl1.print_parameters_by_op()
You can also reverse the above process and "un-collect" a parameter so that one parameter gets replaced my multiple independent ones.
mdl1.uncollect_parameters('Gxpi2 off-axis stochastic')
mdl1.print_parameters_by_op()