Exemple #1
0
    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)
Exemple #2
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)
Exemple #3
0
    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))
Exemple #5
0
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())
Exemple #6
0

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))
Exemple #7
0
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
Exemple #10
0
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):
Exemple #12
0
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]))