Fermi-Hubbard spin-charge separation results

View on QuantumAI Run in Google Colab View source on GitHub Download notebook

This notebook presents the experimental data which was collected on Google Rainbow processor for the Fermi-Hubbard spin-charge separation experiment.

try:
    import recirq
except ImportError:
    print("Installing ReCirq...")
    !pip install git+https://github.com/quantumlib/recirq --quiet
    print("Installed ReCirq!")
import glob
from tqdm.notebook import tqdm

from recirq.fermi_hubbard import (
    InstanceBundle,
    apply_rescalings_to_bundles,
    find_bundles_rescalings,
    load_experiment,
    plot_quantity
)
from recirq.fermi_hubbard.publication import (
    parasitic_cphase_compensation,
    fetch_publication_data
)

# Hide numpy warnings
import warnings
warnings.filterwarnings('ignore')

Get the data

In order to run this notebook, the data sets gaussians_1u1d.zip, trapping_2u2d.zip and trapping_3u3d.zip need to be downloaded and extracted from https://doi.org/10.5061/dryad.crjdfn32v. The function fetch_publication_data is a utility to do this.

data_dir = "fermi_hubbard_data"
fetch_publication_data(base_dir=data_dir)
Downloading gaussians_1u1d_nofloquet...
Successfully downloaded.

Downloading gaussians_1u1d...
Successfully downloaded.

Downloading trapping_2u2d...
Successfully downloaded.

Downloading trapping_3u3d...
Successfully downloaded.

Noninteracting Gaussians

# Load results and create a bundle with extracted quantities.
gaussians_1u1d_files = glob.glob(f'{data_dir}/gaussians_1u1d/0.0/*.json')
gaussians_bundle = InstanceBundle(
    experiments=[load_experiment(file) for file in gaussians_1u1d_files],
    steps=range(65),
    rescale_steps=range(65))
# Simulate the exact numerical results that are used as a reference.
with tqdm(range(len(gaussians_bundle.steps))) as progress:
    def post_run(_1, _2):
        progress.update()
    gaussians_bundle.cache_exact_numerics(post_run_func=post_run)
0%|          | 0/65 [00:00<?, ?it/s]
plot_quantity(gaussians_bundle, 'post_selection', show_std_dev=True);

png

plot_quantity(gaussians_bundle, 'scaling', show_std_error=True);

png

# The data for this quantity can be viewed after double-clicking this cell output.
plot_quantity(gaussians_bundle, 'up_down_density', show_std_error=True);

png

plot_quantity(gaussians_bundle, 'up_down_position_average', show_std_error=True);

png

plot_quantity(gaussians_bundle, 'up_down_position_average_dt', show_std_error=True);

png

Trapping Potential N=4

# Load results and create a bundles with extracted quantities for each
# interaction strength.
trapping_2u2d_files = [
    glob.glob(f'{data_dir}/trapping_2u2d/{u}/*.json')
    for u in [0.0, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]]
trapping_2u2d_bundles = [InstanceBundle(
    experiments=[load_experiment(file) for file in files],
    numerics_transform=parasitic_cphase_compensation(0.138),
    steps=range(11),
    rescale_steps=range(11)) for files in trapping_2u2d_files]
# Simulate the exact numerical results that are used as a reference.
total_steps = sum(len(bundle.steps) for bundle in trapping_2u2d_bundles)
with tqdm(range(total_steps)) as progress:
    def post_run(_1, _2):
        progress.update()
    for bundle in trapping_2u2d_bundles:
        bundle.cache_exact_numerics(post_run_func=post_run)
0%|          | 0/110 [00:00<?, ?it/s]
# Use shared rescaling values among compatible problem instances.
apply_rescalings_to_bundles(find_bundles_rescalings(trapping_2u2d_bundles))
plot_quantity(trapping_2u2d_bundles, 'post_selection', show_std_dev=True);

png

plot_quantity(trapping_2u2d_bundles, 'scaling', show_std_error=True);

png

plot_quantity(trapping_2u2d_bundles, 'charge_spin_density', show_std_error=True);

png

plot_quantity(trapping_2u2d_bundles, 'charge_spin_spreading', show_std_error=True);

png

plot_quantity(trapping_2u2d_bundles, 'charge_spin_spreading_dt', show_std_error=True);

png

Trapping Potential N=6

# Load results and create a bundles with extracted quantities for each 
# interaction strength.
trapping_3u3d_files = [
    glob.glob(f'{data_dir}/trapping_3u3d/{u}/*.json')
    for u in [0.0, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]]
trapping_3u3d_bundles = [InstanceBundle(
    experiments=[load_experiment(file) for file in files],
    numerics_transform=parasitic_cphase_compensation(0.138),
    steps=range(11),
    rescale_steps=range(11)) for files in trapping_3u3d_files]
# Simulate the exact numerical results that are used as a reference.
total_steps = sum(len(bundle.steps) for bundle in trapping_3u3d_bundles)
with tqdm(range(total_steps)) as progress:
    def post_run(_1, _2):
        progress.update()
    for bundle in trapping_3u3d_bundles:
        bundle.cache_exact_numerics(post_run_func=post_run)
0%|          | 0/110 [00:00<?, ?it/s]
# Use shared rescaling values among compatible problem instances.
apply_rescalings_to_bundles(find_bundles_rescalings(trapping_3u3d_bundles))
plot_quantity(trapping_3u3d_bundles, 'post_selection', show_std_dev=True);

png

plot_quantity(trapping_3u3d_bundles, 'scaling', show_std_error=True);

png

plot_quantity(trapping_3u3d_bundles, 'charge_spin_density', show_std_error=True);

png

plot_quantity(trapping_3u3d_bundles, 'charge_spin_spreading', show_std_error=True);

png

plot_quantity(trapping_3u3d_bundles, 'charge_spin_spreading_dt', show_std_error=True);

png