import pennylane as qml from ttn import ttn_circuit from gates import two_qubit_gate from hamiltonians import tfi_chain num_qubits = 8 # The simulator. dev = qml.device('default.qubit', wires=num_qubits, analytic=True) # The TFI model at the critical point. h = 1.0 periodic = False H = tfi_chain(num_qubits, h, periodic=periodic) print(H) # The TTN circuit. fix_layers = False ansatz = ttn_circuit(num_qubits, two_qubit_gate, fix_layers=fix_layers) # The circuit for computing the expectation value of H. cost_fn = qml.ExpvalCost(ansatz, H, dev, optimize=True) num_params_per_gate = 15 # The number of parameters in each two-qubit gate. depth = int(np.floor(np.log2(num_qubits))) # The depth of the TTN. num_gates = num_qubits - 1 # The number of two-qubit gates in the TTN. if fix_layers: num_params = num_params_per_gate * depth else:
from pennylane import numpy as np import matplotlib.pyplot as plt from mera import mera_circuit, get_num_mera_gates from hamiltonians import tfi_chain num_samples = 200 qubits = [2, 4, 8] variances = [] np.random.seed(1) h = 1.0 periodic = False fix_layers = True for num_qubits in qubits: H = tfi_chain(num_qubits, h) grad_vals = [] for i in range(num_samples): print(f"num_qubits {num_qubits}, step {i}") dev = qml.device("default.qubit", wires=num_qubits) ansatz = mera_circuit(num_qubits, periodic, fix_layers) cost_fn = qml.ExpvalCost(ansatz, H, dev) grad = qml.grad(cost_fn) num_params_per_gate = 15 num_gates = get_num_mera_gates(num_qubits, periodic, fix_layers) num_params = num_params_per_gate * num_gates params = np.pi * (np.random.rand(num_params) - 1.0) gradient = np.array(grad(params)[0]) grad_vals.append(gradient)
print(f" +++ {init} +++") mod_ansatz = ansatz if init in ["Random |+...+>", "Zero |+...+>"]: @qml.template def ansatz_plus(params, wires): for q in range(num_qubits): qml.Hadamard(q) ansatz(params, wires) mod_ansatz = ansatz_plus for h in hs: print(f" ||| h={h} |||") H = tfi_chain(num_qubits, h, g=g) grad_vals = [] cost_fn = qml.ExpvalCost(mod_ansatz, H, dev, optimize=True) grad = qml.grad(cost_fn) # Use the same random numbers for each set of parameters/ansatz. np.random.seed(seed) for i in range(num_samples): if init in ["Zero |0...0>", "Zero |+...+>"]: params = np.zeros(num_params) else: params = np.pi * (np.random.rand(num_params) - 1.0) if "HEA" in ansatz_name: params = np.reshape(params, (len(params) // 3, 3))
import numpy as np import pennylane as qml from ttn import ttn_circuit from mera import mera_circuit, get_num_mera_gates, arb_qubit_gate from hea import hea_circuit from gates import two_qubit_gate, simple_two_qubit_gate1, simple_two_qubit_gate2 from hamiltonians import tfi_chain num_qubits = int(args.N) # The simulator. dev = qml.device('default.qubit', wires=num_qubits) # The TFI model at the critical point. h = float(args.h) H = tfi_chain(num_qubits, h, periodic=args.periodic) print(H) if args.two_qubit == "two_qubit": unitary_parameterization = two_qubit_gate num_params_per_gate = 15 elif args.two_qubit == "simple6": unitary_parameterization = simple_two_qubit_gate1 num_params_per_gate = 6 elif args.two_qubit == "simple2": unitary_parameterization = simple_two_qubit_gate2 num_params_per_gate = 2 elif args.two_qubit == "arbitrary": unitary_parameterization = arb_qubit_gate num_params_per_gate = 15 else:
import numpy as np import pennylane as qml from ttn import ttn_circuit from mera import mera_circuit, get_num_mera_gates, arb_qubit_gate from hea import hea_circuit from gates import two_qubit_gate, simple_two_qubit_gate1, simple_two_qubit_gate2 from hamiltonians import tfi_chain from observables import sigma_z, sigma_x num_qubits = int(args.N) # The simulator. dev = qml.device('default.qubit', wires=num_qubits, analytic=True) h = float(args.h) H = tfi_chain(num_qubits, h, periodic=False) sz = sigma_z(num_qubits) sx = sigma_x(num_qubits) print(H) print("----") print(sz) print("----") print(sx) # The TFI model at the critical point. if args.two_qubit == "two_qubit": unitary_parameterization = two_qubit_gate num_params_per_gate = 15 elif args.two_qubit == "simple6": unitary_parameterization = simple_two_qubit_gate1