I encountered this error while using apply
for TEBD, but I have already “grad” the sites of the MPS as described in this link.
function measure_pauli(mps::MPS, basis::Vector{Int})
psi = copy(mps)
N = length(psi)
sites = siteinds(psi)
x_inds = findall(x -> x == 1, basis)
y_inds = findall(x -> x == 2, basis)
gates_x = [op("H", sites[i]) for i in x_inds]
gates_y1 = [op("Phase", sites[i])' for i in y_inds]
gates_y2 = [op("H", sites[i]) for i in y_inds]
if !isempty(gates_x)
psi = apply(gates_x, psi)
end
if !isempty(gates_y1)
psi = apply(gates_y1, psi)
end
if !isempty(gates_y2)
psi = apply(gates_y2, psi)
end
result = sample!(psi)
return result
end
function classical_shadows(mps::MPS, num_samples=500)
N = length(mps)
bases = Matrix{Int}(undef, num_samples, N)
snapshots = Matrix{Int}(undef, num_samples, N)
for t in 1:num_samples
basis = rand(1:3, N)
bases[t, :] = basis
snapshots[t, :] = measure_pauli(mps, basis)
end
return snapshots, bases
end
N = 14
T = 100
sites = siteinds("Qubit", N)
psi = randomMPS(sites, 2)
snapshots, bases = classical_shadows(psi, T)
here is the error report
Stacktrace:
[1] getindex
@ ./essentials.jl:13 [inlined]
[2] product(o::ITensor, ψ::MPS, ns::Vector{Int64}; move_sites_back::Bool, apply_dag::Bool, kwargs::@Kwargs{})
@ ITensors.ITensorMPS ~/.julia/packages/ITensors/oOwvi/src/lib/ITensorMPS/src/abstractmps.jl:2120
[3] product (repeats 2 times)
@ ~/.julia/packages/ITensors/oOwvi/src/lib/ITensorMPS/src/abstractmps.jl:2105 [inlined]
[4] product(As::Vector{ITensor}, ψ::MPS; move_sites_back_between_gates::Bool, move_sites_back::Bool, kwargs::@Kwargs{})
@ ITensors.ITensorMPS ~/.julia/packages/ITensors/oOwvi/src/lib/ITensorMPS/src/abstractmps.jl:2247
[5] product
@ ~/.julia/packages/ITensors/oOwvi/src/lib/ITensorMPS/src/abstractmps.jl:2238 [inlined]
[6] measure_pauli(mps::MPS, basis::Vector{Int64})
@ Main ~/CSViT/classcal_shadow.jl:42
[7] classical_shadows(mps::MPS, num_samples::Int64)
@ Main ~/CSViT/classcal_shadow.jl:62
[8] top-level scope
@ ~/CSViT/classcal_shadow.jl:73