def _expt_settings_diagonal_in_tpb(es1: ExperimentSetting, es2: ExperimentSetting): """ Extends the concept of being diagonal in the same tpb to ExperimentSettings, by determining if the pairs of in_states and out_operators are separately diagonal in the same tpb """ max_weight_in = _max_weight_state([es1.in_state, es2.in_state]) max_weight_out = _max_weight_operator([es1.out_operator, es2.out_operator]) return max_weight_in is not None and max_weight_out is not None
def test_expt_settings_share_ntpb(): expts = [[ ExperimentSetting(zeros_state([0, 1]), sX(0) * sI(1)), ExperimentSetting(zeros_state([0, 1]), sI(0) * sX(1)) ], [ ExperimentSetting(zeros_state([0, 1]), sZ(0) * sI(1)), ExperimentSetting(zeros_state([0, 1]), sI(0) * sZ(1)) ]] for group in expts: for e1, e2 in itertools.combinations(group, 2): assert _max_weight_state([e1.in_state, e2.in_state]) is not None assert _max_weight_operator([e1.out_operator, e2.out_operator]) is not None
def test_max_weight_operator_3(): pauli_terms = [sZ(0) * sX(5), sX(1) * sZ(0), sY(2) * sX(1), sZ(5) * sI(3)] assert _max_weight_operator(pauli_terms) is None
def test_max_weight_operator_1(): pauli_terms = [sZ(0), sX(1) * sZ(0), sY(2) * sX(1)] assert _max_weight_operator(pauli_terms) == sY(2) * sX(1) * sZ(0)
def test_max_weight_operator_4(): # this last example illustrates that a pair of commuting operators # need not be diagonal in the same tpb assert _max_weight_operator([sX(1) * sZ(0), sZ(1) * sX(0)]) is None
def test_max_weight_operator_misc(): assert _max_weight_operator([sZ(0), sZ(0) * sZ(1)]) is not None assert _max_weight_operator([sX(5), sZ(4)]) is not None assert _max_weight_operator([sX(0), sY(0) * sZ(2)]) is None x_term = sX(0) * sX(1) z1_term = sZ(1) z0_term = sZ(0) z0z1_term = sZ(0) * sZ(1) assert _max_weight_operator([x_term, z1_term]) is None assert _max_weight_operator([z0z1_term, x_term]) is None assert _max_weight_operator([z1_term, z0_term]) is not None assert _max_weight_operator([z0z1_term, z0_term]) is not None assert _max_weight_operator([z0z1_term, z1_term]) is not None assert _max_weight_operator([z0z1_term, sI(1)]) is not None assert _max_weight_operator([z0z1_term, sI(2)]) is not None assert _max_weight_operator([z0z1_term, sX(5) * sZ(7)]) is not None xxxx_terms = sX(1) * sX(2) + sX(2) + sX(3) * sX(4) + sX(4) + \ sX(1) * sX(3) * sX(4) + sX(1) * sX(4) + sX(1) * sX(2) * sX(3) true_term = sX(1) * sX(2) * sX(3) * sX(4) assert _max_weight_operator(xxxx_terms.terms) == true_term zzzz_terms = sZ(1) * sZ(2) + sZ(3) * sZ(4) + \ sZ(1) * sZ(3) + sZ(1) * sZ(3) * sZ(4) assert _max_weight_operator(zzzz_terms.terms) == sZ(1) * sZ(2) * \ sZ(3) * sZ(4) pauli_terms = [sZ(0), sX(1) * sZ(0), sY(2) * sX(1), sZ(5) * sI(3)] assert _max_weight_operator(pauli_terms) == sZ(5) * sY(2) * sX(1) * sZ(0)