|
| 1 | +using ITensors: ITensor, prime |
| 2 | + |
| 3 | +default_dual_link_index_map = prime |
| 4 | + |
| 5 | +struct LinearFormNetwork{ |
| 6 | + V,TensorNetwork<:AbstractITensorNetwork{V},BraVertexSuffix,KetVertexSuffix |
| 7 | +} <: AbstractFormNetwork{V} |
| 8 | + tensornetwork::TensorNetwork |
| 9 | + bra_vertex_suffix::BraVertexSuffix |
| 10 | + ket_vertex_suffix::KetVertexSuffix |
| 11 | +end |
| 12 | + |
| 13 | +function LinearFormNetwork( |
| 14 | + bra::AbstractITensorNetwork, |
| 15 | + ket::AbstractITensorNetwork; |
| 16 | + bra_vertex_suffix=default_bra_vertex_suffix(), |
| 17 | + ket_vertex_suffix=default_ket_vertex_suffix(), |
| 18 | + dual_link_index_map=default_dual_link_index_map, |
| 19 | +) |
| 20 | + bra_mapped = dual_link_index_map(bra; sites=[]) |
| 21 | + tn = disjoint_union(bra_vertex_suffix => dag(bra_mapped), ket_vertex_suffix => ket) |
| 22 | + return LinearFormNetwork(tn, bra_vertex_suffix, ket_vertex_suffix) |
| 23 | +end |
| 24 | + |
| 25 | +function LinearFormNetwork(blf::BilinearFormNetwork) |
| 26 | + bra, ket, operator = subgraph(blf, bra_vertices(blf)), |
| 27 | + subgraph(blf, ket_vertices(blf)), |
| 28 | + subgraph(blf, operator_vertices(blf)) |
| 29 | + bra_suffix, ket_suffix = bra_vertex_suffix(blf), ket_vertex_suffix(blf) |
| 30 | + operator = rename_vertices(v -> bra_vertex_map(blf)(v), operator) |
| 31 | + tn = union(bra, ket, operator) |
| 32 | + return LinearFormNetwork(tn, bra_suffix, ket_suffix) |
| 33 | +end |
| 34 | + |
| 35 | +bra_vertex_suffix(lf::LinearFormNetwork) = lf.bra_vertex_suffix |
| 36 | +ket_vertex_suffix(lf::LinearFormNetwork) = lf.ket_vertex_suffix |
| 37 | +# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. |
| 38 | +tensornetwork(lf::LinearFormNetwork) = lf.tensornetwork |
| 39 | + |
| 40 | +function Base.copy(lf::LinearFormNetwork) |
| 41 | + return LinearFormNetwork( |
| 42 | + copy(tensornetwork(lf)), bra_vertex_suffix(lf), ket_vertex_suffix(lf) |
| 43 | + ) |
| 44 | +end |
| 45 | + |
| 46 | +function update(lf::LinearFormNetwork, original_ket_state_vertex, ket_state::ITensor) |
| 47 | + lf = copy(lf) |
| 48 | + # TODO: Maybe add a check that it really does preserve the graph. |
| 49 | + setindex_preserve_graph!( |
| 50 | + tensornetwork(lf), ket_state, ket_vertex(blf, original_ket_state_vertex) |
| 51 | + ) |
| 52 | + return lf |
| 53 | +end |
0 commit comments