• Pharma

PASQAL Neutral Atom Quantum Computing for Pharmaceutical Molecular Docking

PASQAL

PASQAL partnered with a European pharmaceutical company to apply neutral atom analog quantum computing to molecular docking optimization. PASQAL's Fresnel processor arranges 100+ Rydberg atoms in a 2D plane, using analog pulse sequences to simulate the energy landscape of drug-receptor binding interactions. The molecular docking problem was encoded as a maximum independent set (MIS) problem on the Rydberg blockade interaction graph, enabling analog quantum simulation without gate decomposition.

Key Outcome
Identified 3 drug-receptor binding conformations matching classical AutoDock results; analog quantum approach reduced screening time by 40% for a 20-compound library.

PASQAL’s Fresnel processor places rubidium atoms in reconfigurable 2D arrays using optical tweezers. Each atom acts as a qubit encoded in two hyperfine ground states, and strong Rydberg interactions between nearby atoms create a natural “blockade” effect: when one atom is excited to a Rydberg state, neighboring atoms within a blockade radius cannot be simultaneously excited. This physics maps directly onto the maximum independent set (MIS) problem; find the largest subset of graph nodes such that no two selected nodes share an edge. The key insight for molecular docking is that candidate binding conformations can be encoded as graph nodes, with edges between conformations that sterically clash, and the lowest-energy binding set corresponds to an MIS on the interaction graph.

The encoding pipeline converts molecular docking search space into a unit-disk graph. For each of the 20 screened compounds, AutoDock Vina was first run to generate 50-100 candidate poses per compound. A graph was built where nodes represent poses and edges connect poses with steric overlap energy above a threshold. This graph was then embedded into a 2D Euclidean layout compatible with Fresnel’s atom positioning constraints, with edge presence determined by the Rydberg blockade radius. The Pulser SDK was used to define adiabatic pulse sequences that slowly ramp the Rydberg drive amplitude, guiding the system from a product state into the ground state encoding the MIS solution.

import pulser
from pulser import Pulse, Sequence, Register
from pulser.devices import Fresnel
import numpy as np
import networkx as nx

# Define atom register from 2D graph embedding
# Positions in micrometers; Rydberg blockade radius ~ 9 um for Fresnel
def build_register(graph_positions: dict[int, tuple[float, float]]) -> Register:
    qubits = {f"q{i}": (x, y) for i, (x, y) in graph_positions.items()}
    return Register(qubits)

# Define adiabatic MIS pulse sequence
def mis_pulse_sequence(register: Register, t_ramp: float = 4000) -> Sequence:
    """
    Adiabatic ramp for MIS: sweep detuning from negative to positive
    while keeping Rabi amplitude at peak, then bring down.
    t_ramp in nanoseconds.
    """
    seq = Sequence(register, Fresnel)
    seq.declare_channel("rydberg_global", "rydberg_global")

    # Adiabatic ramp: delta goes from -2*Omega to +2*Omega
    omega_max = 2 * np.pi * 1.0  # MHz, within Fresnel limits
    delta_start = -2 * omega_max
    delta_end = 2 * omega_max

    adiabatic_pulse = Pulse.ConstantAmplitude(
        amplitude=omega_max,
        detuning=pulser.waveforms.RampWaveform(t_ramp, delta_start, delta_end),
        phase=0.0,
    )
    seq.add(adiabatic_pulse, "rydberg_global")
    return seq

# Decode measurement bitstring to selected poses
def decode_mis_result(bitstring: str, node_to_pose: dict) -> list:
    selected = [node_to_pose[i] for i, bit in enumerate(bitstring) if bit == "1"]
    return selected

# Example: build graph for compound screening
G = nx.random_geometric_graph(30, radius=0.25, seed=42)  # placeholder clash graph
positions = nx.get_node_attributes(G, "pos")

# Scale positions to micrometers for Fresnel register
scaled = {n: (p[0] * 30, p[1] * 30) for n, p in positions.items()}
reg = build_register(scaled)

seq = mis_pulse_sequence(reg, t_ramp=4000)
print(seq)

# Simulate with Pulser's EMU-TN backend (tensor network emulator)
from pulser_simulation import QutipEmulator
sim = QutipEmulator.from_sequence(seq)
results = sim.run()
counts = results.sample_final_state(1000)

# Top bitstring = best MIS candidate
best = max(counts, key=counts.get)
print(f"Best MIS bitstring: {best}, count: {counts[best]}")

Classical post-processing verified MIS solutions against the steric clash constraints and re-scored selected poses using a force field (MM-GBSA) to rank binding affinities. Three compounds showed binding conformations identified by the quantum MIS procedure that matched AutoDock reference results within 0.5 angstrom RMSD. The analog approach’s advantage comes from avoiding explicit gate decomposition: the Rydberg blockade physics directly implements the MIS constraint Hamiltonian, sidestepping circuit depth limitations that plague digital approaches at this problem size. Across the 20-compound library, screening time fell 40% compared to exhaustive classical pose clustering, with the bulk of time saved in the combinatorial selection step rather than force field evaluation.