def test_benchmark_2q_xeb_fidelities(circuits_cycle_depths_sampled_df, pass_cycle_depths): circuits, cycle_depths, sampled_df = circuits_cycle_depths_sampled_df if pass_cycle_depths: fid_df = benchmark_2q_xeb_fidelities(sampled_df, circuits, cycle_depths) else: fid_df = benchmark_2q_xeb_fidelities(sampled_df, circuits) assert len(fid_df) == len(cycle_depths) assert sorted(fid_df['cycle_depth'].unique()) == cycle_depths.tolist() assert np.all(fid_df['fidelity'] > 0.98) fit_df = fit_exponential_decays(fid_df) for _, row in fit_df.iterrows(): assert list(row['cycle_depths']) == list(cycle_depths) assert len(row['fidelities']) == len(cycle_depths)
def test_benchmark_2q_xeb_fidelities_parallel(): circuits = rqcg.generate_library_of_2q_circuits( n_library_circuits=5, two_qubit_gate=cirq.ISWAP**0.5, max_cycle_depth=4) cycle_depths = [2, 3, 4] graph = _gridqubits_to_graph_device(cirq.GridQubit.rect(2, 2)) combs = rqcg.get_random_combinations_for_device( n_library_circuits=len(circuits), n_combinations=2, device_graph=graph, random_state=10) sampled_df = sample_2q_xeb_circuits( sampler=cirq.Simulator(), circuits=circuits, cycle_depths=cycle_depths, combinations_by_layer=combs, ) fid_df = benchmark_2q_xeb_fidelities(sampled_df, circuits, cycle_depths) n_pairs = sum(len(c.pairs) for c in combs) assert len(fid_df) == len(cycle_depths) * n_pairs fit_df = fit_exponential_decays(fid_df) for _, row in fit_df.iterrows(): assert list(row['cycle_depths']) == list(cycle_depths) assert len(row['fidelities']) == len(cycle_depths)
def test_benchmark_2q_xeb_fidelities(): q0, q1 = cirq.LineQubit.range(2) circuits = [ rqcg.random_rotations_between_two_qubit_circuit( q0, q1, depth=50, two_qubit_op_factory=lambda a, b, _: SQRT_ISWAP(a, b), seed=52) for _ in range(2) ] cycle_depths = np.arange(3, 50, 9) sampled_df = sample_2q_xeb_circuits(sampler=cirq.Simulator(seed=53), circuits=circuits, cycle_depths=cycle_depths) fid_df = benchmark_2q_xeb_fidelities(sampled_df, circuits, cycle_depths) assert len(fid_df) == len(cycle_depths) for _, row in fid_df.iterrows(): assert row['cycle_depth'] in cycle_depths assert row['fidelity'] > 0.98 fit_df = fit_exponential_decays(fid_df) for _, row in fit_df.iterrows(): assert list(row['cycle_depths']) == list(cycle_depths) assert len(row['fidelities']) == len(cycle_depths)
def test_benchmark_2q_xeb_subsample_depths(circuits_cycle_depths_sampled_df): circuits, _, sampled_df = circuits_cycle_depths_sampled_df cycle_depths = [10, 20] fid_df = benchmark_2q_xeb_fidelities(sampled_df, circuits, cycle_depths) assert len(fid_df) == len(cycle_depths) assert sorted(fid_df['cycle_depth'].unique()) == cycle_depths cycle_depths = [11, 21] with pytest.raises(ValueError): _ = benchmark_2q_xeb_fidelities(sampled_df, circuits, cycle_depths) cycle_depths = [10, 100_000] with pytest.raises(ValueError): _ = benchmark_2q_xeb_fidelities(sampled_df, circuits, cycle_depths) cycle_depths = [] with pytest.raises(ValueError): _ = benchmark_2q_xeb_fidelities(sampled_df, circuits, cycle_depths)
def test_parallel_full_workflow(use_pool): circuits = rqcg.generate_library_of_2q_circuits( n_library_circuits=5, two_qubit_gate=cirq.ISWAP**0.5, max_cycle_depth=4, random_state=8675309, ) cycle_depths = [2, 3, 4] graph = _gridqubits_to_graph_device(cirq.GridQubit.rect(2, 2)) combs = rqcg.get_random_combinations_for_device( n_library_circuits=len(circuits), n_combinations=2, device_graph=graph, random_state=10) sampled_df = sample_2q_xeb_circuits( sampler=cirq.Simulator(), circuits=circuits, cycle_depths=cycle_depths, combinations_by_layer=combs, ) if use_pool: pool = multiprocessing.Pool() else: pool = None fids_df_0 = benchmark_2q_xeb_fidelities(sampled_df=sampled_df, circuits=circuits, cycle_depths=cycle_depths, pool=pool) options = SqrtISwapXEBOptions(characterize_zeta=False, characterize_gamma=False, characterize_chi=False) p_circuits = [ parameterize_circuit(circuit, options) for circuit in circuits ] result = characterize_phased_fsim_parameters_with_xeb_by_pair( sampled_df=sampled_df, parameterized_circuits=p_circuits, cycle_depths=cycle_depths, options=options, # super loose tolerances fatol=5e-2, xatol=5e-2, pool=pool, ) if pool is not None: pool.terminate() assert len(result.optimization_results) == graph.number_of_edges() for opt_res in result.optimization_results.values(): assert np.abs(opt_res.fun) < 0.1 # noiseless simulator assert len( result.fidelities_df) == len(cycle_depths) * graph.number_of_edges() assert np.all(result.fidelities_df['fidelity'] > 0.90) before_after_df = before_and_after_characterization( fids_df_0, characterization_result=result) for _, row in before_after_df.iterrows(): assert len(row['fidelities_0']) == len(cycle_depths) assert len(row['fidelities_c']) == len(cycle_depths) assert 0 <= row['a_0'] <= 1 assert 0 <= row['a_c'] <= 1 assert 0 <= row['layer_fid_0'] <= 1 assert 0 <= row['layer_fid_c'] <= 1