def signal_handler(sig, frame, exit=True): print('You pressed Ctrl+C! Priting logs...') model.load_weights(os.path.join(log_path, 'checkpoint')) print(*model.variables, sep='\n') # Write the summary to the log dir (so that we can reconstruct the model later on with the Variables with open(os.path.join(log_path, 'summary.txt'), 'w') as f: with redirect_stdout(f): model.summary() model.save(log_path) model_matrix = model.model_matrix() ndtotext_print(model_matrix) # Sanity check: test the model against target real_output = model.target_model(input) model_output = model_matrix @ input print('Sanity check loss:', loss(real_output, model_output).numpy()) std_loss = StdFidelity() print('Sanity check loss std:', std_loss(real_output, model_output).numpy()) # hs_norm = OperatorFidelity(model) # print('Hilbert–Schmidt/Frobenius norm:', hs_norm()) # and check if it's the real inverse! if exit: sys.exit(0)
def on_epoch_end(self, epoch, logs=None): print() mm = model.model_matrix() ndtotext_print(mm) loss1 = loss(output, model(input)) loss2 = loss(output, mm @ input) print('loss on call', loss1) print('loss on mm', loss2)
def signal_handler(sig, frame, exit=True): print('You pressed Ctrl+C! Priting logs...') model.load_weights(os.path.join(log_path, 'checkpoint')) print(*model.variables, sep='\n') # Write the summary to the log dir (so that we can reconstruct the model later on with the Variables with open(os.path.join(log_path, 'summary.txt'), 'w') as f: with redirect_stdout(f): model.summary() model.save(log_path) model_matrix = model.model_matrix() ndtotext_print(model_matrix) # Sanity check: test the QFT_U against QFT on all data qft_layer = QFTLayer() real_output = qft_layer(input) model_output = model_matrix @ input print('Sanity check loss:', loss(real_output, model_output).numpy()) std_loss = StdFidelity() print('Sanity check loss std:', std_loss(real_output, model_output).numpy()) hs_norm = OperatorFidelity(model) print('Hilbert–Schmidt/Frobenius norm:', hs_norm()) # and check if it's the real inverse! targets = None if hasattr(model, 'targets'): targets = model.targets iqft_layer = IQFTLayer(targets) iqft_layer(input) eye = iqft_layer.matrix() @ model_matrix print('Eye:') ndtotext_print(eye) print('Eye norm:') ndtotext_print(np.abs(eye)) if exit: sys.exit(0)
qubit_order=[C1,C2,T1,T2] # U00 qc.append(cirq.XX.on(C1, C2)) # -- qc.append(cirq.SWAP.on(T1, T2).controlled_by(C1, C2)) qc.append(cirq.Z.on(T2).controlled_by(C1, C2, T1)) qc.append(cirq.Z.on(T1).controlled_by(C1, C2)) qc.append(cirq.Z.on(T2).controlled_by(C1, C2)) qc.append(cirq.XX.on(C1, C2)) # -- # # U11 qc.append(cirq.SWAP.on(T1, T2).controlled_by(C1, C2)) qc.append(cirq.Z.on(T2).controlled_by(C1, C2, T1)) qc.append(cirq.Z.on(C2).controlled_by(C1)) XX_B(qc, C1, C2) # Up qc.append(cirq.XX.on(C1, C2)) # -- qc.append(cirq.Z.on(T1).controlled_by(C1, C2)) qc.append(cirq.Z.on(T2).controlled_by(C1, C2)) qc.append(cirq.Z.on(C2).controlled_by(C1)) # PHASE qc.append(cirq.XX.on(C1, C2)) # -- #Um # PHASE XX_B(qc, C1, C2) ndtotext_print(qc.unitary(qubit_order=qubit_order)) U_pi = np.array(U(pi).tolist()).astype(np.float64) ndtotext_print(U_pi) ndtotext_print(U_pi - qc.unitary(qubit_order=qubit_order))
import cirq from tfq_diamond import U import numpy as np from txtutils import ndtotext_print π = np.pi qubits = cirq.GridQubit.rect(2, 2) C1, C2, T1, T2 = qubits qc = cirq.Circuit() t = 1 qc.append(U(π).on(*qubits)) qc.append(cirq.XX.on(T1, T2)**t) qc.append(U(π).on(*qubits)) ndtotext_print(qc.unitary()) qc = cirq.Circuit() t = 1 qc.append(cirq.I.on(C1)) qc.append(cirq.I.on(C2)) qc.append(cirq.XX.on(T1, T2)**t) ndtotext_print(qc.unitary())
if __name__ == '__main__': from tf_qc.utils import random_pure_states from txtutils import ndtotext_print data = random_pure_states((2, 2**2, 1)) l_u3 = U3Layer() l_u3(data) l_u3.variables[0].assign([0]) l_u3.variables[1].assign([0]) l_u3.variables[2].assign([0]) l_u3.variables[3].assign([0]) l_u3.variables[4].assign([π / 2]) l_u3.variables[5].assign([π]) print(*l_u3.variables, sep='\n') ndtotext_print(l_u3.matrix) data_data = lambda N: tf.keras.layers.Input( (2**N, 1), batch_size=2, dtype=complex_type) data = lambda N: random_pure_states((2, 2**N, 1)) l1 = ULayer() l2 = ULayer([[0, 1, 2, 3], [4, 5, 6, 7]]) l1(data(8)) l2(data(8)) l1.thetas = l2.thetas assert tf.reduce_all(l1.matrix() == l2.matrix()) l1 = ULayer() l_I1 = ILayer() l2 = ULayer([[0, 1, 2, 3], [4, 5, 6, 7]]) l1(data(8))
import itertools π = np.pi # t = sympy.Symbol('t', real=True) t = 1 U_pi = U(π) C1, C2, T1, T2 = cirq.GridQubit(0,0), cirq.GridQubit(1,1), cirq.GridQubit(1,0), cirq.GridQubit(0,1) qubit_order=[C1,C2,T1,T2] qc = cirq.Circuit() qc.append(U_pi.on(C1,C2,T1,T2)) qc.append(cirq.ZPowGate(exponent=t/π).on(T2)) # Z(t) qc.append(U_pi.on(C1,C2,T1,T2)) ndtotext_print(qc.unitary(qubit_order=qubit_order)) sim = cirq.Simulator() seq = itertools.product([False, True], repeat=4) for i,j,k,l in seq: qc = cirq.Circuit() # Clear circuit if i: qc.append(cirq.X.on(C1)) else: qc.append(cirq.I.on(C1)) if j: qc.append(cirq.X.on(C2)) else: qc.append(cirq.I.on(C2))
CNS(qc, B[2], B[3], A[2], A[1]) qc.append(Rn_dag(4).on(A[2])) CNS(qc, B[2], B[3], A[1], A[2]) # CNS(qc, B[0], B[1], A[1], A[0]) ## qc.append(Rn(5).on(A[1])) qc.append(Rn(5).on(A[3])) # CNS(qc, B[0], B[1], A[0], A[1]) ## CNS(qc, B[0], B[1], A[1], A[2]) ## CNS(qc, B[4], B[5], A[3], A[2]) qc.append(Rn_dag(5).on(A[3])) CNS(qc, B[4], B[5], A[2], A[3]) CNS(qc, B[0], B[1], A[2], A[1]) ## CNS(qc, B[0], B[1], A[1], A[0]) ## matrix = qc.unitary(qubit_order=B+A)[:2**n_qft,:2**n_qft] ndtotext_print(matrix) # Picked out for all B=0 qc_true = cirq.Circuit() qc_true.append(cirq.H(A[0])) qc_true.append(Rn(2).on(A[0]).controlled_by(A[1])) qc_true.append(Rn(3).on(A[0]).controlled_by(A[2])) qc_true.append(Rn(4).on(A[0]).controlled_by(A[3])) matrix_true = qc_true.unitary(qubit_order=A) ndtotext_print(matrix_true) print('diff') ndtotext_print(matrix_true - matrix) # --- Reduced circuit --- qc_reduced = cirq.Circuit() qc_reduced.append(cirq.H(A[0]))
import cirq from txtutils import ndtotext_print import numpy as np import sympy from tfq_diamond import U π = np.pi U_pi = U(π) iswap_1 = cirq.riswap(3 * π / 2) # Apposite sign to sympy!!! iswap_2 = cirq.riswap(π / 2) print('iSWAP(π/2) [NOT THE ONE WE USE, BUT MIGHT WORK ANYWAY!]') ndtotext_print(iswap_1._unitary_()) print('iSWAP(3π/2)') ndtotext_print(iswap_2._unitary_()) def Rn(n): return cirq.ZPowGate()**(2**(1 - n)) qc_test = cirq.Circuit() q = cirq.GridQubit(1, 1) qc_test.append(Rn(5).on(q)) print(qc_test) print(qc_test.unitary()) print('Should be:', np.exp(2 * π * 1j / 2**5)) assert np.isclose(qc_test.unitary()[1, 1], np.exp(2 * π * 1j / 2**5)) n_qft = 2
import cirq from txtutils import ndtotext_print import numpy as np import sympy from tfq_diamond import U from typing import * π = np.pi U_pi = U(π) iswap_1 = cirq.riswap(3 * π / 2) # Apposite sign to sympy!!! iswap_2 = cirq.riswap(π / 2) print('iSWAP(π/2) [NOT THE ONE WE USE, BUT MIGHT WORK ANYWAY!]') ndtotext_print(iswap_1._unitary_()) print('iSWAP(3π/2)') ndtotext_print(iswap_2._unitary_()) def Rn(n): return cirq.ZPowGate()**(2**(1 - n)) qc_test = cirq.Circuit() q = cirq.GridQubit(1, 1) qc_test.append(Rn(5).on(q)) print(qc_test) print(qc_test.unitary()) print('Should be:', np.exp(2 * π * 1j / 2**5)) assert np.isclose(qc_test.unitary()[1, 1], np.exp(2 * π * 1j / 2**5))
import cirq from txtutils import ndtotext_print import numpy as np import sympy π = np.pi print('iSWAP(π/2) [NOT THE ONE WE USE, BUT MIGHT WORK ANYWAY!]') ndtotext_print(cirq.riswap(π / 2)._unitary_()) print('iSWAP(π/2) @ iSWAP(3π/2)') ndtotext_print( cirq.riswap(π / 2)._unitary_() @ cirq.riswap(3 * π / 2)._unitary_()) n_qft = 5 A = [cirq.GridQubit(0, i) for i in range(n_qft)] B = [cirq.GridQubit(1, i) for i in range(n_qft)] ''' A1 - B1 | | A2 - B2 | | A3 - B3 . . . ''' qc = cirq.Circuit() # Input data input_values = [1, 1, 1] for i, value in enumerate(input_values):
from typing import * π = np.pi # ---- GOOD ----- qc = cirq.Circuit() C1, C2, T1, T2 = cirq.GridQubit(0, 0), cirq.GridQubit(1, 1), cirq.GridQubit( 1, 0), cirq.GridQubit(0, 1) qc.append(cirq.SWAP.on(T1, T2)) qc.append(cirq.H.on(T1)) qc.append(cirq.Z.on(T1)) qc.append(cirq.Z.on(T2)) qc.append(U(π).on(C1, C2, T1, T2)) qc.append(cirq.H.on(T2)) ndtotext_print(qc.unitary(qubit_order=[C1, C2, T1, T2])) # ---- BAD ----- qc2 = cirq.Circuit() qc2.append(cirq.XX.on(C1, C2)) qc2.append(cirq.H.on(T2)) qc2.append(U(π).on(C1, C2, T1, T2)) qc2.append(cirq.H.on(T1)) qc2.append(cirq.XX.on(C1, C2)) qc2.append(U(π).on(C1, C2, T1, T2)) ndtotext_print(qc2.unitary(qubit_order=[C1, C2, T1, T2]))