Skip to main content

ProjectedOperator

Struct ProjectedOperator 

Source
pub struct ProjectedOperator<T, V>
where T: TensorLike, V: Clone + Hash + Eq + Send + Sync + Debug,
{ 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>
where T: TensorLike, <T::Index as IndexLike>::Id: Clone + Hash + Eq + Ord + Debug + Send + Sync + 'static, V: Clone + Hash + Eq + Ord + Send + Sync + Debug,

Source

pub fn new(operator: TreeTN<T, V>) -> Self

Create a new ProjectedOperator.

Source

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.

Source

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:

  1. Transforms input v’s site indices using unique temp indices (avoids duplicate IDs)
  2. Contracts with MPO tensors and environment tensors
  3. Transforms result’s temp output indices back to true site indices
  4. Replaces bra-side boundary bonds with ket-side so output lives in same space as v
  5. Permutes result to v’s index order so output structure matches input
§Arguments
  • v - The local tensor to apply the operator to
  • region - The nodes in the open region
  • ket_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.

Source

pub fn local_dimension(&self, region: &[V]) -> usize

Compute the local dimension (size of the local Hilbert space).

Source

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>
where <T as TensorIndex>::Index: Unpin, V: Unpin, T: Unpin, <<T as TensorIndex>::Index as IndexLike>::Id: Unpin,

§

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§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>,

Casts 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 more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> ByRef<T> for T

§

fn by_ref(&self) -> &T

§

impl<T> ByRef<T> for T

§

fn by_ref(&self) -> &T

§

impl<T> ByRef<T> for T

§

fn by_ref(&self) -> &T

§

impl<T> DistributionExt for T
where T: ?Sized,

§

fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> T
where Self: Distribution<T>,

§

impl<T> DistributionExt for T
where T: ?Sized,

§

fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> T
where Self: Distribution<T>,

§

impl<T> DistributionExt for T
where T: ?Sized,

§

fn rand<T>(&self, rng: &mut (impl Rng + ?Sized)) -> T
where Self: Distribution<T>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T, U> Imply<T> for U
where T: ?Sized, U: ?Sized,

§

impl<T> MaybeSend for T

§

impl<T> MaybeSendSync for T

§

impl<T> MaybeSync for T