-
Notifications
You must be signed in to change notification settings - Fork 1
/
TenetQuacExt.jl
43 lines (33 loc) · 1.05 KB
/
TenetQuacExt.jl
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
module TenetQuacExt
using Tenet
using Quac: Circuit, lanes, arraytype, Swap
using Bijections
function Tenet.TensorNetwork(circuit::Circuit)
n = lanes(circuit)
wire = [[Tenet.letter(i)] for i in 1:n]
tensors = Tensor[]
i = n + 1
for gate in circuit
G = arraytype(gate)
array = G(gate)
if gate isa Swap
(a, b) = lanes(gate)
wire[a], wire[b] = wire[b], wire[a]
continue
end
inds = map(lanes(gate)) do l
from, to = last(wire[l]), Tenet.letter(i)
i += 1
push!(wire[l], to)
(from, to)
end |> x -> zip(x...) |> Iterators.flatten |> collect
tensor = Tensor(array, tuple(inds...); gate = gate)
push!(tensors, tensor)
end
interlayer = [
Bijection(Dict([site => first(index) for (site, index) in enumerate(wire)])),
Bijection(Dict([site => last(index) for (site, index) in enumerate(wire)])),
]
return TensorNetwork{Quantum}(tensors; plug = Tenet.Operator, interlayer)
end
end