-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutils.py
79 lines (63 loc) · 2.06 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# -*- coding: utf-8 -*-
"""
Created on Wed Jan 5 19:30:43 2022
@author: burak
"""
import pennylane as qml
import numpy as np
import torch
class Utils():
'''
Utility Functions for QAutoencoder and Hamiltonian Simulator
Attributes
----------
dev:
quantum device object
Methods
----------
returnState(params):
returns the state vector for a given sequence
'''
def __init__(self, dev, n_qubit_size = 8):
self.dev = dev
self.n_qubit_size = n_qubit_size
@qml.qnode(self.dev)
def returnState(psi):
qml.QubitStateVector(psi, wires = range(0, self.n_qubit_size))
return qml.state()
self.ReturnState = returnState
def getState(self, psi):
return self.ReturnState(psi)
norm = lambda x:np.linalg.norm(x)
normalize = lambda x: x/norm(x)
torchnorm = lambda x:torch.norm(x)
torchnormalize = lambda x: x/torchnorm(x)
quantumOuter = lambda inputs: torch.outer(inputs.conj().T, inputs)
wv = torch.ones(4, dtype = torch.cdouble) / torch.sqrt(torch.Tensor([4]))
qml.Hermitian(quantumOuter(wv), wires = [0,1]).eigendecomposition['eigvec'].T[-1]
def createHamiltonian(edges, n, pauli = 'Z'):
pauli_Z = np.array([[1,0] , [0j, -1]])
pauli_Y = np.array([[0,-1j] , [1j, 0]])
pauli_X = np.array([[0,1] , [0j + 1, 0]])
H_locals = []
H_final = 0
started = False
def createLocalHamiltonian(i,j, pauli = pauli):
emp= np.array([1])
for k in range(n):
if(k==i or k == j):
emp = np.kron(emp,pauli_Z)
else:
emp = np.kron(emp,np.eye(2))
return emp
num_of_hamiltonians = len(edges)
for edge in edges:
H_local = createLocalHamiltonian(edge[0] , edge[1] ) / np.sqrt(num_of_hamiltonians)
if(started == False):
started = True
H_final = H_local * 1
else:
H_final = H_final + H_local
return H_final
H = createHamiltonian([[1,0] , [0,3] , [1,2] , [2,3] ] , 4 )
np.linalg.eig(H)