|
| 1 | +using ITensors: ITensor, sim |
| 2 | + |
| 3 | +default_dual_link_index_map = sim |
| 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 | +# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph_type`. |
| 40 | +data_graph_type(::Type{<:LinearFormNetwork}) = data_graph_type(tensornetwork(lf)) |
| 41 | +# TODO: Use `NamedGraphs.GraphsExtensions.parent_graph`. |
| 42 | +data_graph(lf::LinearFormNetwork) = data_graph(tensornetwork(lf)) |
| 43 | + |
| 44 | +function Base.copy(lf::LinearFormNetwork) |
| 45 | + return LinearFormNetwork( |
| 46 | + copy(tensornetwork(lf)), bra_vertex_suffix(lf), ket_vertex_suffix(lf) |
| 47 | + ) |
| 48 | +end |
| 49 | + |
| 50 | +function update( |
| 51 | + lf::LinearFormNetwork, |
| 52 | + original_bra_state_vertex, |
| 53 | + original_ket_state_vertex, |
| 54 | + bra_state::ITensor, |
| 55 | + ket_state::ITensor, |
| 56 | +) |
| 57 | + lf = copy(lf) |
| 58 | + # TODO: Maybe add a check that it really does preserve the graph. |
| 59 | + setindex_preserve_graph!( |
| 60 | + tensornetwork(lf), bra_state, bra_vertex(blf, original_bra_state_vertex) |
| 61 | + ) |
| 62 | + setindex_preserve_graph!( |
| 63 | + tensornetwork(lf), ket_state, ket_vertex(blf, original_ket_state_vertex) |
| 64 | + ) |
| 65 | + return lf |
| 66 | +end |
0 commit comments