pub struct TensorNetwork { /* private fields */ }
Expand description
Tensor network representation of a quantum circuit
Implementations§
Source§impl TensorNetwork
impl TensorNetwork
Sourcepub fn new() -> Self
pub fn new() -> Self
Create a new empty tensor network
Examples found in repository?
examples/tensor_network_demo.rs (line 50)
25fn demo_basic_tensor_network() -> quantrs2_core::error::QuantRS2Result<()> {
26 println!("--- Basic Tensor Network Construction ---");
27
28 // Create simple tensors
29 let identity = Tensor::identity(2, "in".to_string(), "out".to_string());
30 println!(
31 "Created identity tensor: rank={}, size={}",
32 identity.rank(),
33 identity.size()
34 );
35
36 // Create Hadamard tensor
37 let h_data = vec![
38 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
39 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
40 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
41 C64::new(-1.0 / 2.0_f64.sqrt(), 0.0),
42 ];
43 let h_tensor = Tensor::new(
44 h_data,
45 vec![2, 2],
46 vec!["h_in".to_string(), "h_out".to_string()],
47 );
48
49 // Build tensor network
50 let mut tn = TensorNetwork::new();
51 let id_idx = tn.add_tensor(identity);
52 let h_idx = tn.add_tensor(h_tensor);
53
54 // Connect tensors
55 tn.add_bond(id_idx, "out".to_string(), h_idx, "h_in".to_string())?;
56
57 println!("Built tensor network with {} tensors and {} bonds", 2, 1);
58 println!();
59
60 Ok(())
61}
Sourcepub fn add_tensor(&mut self, tensor: Tensor) -> usize
pub fn add_tensor(&mut self, tensor: Tensor) -> usize
Add a tensor to the network
Examples found in repository?
examples/tensor_network_demo.rs (line 51)
25fn demo_basic_tensor_network() -> quantrs2_core::error::QuantRS2Result<()> {
26 println!("--- Basic Tensor Network Construction ---");
27
28 // Create simple tensors
29 let identity = Tensor::identity(2, "in".to_string(), "out".to_string());
30 println!(
31 "Created identity tensor: rank={}, size={}",
32 identity.rank(),
33 identity.size()
34 );
35
36 // Create Hadamard tensor
37 let h_data = vec![
38 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
39 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
40 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
41 C64::new(-1.0 / 2.0_f64.sqrt(), 0.0),
42 ];
43 let h_tensor = Tensor::new(
44 h_data,
45 vec![2, 2],
46 vec!["h_in".to_string(), "h_out".to_string()],
47 );
48
49 // Build tensor network
50 let mut tn = TensorNetwork::new();
51 let id_idx = tn.add_tensor(identity);
52 let h_idx = tn.add_tensor(h_tensor);
53
54 // Connect tensors
55 tn.add_bond(id_idx, "out".to_string(), h_idx, "h_in".to_string())?;
56
57 println!("Built tensor network with {} tensors and {} bonds", 2, 1);
58 println!();
59
60 Ok(())
61}
Sourcepub fn add_bond(
&mut self,
t1: usize,
idx1: String,
t2: usize,
idx2: String,
) -> QuantRS2Result<()>
pub fn add_bond( &mut self, t1: usize, idx1: String, t2: usize, idx2: String, ) -> QuantRS2Result<()>
Connect two tensor indices
Examples found in repository?
examples/tensor_network_demo.rs (line 55)
25fn demo_basic_tensor_network() -> quantrs2_core::error::QuantRS2Result<()> {
26 println!("--- Basic Tensor Network Construction ---");
27
28 // Create simple tensors
29 let identity = Tensor::identity(2, "in".to_string(), "out".to_string());
30 println!(
31 "Created identity tensor: rank={}, size={}",
32 identity.rank(),
33 identity.size()
34 );
35
36 // Create Hadamard tensor
37 let h_data = vec![
38 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
39 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
40 C64::new(1.0 / 2.0_f64.sqrt(), 0.0),
41 C64::new(-1.0 / 2.0_f64.sqrt(), 0.0),
42 ];
43 let h_tensor = Tensor::new(
44 h_data,
45 vec![2, 2],
46 vec!["h_in".to_string(), "h_out".to_string()],
47 );
48
49 // Build tensor network
50 let mut tn = TensorNetwork::new();
51 let id_idx = tn.add_tensor(identity);
52 let h_idx = tn.add_tensor(h_tensor);
53
54 // Connect tensors
55 tn.add_bond(id_idx, "out".to_string(), h_idx, "h_in".to_string())?;
56
57 println!("Built tensor network with {} tensors and {} bonds", 2, 1);
58 println!();
59
60 Ok(())
61}
Sourcepub fn contract_all(&self) -> QuantRS2Result<Tensor>
pub fn contract_all(&self) -> QuantRS2Result<Tensor>
Contract the entire network to a single tensor
Examples found in repository?
examples/tensor_network_demo.rs (line 237)
199fn demo_tensor_contraction() -> quantrs2_core::error::QuantRS2Result<()> {
200 println!("--- Tensor Contraction Optimization ---");
201
202 // Create a circuit with specific structure
203 let mut circuit = Circuit::<4>::new();
204
205 // Layer 1: Single-qubit gates
206 for i in 0..4 {
207 circuit.add_gate(Hadamard { target: QubitId(i) })?;
208 }
209
210 // Layer 2: Entangling gates
211 circuit.add_gate(CNOT {
212 control: QubitId(0),
213 target: QubitId(1),
214 })?;
215 circuit.add_gate(CNOT {
216 control: QubitId(2),
217 target: QubitId(3),
218 })?;
219
220 // Layer 3: Cross entangling
221 circuit.add_gate(CNOT {
222 control: QubitId(1),
223 target: QubitId(2),
224 })?;
225
226 // Convert to tensor network
227 let converter = CircuitToTensorNetwork::<4>::new()
228 .with_max_bond_dim(8)
229 .with_tolerance(1e-12);
230
231 let tn = converter.convert(&circuit)?;
232
233 println!("Converted circuit to tensor network");
234 println!("Network has {} tensors", circuit.num_gates());
235
236 // Contract the network
237 let result = tn.contract_all()?;
238 println!("Contracted to single tensor of rank {}", result.rank());
239
240 println!();
241 Ok(())
242}
Trait Implementations§
Auto Trait Implementations§
impl Freeze for TensorNetwork
impl RefUnwindSafe for TensorNetwork
impl Send for TensorNetwork
impl Sync for TensorNetwork
impl Unpin for TensorNetwork
impl UnwindSafe for TensorNetwork
Blanket Implementations§
Source§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
Mutably borrows from an owned value. Read more
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>
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 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>
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts
self
to the equivalent element of its superset.