Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
planner_surface/common.py
Go to the documentation of this file.
1 from __future__ import annotations
2 
3 import sys
4 
5 import numpy as np
6 import scipy as sp
7 
8 from squander import Variational_Quantum_Eigensolver
9 
10 
11 SIGMA_X = sp.sparse.csr_matrix(np.array([[0, 1], [1, 0]], dtype=np.complex128))
12 SIGMA_Y = sp.sparse.csr_matrix(np.array([[0, -1j], [1j, 0]], dtype=np.complex128))
13 SIGMA_Z = sp.sparse.csr_matrix(np.array([[1, 0], [0, -1]], dtype=np.complex128))
14 
15 DEFAULT_ANSATZ = "HEA"
16 DEFAULT_LAYERS = 1
17 DEFAULT_INNER_BLOCKS = 1
18 PRIMARY_BACKEND = "density_matrix"
19 
20 
21 def build_open_chain_topology(qbit_num: int) -> list[tuple[int, int]]:
22  return [(index, index + 1) for index in range(qbit_num - 1)]
23 
24 
26  n_qubits: int, target: int, pauli: sp.sparse.csr_matrix
27 ) -> sp.sparse.csr_matrix:
28  result = None
29  for qubit in range(n_qubits):
30  factor = pauli if qubit == target else sp.sparse.eye(2, format="csr")
31  result = factor if result is None else sp.sparse.kron(result, factor, format="csr")
32  return result.tocsr()
33 
34 
35 def _two_pauli_term(
36  n_qubits: int,
37  first: int,
38  second: int,
39  pauli: sp.sparse.csr_matrix,
40 ) -> sp.sparse.csr_matrix:
41  result = None
42  for qubit in range(n_qubits):
43  factor = pauli if qubit in {first, second} else sp.sparse.eye(2, format="csr")
44  result = factor if result is None else sp.sparse.kron(result, factor, format="csr")
45  return result.tocsr()
46 
47 
49  n_qubits: int,
50  *,
51  topology: list[tuple[int, int]] | None = None,
52  h: float = 0.5,
53  jx: float = 1.0,
54  jy: float = 1.0,
55  jz: float = 1.0,
56 ) -> sp.sparse.csr_matrix:
57  if topology is None:
58  topology = build_open_chain_topology(n_qubits)
59 
60  hamiltonian = sp.sparse.csr_matrix(
61  (2**n_qubits, 2**n_qubits), dtype=np.complex128
62  )
63 
64  for control, target in topology:
65  hamiltonian += -0.5 * jx * _two_pauli_term(n_qubits, control, target, SIGMA_X)
66  hamiltonian += -0.5 * jy * _two_pauli_term(n_qubits, control, target, SIGMA_Y)
67  hamiltonian += -0.5 * jz * _two_pauli_term(n_qubits, control, target, SIGMA_Z)
68 
69  for qubit in range(n_qubits):
70  hamiltonian += -0.5 * h * _single_pauli_term(n_qubits, qubit, SIGMA_Z)
71 
72  return hamiltonian.tocsr()
73 
74 
75 def build_continuity_density_noise() -> list[dict]:
76  return [
77  {
78  "channel": "local_depolarizing",
79  "target": 0,
80  "after_gate_index": 0,
81  "error_rate": 0.1,
82  },
83  {
84  "channel": "amplitude_damping",
85  "target": 1,
86  "after_gate_index": 2,
87  "gamma": 0.05,
88  },
89  {
90  "channel": "phase_damping",
91  "target": 0,
92  "after_gate_index": 4,
93  "lambda": 0.07,
94  },
95  ]
96 
97 
98 def build_optimizer_config() -> dict:
99  return {
100  "max_inner_iterations": 4,
101  "max_iterations": 1,
102  "convergence_length": 2,
103  }
104 
105 
106 def build_case_metadata(*, qbit_num: int, topology, density_noise) -> dict:
107  return {
108  "backend": PRIMARY_BACKEND,
109  "qbit_num": qbit_num,
110  "topology": list(topology),
111  "ansatz": DEFAULT_ANSATZ,
112  "layers": DEFAULT_LAYERS,
113  "inner_blocks": DEFAULT_INNER_BLOCKS,
114  "density_noise": [dict(item) for item in density_noise],
115  }
116 
117 
119  return {
120  "python": sys.version.split()[0],
121  "numpy": np.__version__,
122  "scipy": sp.__version__,
123  }
124 
125 
127  qbit_num: int,
128  *,
129  density_noise: list[dict] | None = None,
130 ):
131  requested_density_noise = (
133  if density_noise is None
134  else [dict(item) for item in density_noise]
135  )
136  topology = build_open_chain_topology(qbit_num)
137  hamiltonian = build_xxz_hamiltonian(qbit_num, topology=topology)
138  vqe = Variational_Quantum_Eigensolver(
139  hamiltonian,
140  qbit_num,
142  backend=PRIMARY_BACKEND,
143  density_noise=requested_density_noise,
144  )
145  vqe.set_Ansatz(DEFAULT_ANSATZ)
146  vqe.Generate_Circuit(layers=DEFAULT_LAYERS, inner_blocks=DEFAULT_INNER_BLOCKS)
147  return vqe, hamiltonian, topology
def build_optimizer_config()
def build_open_chain_topology
def build_phase2_continuity_vqe
def build_software_metadata()
def build_continuity_density_noise()