def _get_flipped_protoquil_program(program: Program) -> Program: """For symmetrization, generate a program where X gates are added before measurement. Forest 1.3 is really picky about where the measure instructions happen. It has to be at the end! """ program = program.copy() to_measure = [] while len(program) > 0: inst = program.instructions[-1] if isinstance(inst, Measurement): program.pop() to_measure.append((inst.qubit, inst.classical_reg)) else: break program += Pragma('PRESERVE_BLOCK') for qu, addr in to_measure[::-1]: program += RX(pi, qu) program += Pragma('END_PRESERVE_BLOCK') for qu, addr in to_measure[::-1]: program += Measurement(qubit=qu, classical_reg=addr) return program
def test_subtracting_memory_regions(): # https://github.com/rigetti/pyquil/issues/709 p = Program() alpha = p.declare("alpha", "REAL") beta = p.declare("beta", "REAL") p += RZ(alpha - beta, 0) p2 = Program(p.out()) parsed_rz = p2.pop() # type: Gate parsed_param = parsed_rz.params[0] assert isinstance(parsed_param, Sub) assert parsed_param.op1 == alpha assert parsed_param.op2 == beta
def test_program_pop(): prog = Program(X(0), X(1)) instruction = prog.pop() assert prog.out() == "X 0\n" assert Program(instruction).out() == "X 1\n"