@@ -165,7 +165,7 @@ function inds(kwargs::NamedTuple{(:bond,)}, tn::AbstractAnsatz)
165
165
return only (inds (tensor1) ∩ inds (tensor2))
166
166
end
167
167
168
- # TODO fix this properly when we do the mapping
168
+ # TODO fix this properly when we do the mapping
169
169
function tensors (kwargs:: NamedTuple{(:at,),Tuple{L}} , tn:: AbstractAnsatz ) where {L<: Lane }
170
170
hassite (tn, Site (kwargs. at)) && return tensors (tn; at= Site (kwargs. at))
171
171
hassite (tn, Site (kwargs. at; dual= true )) && return tensors (tn; at= Site (kwargs. at; dual= true ))
@@ -379,7 +379,8 @@ Compute the expectation value of an observable on a [`AbstractAnsatz`](@ref) Ten
379
379
function expect (ψ:: AbstractAnsatz , observable; bra= adjoint (ψ))
380
380
@assert socket (ψ) == State () " ψ must be a state"
381
381
@assert socket (bra) == State (; dual= true ) " bra must be a dual state"
382
- contract (merge (ψ, observable, bra))
382
+
383
+ return expect (form (ψ), ψ, observable; bra)
383
384
end
384
385
385
386
function expect (ψ:: AbstractAnsatz , observables:: AbstractVecOrTuple ; bra= adjoint (ψ))
@@ -388,6 +389,50 @@ function expect(ψ::AbstractAnsatz, observables::AbstractVecOrTuple; bra=adjoint
388
389
end
389
390
end
390
391
392
+ function expect (:: NonCanonical , ψ:: AbstractAnsatz , observable; bra= adjoint (ψ))
393
+ return contract (merge (ψ, observable, bra))
394
+ end
395
+
396
+ # TODO : Try to find a better way to do this
397
+ function expect (:: MixedCanonical , ψ:: AbstractAnsatz , observable; bra= adjoint (ψ))
398
+ return contract (merge (ψ, observable, bra))
399
+ end
400
+
401
+ function expect (:: Canonical , ψ:: Tenet.AbstractAnsatz , observable; bra= adjoint (ψ))
402
+ obs_sites = unique (id .(sites (observable)))
403
+
404
+ ket_Λ = []
405
+ bra_Λ = []
406
+ ket_tensors = []
407
+ bra_tensors = []
408
+ for i in obs_sites
409
+ replace! (observable, inds (observable; at= Site (i)) => Symbol (:input , i))
410
+ replace! (observable, inds (observable; at= Site (i; dual= true )) => Symbol (:output , i))
411
+ replace! (ψ, inds (ψ; at= Site (i)) => Symbol (:input , i))
412
+ replace! (bra, inds (bra; at= Site (i; dual= true )) => Symbol (:output , i))
413
+
414
+ replace! (bra, inds (bra; bond= (Lane (i), Lane (i + 1 ))) => inds (ψ; bond= (Lane (i), Lane (i + 1 ))))
415
+ replace! (bra, inds (bra; bond= (Lane (i - 1 ), Lane (i))) => inds (ψ; bond= (Lane (i - 1 ), Lane (i))))
416
+
417
+ push! (ket_Λ, tensors (ψ; bond= (Lane (i - 1 ), Lane (i))))
418
+ push! (bra_Λ, tensors (bra; bond= (Lane (i - 1 ), Lane (i))))
419
+
420
+ push! (ket_tensors, tensors (ψ; at= Site (i)))
421
+ push! (bra_tensors, tensors (bra; at= Site (i; dual= true )))
422
+ end
423
+
424
+ push! (ket_Λ, tensors (ψ; bond= (Lane (obs_sites[end ]), Lane (obs_sites[end ] + 1 ))))
425
+ push! (bra_Λ, tensors (bra; bond= (Lane (obs_sites[end ]), Lane (obs_sites[end ] + 1 ))))
426
+
427
+ t = contract (
428
+ contract (ket_Λ... , ket_tensors... ; dims= []),
429
+ contract (bra_Λ... , bra_tensors... ; dims= []),
430
+ tensors (Quantum (observable))[1 ],
431
+ )
432
+
433
+ return t
434
+ end
435
+
391
436
"""
392
437
evolve!(ψ::AbstractAnsatz, gate; threshold = nothing, maxdim = nothing, normalize = false)
393
438
0 commit comments