Skip to content

Commit 41f9a4e

Browse files
committed
check
1 parent dd83c78 commit 41f9a4e

1 file changed

Lines changed: 80 additions & 23 deletions

File tree

pygridsynth/gridsynth.py

Lines changed: 80 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,6 @@ def gridsynth(
246246
epsilon=epsilon,
247247
dps=dps,
248248
loop_controller=loop_controller,
249-
phase=phase,
250249
verbose=verbose,
251250
measure_time=measure_time,
252251
show_graph=show_graph)
@@ -256,7 +255,6 @@ def gridsynth(
256255
epsilon=epsilon,
257256
dps=dps,
258257
loop_controller=loop_controller,
259-
phase=phase,
260258
verbose=verbose,
261259
measure_time=measure_time,
262260
show_graph=show_graph)
@@ -268,7 +266,6 @@ def _gridsynth_exact(
268266
epsilon,
269267
dps=None,
270268
loop_controller=None,
271-
phase=False,
272269
verbose=False,
273270
measure_time=False,
274271
show_graph=False,
@@ -350,7 +347,6 @@ def _gridsynth_upto_phase(
350347
epsilon,
351348
dps=None,
352349
loop_controller=None,
353-
phase=False,
354350
verbose=False,
355351
measure_time=False,
356352
show_graph=False,
@@ -393,39 +389,35 @@ def _gridsynth_upto_phase(
393389
if measure_time:
394390
start = time.time()
395391

396-
sol = solve_TDGP(
392+
sol0 = _candidates(
397393
epsilon_region,
398394
unit_disk,
399-
*transformed,
400-
k,
401-
phase=phase,
395+
transformed,
396+
phase=False,
402397
verbose=verbose,
403398
show_graph=show_graph,
404399
)
405400

406-
sol1 = solve_TDGP(
401+
sol1 = _candidates(
407402
epsilon_region1,
408403
unit_disk1,
409-
*transformed1,
410-
k,
411-
phase=phase,
404+
transformed1,
405+
phase=True,
412406
verbose=verbose,
413407
show_graph=show_graph,
414408
)
415409

416-
if measure_time:
417-
time_of_solve_TDGP += time.time() - start
410+
candidates = all_candidates(sol0, sol1)
418411

419412
start = time.time()
420413

421-
# for (z, z1) in zip(sol, sol1):
422-
for z in sol1:
423-
424-
z = z * inv_delta
425-
414+
for (tcount, z, phase) in candidates():
415+
if (z * z.conj).residue == 0 and not phase:
416+
continue
426417
xi = 1 - DRootTwo.fromDOmega(z.conj * z)
427418
w = diophantine_dyadic(xi, loop_controller=loop_controller)
428419
if w != NO_SOLUTION:
420+
# print(f"{tcount} {phase}")
429421
z = z.reduce_denomexp()
430422
w = w.reduce_denomexp()
431423

@@ -434,10 +426,16 @@ def _gridsynth_upto_phase(
434426
elif z.k < w.k:
435427
z = z.renew_denomexp(w.k)
436428

437-
if (z + w).reduce_denomexp().k < z.k:
438-
u_approx = DOmegaUnitary(z, w, 7)
429+
if phase:
430+
if (z + w).reduce_denomexp().k < z.k:
431+
u_approx = DOmegaUnitary(z, w, 7)
432+
else:
433+
u_approx = DOmegaUnitary(z, w.mul_by_omega_inv(), 7)
439434
else:
440-
u_approx = DOmegaUnitary(z, w.mul_by_omega_inv(), 7)
435+
if (z + w).reduce_denomexp().k < z.k:
436+
u_approx = DOmegaUnitary(z, w, 0)
437+
else:
438+
u_approx = DOmegaUnitary(z, w.mul_by_omega(), 0)
441439

442440
if measure_time:
443441
time_of_diophantine_dyadic += time.time() - start
@@ -448,12 +446,71 @@ def _gridsynth_upto_phase(
448446
)
449447
if verbose:
450448
print(f"{z=}, {w=}")
449+
print(f"tcount={tcount} phase={phase}")
451450
print("------------------")
451+
452452
return u_approx
453453
if measure_time:
454454
time_of_diophantine_dyadic += time.time() - start
455-
k += 1
456455

456+
def _candidates(
457+
epsilon_region,
458+
disk,
459+
transformed,
460+
phase=False,
461+
verbose=False,
462+
show_graph=False,
463+
# measure_time=False,
464+
):
465+
if phase:
466+
inv_delta = DOmega(ZOmega(0, -1, 1, 0), 1)
467+
def icandidates():
468+
k = 0
469+
while True:
470+
sol = solve_TDGP(
471+
epsilon_region,
472+
disk,
473+
*transformed,
474+
k,
475+
phase=phase,
476+
verbose=verbose,
477+
show_graph=show_graph,
478+
)
479+
# if measure_time:
480+
# time_of_solve_TDGP += time.time() - start
481+
482+
for z in sol:
483+
klde = z.k
484+
if klde > 0:
485+
tcount = 2*klde - 2
486+
else:
487+
tcount = 0
488+
if phase:
489+
tcount += 1
490+
z = z * inv_delta
491+
yield (tcount, z, phase)
492+
k += 1
493+
494+
return icandidates
495+
496+
def all_candidates(icandidates0, icandidates1):
497+
c0 = icandidates0()
498+
c1 = icandidates1()
499+
def itall_candidates():
500+
tup0 = next(c0)
501+
tup1 = next(c1)
502+
503+
while True:
504+
tcount0 = tup0[0]
505+
tcount1 = tup1[0]
506+
507+
if tcount0 < tcount1:
508+
yield tup0
509+
tup0 = next(c0)
510+
else:
511+
yield tup1
512+
tup1 = next(c1)
513+
return itall_candidates
457514

458515
def gridsynth_circuit(
459516
theta,

0 commit comments

Comments
 (0)