@@ -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
458515def gridsynth_circuit (
459516 theta ,
0 commit comments