def check_phase_circuit(register_sizes,
expected_turns,
engine_list,
actions):
"""
Args:
register_sizes (list[int]):
expected_turns (function(register_sizes: tuple[int],
register_vals: tuple[int])):
engine_list (list[projectq.cengines.BasicEngine]):
actions (function(eng: MainEngine, registers: list[Qureg])):
"""
sim = Simulator()
rec = DummyEngine(save_commands=True)
eng = MainEngine(backend=sim, engine_list=list(engine_list) + [rec])
registers = [eng.allocate_qureg(size) for size in register_sizes]
# Simulate all.
for reg in registers:
for q in reg:
H | q
rec.received_commands = []
actions(eng, registers)
state = np.array(sim.cheat()[1])
magnitude_factor = math.sqrt(len(state))
actions = list(rec.received_commands)
for reg in registers:
for q in reg:
Measure | q
# Compare.
for i in range(len(state)):
vals = []
t = 0
for r in register_sizes:
vals.append((i >> t) & ((1 << r) - 1))
t += r
vals = tuple(vals)
actual_factor = state[i]
expected_turn = expected_turns(register_sizes, vals)
actual_turn = cmath.phase(state[i]) / (2 * math.pi)
delta_turn = abs((actual_turn - expected_turn + 0.5) % 1 - 0.5)
if not (delta_turn < 0.00001):
print(commands_to_ascii_circuit(actions))
print("Register Sizes", register_sizes)
print("Conflicting state: {}".format(vals))
print("Expected phase: {} deg".format(float(expected_turn)*360))
print("Actual phase: {} deg".format(actual_turn*360))
assert abs(abs(actual_factor * magnitude_factor) - 1) < 0.00001
assert delta_turn < 0.00001
python类phase()的实例源码
def symbol_recovery_24(xdi, xdq):
angles = numpy.where(xdi >= 0, numpy.arctan2(xdq, xdi), numpy.arctan2(-xdq, -xdi))
theta = (signal.convolve(angles, smooth)) [-len(xdi):]
xr = (xdi + 1j * xdq) * numpy.exp(-1j * theta)
bi = (numpy.real(xr) >= 0) + 0
# pll parameters
period = 24
halfPeriod = period / 2
corr = period / 24.
phase = 0
res = []
pin = 0
stats = {0: 0, 1: 1}
oddity = 0
latestXrSquared = [0]*8
lxsIndex = 0
theta = [0]
shift = 0
# pll, system model, error calculation, estimate update
for i in range(1, len(bi)):
if bi[i-1] != bi[i]:
if phase < halfPeriod-2:
phase += corr
elif phase > halfPeriod+2:
phase -= corr
if phase >= period:
phase -= period
latestXrSquared[lxsIndex] = (xdi[i] + 1j * xdq[i])**2
lxsIndex += 1
if lxsIndex >= len(latestXrSquared):
lxsIndex = 0
th = shift + cmath.phase(sum(latestXrSquared)) / 2
if abs(th - theta[-1]) > 2:
if th < theta[-1]:
shift += math.pi
th += math.pi
else:
shift -= math.pi
th -= math.pi
theta.append(th)
oddity += 1
if oddity == 2:
oddity = 0
yp = (xdi[i] + 1j * xdq[i])
ypp = cmath.exp(-1j * th) * yp
# bit decode
nin = 1 * (ypp.real > 0)
stats[nin] += 1
res.append(pin ^ nin)
pin = nin
phase += 1
return res