pub struct ProjectedOperator<T, V>{
pub operator: TreeTN<T, V>,
pub envs: EnvironmentCache<T, V>,
pub input_mapping: Option<HashMap<V, IndexMapping<T::Index>>>,
pub output_mapping: Option<HashMap<V, IndexMapping<T::Index>>>,
}Expand description
ProjectedOperator: Manages 3-chain environments for operator application.
This computes <psi|H|v> for each local region during the sweep.
For Tree Tensor Networks, the environment is computed by contracting all tensors outside the “open region” into environment tensors. The open region consists of nodes being updated in the current sweep step.
§Structure
For each edge (from, to) pointing towards the open region, we cache:
env[(from, to)] = contraction of:
- bra tensor at `from` (conjugated)
- operator tensor at `from`
- ket tensor at `from`
- all child environments (edges pointing away from `to`)This forms a “3-chain” sandwich: <bra| H |ket> contracted over
all nodes except the open region.
Fields§
§operator: TreeTN<T, V>The operator H
envs: EnvironmentCache<T, V>Environment cache
input_mapping: Option<HashMap<V, IndexMapping<T::Index>>>Input index mapping (true site index -> MPO’s internal input index) Used when MPO has internal indices different from state’s site indices.
output_mapping: Option<HashMap<V, IndexMapping<T::Index>>>Output index mapping (true site index -> MPO’s internal output index)
Implementations§
Source§impl<T, V> ProjectedOperator<T, V>
impl<T, V> ProjectedOperator<T, V>
Sourcepub fn with_index_mappings(
operator: TreeTN<T, V>,
input_mapping: HashMap<V, IndexMapping<T::Index>>,
output_mapping: HashMap<V, IndexMapping<T::Index>>,
) -> Self
pub fn with_index_mappings( operator: TreeTN<T, V>, input_mapping: HashMap<V, IndexMapping<T::Index>>, output_mapping: HashMap<V, IndexMapping<T::Index>>, ) -> Self
Create a new ProjectedOperator with index mappings from a LinearOperator.
The mappings define how state’s site indices relate to MPO’s internal indices. This is required when the MPO uses internal indices (s_in_tmp, s_out_tmp) that differ from the state’s site indices.
Sourcepub fn apply<NT: NetworkTopology<V>>(
&mut self,
v: &T,
region: &[V],
ket_state: &TreeTN<T, V>,
bra_state: &TreeTN<T, V>,
topology: &NT,
) -> Result<T>
pub fn apply<NT: NetworkTopology<V>>( &mut self, v: &T, region: &[V], ket_state: &TreeTN<T, V>, bra_state: &TreeTN<T, V>, topology: &NT, ) -> Result<T>
Apply the operator to a local tensor: compute H|v⟩ at the current position.
If index mappings are set (via with_index_mappings), this method:
- Transforms input
v’s site indices using unique temp indices (avoids duplicate IDs) - Contracts with MPO tensors and environment tensors
- Transforms result’s temp output indices back to true site indices
- Replaces bra-side boundary bonds with ket-side so output lives in same space as
v - Permutes result to
v’s index order so output structure matches input
§Arguments
v- The local tensor to apply the operator toregion- The nodes in the open regionket_state- The current state |ket⟩ (used for ket in environment computation)bra_state- The reference state ⟨bra| (used for bra in environment computation) For V_in = V_out, this is the same as ket_state. For V_in ≠ V_out, this should be a state in V_out.topology- Network topology for traversal
§Returns
The result of applying H to v: H|v⟩, with same index set and order as v.
Sourcepub fn local_dimension(&self, region: &[V]) -> usize
pub fn local_dimension(&self, region: &[V]) -> usize
Compute the local dimension (size of the local Hilbert space).
Sourcepub fn invalidate<NT: NetworkTopology<V>>(
&mut self,
region: &[V],
topology: &NT,
)
pub fn invalidate<NT: NetworkTopology<V>>( &mut self, region: &[V], topology: &NT, )
Invalidate caches affected by updates to the given region.
Auto Trait Implementations§
impl<T, V> Freeze for ProjectedOperator<T, V>
impl<T, V> RefUnwindSafe for ProjectedOperator<T, V>where
<T as TensorIndex>::Index: RefUnwindSafe,
V: RefUnwindSafe,
T: RefUnwindSafe,
<<T as TensorIndex>::Index as IndexLike>::Id: RefUnwindSafe,
impl<T, V> Send for ProjectedOperator<T, V>
impl<T, V> Sync for ProjectedOperator<T, V>
impl<T, V> Unpin for ProjectedOperator<T, V>
impl<T, V> UnsafeUnpin for ProjectedOperator<T, V>
impl<T, V> UnwindSafe for ProjectedOperator<T, V>where
<T as TensorIndex>::Index: UnwindSafe,
V: UnwindSafe,
T: UnwindSafe,
<<T as TensorIndex>::Index as IndexLike>::Id: UnwindSafe,
Blanket Implementations§
§impl<U> As for U
impl<U> As for U
§fn as_<T>(self) -> Twhere
T: CastFrom<U>,
fn as_<T>(self) -> Twhere
T: CastFrom<U>,
self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read moreSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> Twhere
Self: Distribution<T>,
§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> Twhere
Self: Distribution<T>,
§impl<T> DistributionExt for Twhere
T: ?Sized,
impl<T> DistributionExt for Twhere
T: ?Sized,
fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> Twhere
Self: Distribution<T>,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more