1. Calibration-Based Qubit Selection
Using IBM’s calibration CSV data, rank all 127 qubits based on three key metrics:
T_1: energy relaxation time (in microseconds)
T_2: dephasing time
ϵ_(√X): error rate of the √X (or sx) gate
Construct a data tuple for each qubit:
Data^i = (q_i, (T_1)^(i), (T_2)^(i), (ϵ_(√X))^i)
Sort all qubits by minimizing (ϵ_(√X))^i and maximizing (T_1)^(i) and (T_2)^(i).
Select the top 3 qubits to serve the roles:
[q_0, q_1, q_2]
These will be used to construct the repetition code circuit.
2. Circuit Initialization
Initialize a quantum circuit with:
QuantumRegister(3): {q_0, q_1, q_2}
ClassicalRegister(3): {c_0, c_1, c_2}
The qubits will serve the following roles:
q_0: Logical control qubit (initialized to ∣1⟩)
q_1, q_2: Redundant physical qubits for encoding
3. Logical Bit Encoding
Encode the logical state ∣1⟩ as:
∣1_L⟩ = ∣111⟩
This is done using standard CNOT gates for a 3-qubit repetition code:
Apply X to q_0:
X∣0⟩ = ∣1⟩
Apply CNOT from q_0 -> q_1, and q_0 -> q_2:
∣1⟩∣0⟩ CNOT ∣1⟩∣1⟩ -> ∣111⟩
This prepares the system in a classical error-correcting code that can resist a single bit-flip.
4. Twistor-Inspired Entanglement Layer
Apply a twistor encoding over the 3 physical qubits. This layer geometrically rotates and entangles qubits in a way inspired by twistor space constraints. For each qubit q_i in the code block, apply:
A rotation:
RY(θ_i), θ_i = π/4 (i + 1)
A conditional entanglement:
CX(q_i, q_(i + 1)) if i < 2
This creates geodesic entanglement, simulating the holomorphic curves of twistor geometry and imposing correlated phase structures across the qubits.
5. Error Injection
To simulate real-world decoherence, inject a bit-flip error on the middle qubit:
X(q_1)
This represents the most common single-qubit error and allows the experiment to test the recovery capability of both the repetition code and the effect of Twistor encoding.
6. Decoding via Majority Vote
Measure all three qubits in the computational basis:
Measure: q_0 -> c_0, q_1 -> c_1, q_2 -> c_2
Use post-processing to apply majority voting:
Logical ∣1⟩ is reconstructed if the majority of the bits are The expected correct output strings are:
{"111", "110", "101", "011"}
These represent correctable single-bit errors.
7. Transpilation and Execution
Transpile and execute using SamplerV2 with 8192 shots. All results are saved to a Json.
8. Logical Fidelity Calculation
Compute the logical fidelity:
F = (Shots with majority - 1)/(Total shots) = (∑_(b ∈ L_1) counts[b])/8192
L_1 = {"111", "110", "101", "011"}
This fidelity tells us the percentage of runs in which the repetition code successfully preserved or recovered the logical ∣1⟩, even after noise.
Code:
# Main circuit
# Imports
import numpy as np
import json
import logging
import pandas as pd
from qiskit import QuantumCircuit, transpile, QuantumRegister, ClassicalRegister
from qiskit_ibm_runtime import QiskitRuntimeService, Session, SamplerV2
from qiskit.circuit.library import RYGate, CXGate, XGate
from qiskit.visualization import plot_histogram
import matplotlib.pyplot as plt
# Setup logging
logging.basicConfig(level=logging. INFO)
logger = logging.getLogger(__name__)
# Load IBMQ account
service = QiskitRuntimeService(
channel='ibm_quantum',
instance='ibm-q/open/main',
token='YOUR_IBMQ_KEY_O-`'
)
# Backend
backend_name = 'ibm_brisbane'
backend = service.backend(backend_name)
# Load calibration data
def load_calibration_data(file_path):
logger. info("Loading calibration data from %s", file_path)
calibration_data = pd. read_csv(file_path)
calibration_data.columns = calibration_data.columns.str.strip()
logger. info("Calibration data loaded successfully")
return calibration_data
# Select best qubits
def select_best_qubits(calibration_data, n_qubits):
logger. info("Selecting best qubits based on T1, T2, and √X error")
qubits_sorted = calibration_data.sort_values(
by=["√x (sx) error", "T1 (us)", "T2 (us)"],
ascending=[True, False, False]
)
best_qubits = qubits_sorted["Qubit"].head(n_qubits).tolist()
logger. info("Selected qubits: %s", best_qubits)
return best_qubits
# Filepath for calibration data
calibration_file = '/Users/steventippeconnic/Downloads/ibm_brisbane_calibrations_2025-04-08T20_52_35Z.csv'
calibration_data = load_calibration_data(calibration_file)
selected_qubits = select_best_qubits(calibration_data, 3)
# Quantum and classical registers
qr = QuantumRegister(3, 'q')
cr = ClassicalRegister(3, 'c')
repetition_circuit = QuantumCircuit(qr, cr)
# Encode logical |1⟩ using repetition code
repetition_circuit.x(qr[0]) # Start with logical |1⟩
repetition_circuit.cx(qr[0], qr[1])
repetition_circuit.cx(qr[0], qr[2])
repetition_circuit.barrier()
# Twistor entanglement layer
def twistor_layer(qc, qubit_indices):
for i, q in enumerate(qubit_indices):
theta = np.pi / 4 * (i + 1)
qc.append(RYGate(theta), [q])
if i < len(qubit_indices) - 1:
qc.append(CXGate(), [q, qubit_indices[i + 1]])
qc.barrier()
twistor_layer(repetition_circuit, [qr[0], qr[1], qr[2]])
# Inject noise (bit-flip error)
repetition_circuit.append(XGate(), [qr[1]]) # Inject an X error into middle qubit
repetition_circuit.barrier()
# Decode by majority vote - measure all 3 qubits
repetition_circuit.measure(qr[0], cr[0])
repetition_circuit.measure(qr[1], cr[1])
repetition_circuit.measure(qr[2], cr[2])
repetition_circuit.barrier()
# Transpile
transpiled_qc = transpile(repetition_circuit, backend=backend, optimization_level=3)
# Execute
with Session(service=service, backend=backend) as session:
sampler = SamplerV2(session=session)
job = sampler. run([transpiled_qc], shots=8192)
job_result = job.result()
# Extract counts
data_bin = job_result._pub_results[0]['__value__']['data']
classical_register = transpiled_qc.cregs[0].name
counts = data_bin[classical_register].get_counts() if classical_register in data_bin else {}
# Save to Json
results_data = {
"experiment_name": "Twistor-Enhanced Quantum Repetition Code",
"raw_counts": counts
}
file_path = '/Users/steventippeconnic/Documents/QC/Twistor_Repetition_0.json'
with open(file_path, 'w') as f:
json.dump(results_data, f, indent=4)
# Fidelity Calculation Majority vote decoding: 3-bit strings, majority '1' should correspond to logical '1'
logical_1_strings = ['111', '110', '101', '011']
correct = sum(counts.get(b, 0) for b in logical_1_strings)
total_shots = sum(counts.values())
fidelity = correct / total_shots
print(f"Logical Fidelity (Twistor Repetition Code): {fidelity:.5f}")
# Plot results
plot_histogram(counts)
plt.title("Twistor-Enhanced Quantum Repetition Code")
plt. show()
# End
/////////////////////////////////////////////////////////////////
Code for All Visuals From Run Data
# Imports
import json
import matplotlib.pyplot as plt
import numpy as np
import math
from collections import Counter
from collections import defaultdict
# Load data
file_path = '/Users/steventippeconnic/Documents/QC/Twistor_Repetition_0.json'
with open(file_path, 'r') as f:
data = json.load(f)
counts = data["raw_counts"]
total_shots = sum(counts.values())
# Histogram of Measurement Outcomes
sorted_counts = dict(sorted(counts.items(), key=lambda x: x[1], reverse=True))
plt.figure(figsize=(10,5))
plt.bar(sorted_counts.keys(), sorted_counts.values(), color='steelblue')
plt.title("Measurement Histogram – Twistor Repetition Code")
plt.xlabel("Bitstring")
plt.ylabel("Counts")
plt.grid(True)
plt.tight_layout()
plt.show()
# Hamming Distance Shell Plot (from 111)
ideal = '111'
def hamming_distance(a, b):
return sum(x != y for x, y in zip(a, b))
hamming_shells = Counter()
for bitstring, count in counts.items():
dist = hamming_distance(bitstring, ideal)
hamming_shells[dist] += count
plt.figure(figsize=(6,4))
plt.bar(hamming_shells.keys(), hamming_shells.values(), color='darkred')
plt.title("Hamming Distance from Ideal Codeword (111)")
plt.xlabel("Hamming Distance")
plt.ylabel("Total Counts")
plt.xticks([0,1,2,3])
plt.grid(True)
plt.tight_layout()
plt.show()
# Entropy Contribution per Bitstring
bit_probs = {k: v/total_shots for k, v in counts.items()}
bit_entropy = {k: -p * math.log2(p) if p > 0 else 0 for k, p in bit_probs.items()}
plt.figure(figsize=(10,5))
plt.bar(bit_entropy.keys(), bit_entropy.values(), color='darkgreen')
plt.title("Entropy Contribution by Bitstring")
plt.xlabel("Bitstring")
plt.ylabel("Entropy (bits)")
plt.grid(True)
plt.tight_layout()
plt.show()
# Twistor Sector Projection (Complex Plane)
def bitstring_to_complex(bitstring):
idx = int(bitstring, 2)
angle = 2 * np.pi * idx / 8 # 3-bit = 8 states
r = np.sqrt(counts[bitstring] / total_shots)
return r * np.cos(angle), r * np.sin(angle)
plt.figure(figsize=(6,6))
for b in counts:
x, y = bitstring_to_complex(b)
plt.scatter(x, y, s=100, alpha=0.7, label=b)
plt.title("Complex Plane Projection of Bitstrings")
plt.xlabel("Re(ψ)")
plt.ylabel("Im(ψ)")
plt.grid(True)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5))
plt.gca().set_aspect('equal')
plt.tight_layout()
plt.show()
# Parity Class Histogram
even_parity = 0
odd_parity = 0
for bitstring, count in counts.items():
parity = sum(int(b) for b in bitstring) % 2
if parity == 0:
even_parity += count
else:
odd_parity += count
plt.figure(figsize=(5,4))
plt.bar(['Even Parity', 'Odd Parity'], [even_parity, odd_parity], color='slateblue')
plt.title("Parity Class Distribution")
plt.ylabel("Counts")
plt.grid(True)
plt.tight_layout()
plt.show()
# Bitwise Heatmap of 1s
position_counts = [0, 0, 0]
for bitstring, count in counts.items():
for i in range(3):
if bitstring[i] == '1':
position_counts[i] += count
# Normalize
position_probs = [pc / total_shots for pc in position_counts]
plt.figure(figsize=(6,4))
plt.bar(['q0', 'q1', 'q2'], position_probs, color='tomato')
plt.title("Qubit-Wise Frequency of '1'")
plt.ylabel("Probability of 1")
plt.ylim(0, 1)
plt.grid(True)
plt.tight_layout()
plt.show()
# Cumulative Distribution Function (CDF)
sorted_probs = sorted([v / total_shots for v in counts.values()], reverse=True)
cumulative = np.cumsum(sorted_probs)
plt.figure(figsize=(8,5))
plt.plot(range(1, len(cumulative)+1), cumulative, marker='o', color='seagreen')
plt.title("Cumulative Distribution Function (CDF)")
plt.xlabel("Bitstring Rank (by frequency)")
plt.ylabel("Cumulative Probability")
plt.grid(True)
plt.tight_layout()
plt.show()
# Transition Graph (Markov Lattice over Bit Flips)
bitstrings = list(counts.keys())
transitions = defaultdict(int)
# Only allow transitions by 1-bit flip (Hamming distance = 1)
def is_1bit_flip(a, b):
return sum(x != y for x, y in zip(a, b)) == 1
for a in bitstrings:
for b in bitstrings:
if is_1bit_flip(a, b):
transitions[(a, b)] = math.sqrt(counts[a] * counts[b])
# Plot as a network
import networkx as nx
G = nx.DiGraph()
for (a, b), weight in transitions.items():
G.add_edge(a, b, weight=weight)
plt.figure(figsize=(8,6))
pos = nx.spring_layout(G, seed=42)
edges = G.edges()
weights = [G[u][v]['weight'] / 300 for u,v in edges] # scale for visibility
plt.title("Bitstring Transition Graph (1-bit Flips Only)")
nx.draw(G, pos, with_labels=True, node_color='lightblue', edge_color='gray', width=weights, arrows=True)
plt.tight_layout()
plt.show()
# Shannon Entropy by Hamming Distance Shell
ideal = '111'
def hamming_distance(a, b):
return sum(x != y for x, y in zip(a, b))
shell_entropy = defaultdict(float)
shell_probs = defaultdict(float)
for b, c in counts.items():
prob = c / total_shots
dist = hamming_distance(b, ideal)
if prob > 0:
shell_entropy[dist] += -prob * math.log2(prob)
shell_probs[dist] += prob
distances = sorted(shell_entropy.keys())
entropies = [shell_entropy[d] for d in distances]
plt.figure(figsize=(6,4))
plt.bar(distances, entropies, color='teal')
plt.title("Shannon Entropy by Hamming Distance Shell")
plt.xlabel("Hamming Distance from 111")
plt.ylabel("Entropy Contribution (bits)")
plt.xticks(distances)
plt.grid(True)
plt.tight_layout()
plt.show()
# Bitstring Phase Wheel
bit_order = sorted(counts.keys(), key=lambda b: int(b, 2))
angles = [2 * np.pi * i / len(bit_order) for i in range(len(bit_order))]
radii = [counts[b] / total_shots for b in bit_order]
# Create polar plot
plt.figure(figsize=(8, 8))
ax = plt.subplot(111, polar=True)
bars = ax.bar(angles, radii, width=0.4, bottom=0.0, color='orchid', alpha=0.8)
for angle, radius, label in zip(angles, radii, bit_order):
rotation = np.degrees(angle)
alignment = 'left' if np.pi/2 < angle < 3*np.pi/2 else 'right'
ax.text(angle, radius + 0.02, label, ha=alignment, va='center',
rotation=rotation, rotation_mode='anchor', fontsize=10)
ax.set_title("Bitstring Phase Wheel", va='bottom')
ax.set_yticklabels([])
ax.set_xticklabels([])
plt.tight_layout()
plt.show()
# Logical Success vs Failure Polar Projection
successes = ['011', '101', '111', '110']
failures = [b for b in counts if b not in successes]
theta_s = [2 * np.pi * i / len(successes) for i in range(len(successes))]
theta_f = [2 * np.pi * i / len(failures) for i in range(len(failures))]
r_s = [counts[b] / total_shots for b in successes]
r_f = [counts[b] / total_shots for b in failures]
plt.figure(figsize=(6,6))
plt.subplot(111, polar=True)
plt.bar(theta_s, r_s, width=0.4, color='limegreen', label='Logical Success')
plt.bar(theta_f, r_f, width=0.4, color='firebrick', label='Logical Failure')
plt.title("Recovery vs Collapse Sectors")
plt.legend(loc='upper right')
plt.tight_layout()
plt.show()
# Twistor-Weighted Eigenstring Projection
eigen_weights = {b: (sum(int(x) for x in b) ** 2) / 9 for b in counts}
bitstrings = list(counts.keys())
projections = [eigen_weights[b] * (counts[b] / total_shots) for b in bitstrings]
plt.figure(figsize=(10,5))
plt.bar(bitstrings, projections, color='midnightblue')
plt.title("Twistor-Weighted Eigenstring Projection")
plt.xlabel("Bitstring")
plt.ylabel("Weighted Projection Strength")
plt.grid(True)
plt.tight_layout()
plt.show()
# End
//////////////////////////////////////////////////////////
# Flat Repetition Code with Twistor Gate Load
# Imports
import numpy as np
import json
import logging
import pandas as pd
import random
from qiskit import QuantumCircuit, transpile, QuantumRegister, ClassicalRegister
from qiskit_ibm_runtime import QiskitRuntimeService, Session, SamplerV2
from qiskit.circuit.library import RZGate, SXGate, XGate, RZXGate, ECRGate
from qiskit.visualization import plot_histogram
import matplotlib.pyplot as plt
# Setup logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Load IBMQ account
service = QiskitRuntimeService(
channel='ibm_quantum',
instance='ibm-q/open/main',
token='YOUR_IBMQ_KEY_O-`'
)
# Backend
backend_name = 'ibm_brisbane'
backend = service.backend(backend_name)
# Load calibration data
def load_calibration_data(file_path):
logger.info("Loading calibration data from %s", file_path)
calibration_data = pd.read_csv(file_path)
calibration_data.columns = calibration_data.columns.str.strip()
logger.info("Calibration data loaded successfully")
return calibration_data
# Select best qubits
def select_best_qubits(calibration_data, n_qubits):
logger.info("Selecting best qubits based on T1, T2, and √X error")
qubits_sorted = calibration_data.sort_values(
by=["√x (sx) error", "T1 (us)", "T2 (us)"],
ascending=[True, False, False]
)
best_qubits = qubits_sorted["Qubit"].head(n_qubits).tolist()
logger.info("Selected qubits: %s", best_qubits)
return best_qubits
# Load calibration data
calibration_file = '/Users/steventippeconnic/Downloads/ibm_brisbane_calibrations_2025-04-08T20_52_35Z.csv'
calibration_data = load_calibration_data(calibration_file)
selected_qubits = select_best_qubits(calibration_data, 3)
# Registers and circuit
qr = QuantumRegister(3, 'q')
cr = ClassicalRegister(3, 'c')
repetition_circuit = QuantumCircuit(qr, cr)
# Encode logical |1⟩
repetition_circuit.x(qr[0])
repetition_circuit.cx(qr[0], qr[1])
repetition_circuit.cx(qr[0], qr[2])
repetition_circuit.barrier()
# Inject random Twistor-equivalent gates (no structure)
for _ in range(19):
repetition_circuit.append(SXGate(), [random.choice([qr[0], qr[1], qr[2]])])
for _ in range(29):
angle = random.uniform(0, 2*np.pi)
repetition_circuit.append(RZGate(angle), [random.choice([qr[0], qr[1], qr[2]])])
for _ in range(3):
repetition_circuit.append(XGate(), [random.choice([qr[0], qr[1], qr[2]])])
for _ in range(8):
q0, q1 = random.sample([qr[0], qr[1], qr[2]], 2)
repetition_circuit.append(ECRGate(), [q0, q1])
for _ in range(3):
angle = random.uniform(0, 2*np.pi)
q0, q1 = random.sample([qr[0], qr[1], qr[2]], 2)
repetition_circuit.append(RZXGate(angle), [q0, q1])
repetition_circuit.barrier()
# Inject same bit-flip error as twistor circuit
repetition_circuit.append(XGate(), [qr[1]])
repetition_circuit.barrier()
# Measure for majority vote decoding
repetition_circuit.measure(qr[0], cr[0])
repetition_circuit.measure(qr[1], cr[1])
repetition_circuit.measure(qr[2], cr[2])
repetition_circuit.barrier()
# Transpile
transpiled_qc = transpile(repetition_circuit, backend=backend, optimization_level=3)
# Execute
with Session(service=service, backend=backend) as session:
sampler = SamplerV2(session=session)
job = sampler.run([transpiled_qc], shots=8192)
job_result = job.result()
# Extract counts
data_bin = job_result._pub_results[0]['__value__']['data']
classical_register = transpiled_qc.cregs[0].name
counts = data_bin[classical_register].get_counts() if classical_register in data_bin else {}
# Save results
results_data = {
"experiment_name": "Flat Repetition Code with Twistor Gate Load",
"raw_counts": counts
}
file_path = '/Users/steventippeconnic/Documents/QC/Flat_Repetition_With_Gates_0.json'
with open(file_path, 'w') as f:
json.dump(results_data, f, indent=4)
# Fidelity Calculation
logical_1_strings = ['111', '110', '101', '011']
correct = sum(counts.get(b, 0) for b in logical_1_strings)
total_shots = sum(counts.values())
fidelity = correct / total_shots
print(f"Logical Fidelity (Flat w/ Gate Load): {fidelity:.5f}")
# Plot
plot_histogram(counts)
plt.title("Flat Repetition Code with Twistor Gate Load")
plt.show()