Skip to main content

quantrs2_tytan/tensor_network_sampler/
tensornetworksampler_traits.rs

1//! # TensorNetworkSampler - Trait Implementations
2//!
3//! This module contains trait implementations for `TensorNetworkSampler`.
4//!
5//! ## Implemented Traits
6//!
7//! - `Sampler`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11use crate::sampler::{SampleResult, Sampler, SamplerError, SamplerResult};
12use scirs2_core::ndarray::{Array1, Array2, ArrayD};
13use scirs2_core::random::prelude::*;
14use std::collections::HashMap;
15
16use super::types::TensorNetworkSampler;
17
18impl Sampler for TensorNetworkSampler {
19    fn run_qubo(
20        &self,
21        qubo: &(
22            scirs2_core::ndarray::Array2<f64>,
23            std::collections::HashMap<String, usize>,
24        ),
25        num_reads: usize,
26    ) -> SamplerResult<Vec<crate::sampler::SampleResult>> {
27        let (matrix, var_map) = qubo;
28        // Lift the 2-D QUBO matrix to a dynamic-rank tensor (ndim == 2)
29        // so that run_hobo can handle it via the existing dispatch path.
30        let tensor: ArrayD<f64> = matrix.clone().into_dyn();
31        self.run_hobo(&(tensor, var_map.clone()), num_reads)
32    }
33    fn run_hobo(
34        &self,
35        problem: &(
36            scirs2_core::ndarray::ArrayD<f64>,
37            std::collections::HashMap<String, usize>,
38        ),
39        num_reads: usize,
40    ) -> SamplerResult<Vec<crate::sampler::SampleResult>> {
41        let (hamiltonian, _var_map) = problem;
42        let mut sampler_copy = Self::new(self.config.clone());
43        match sampler_copy.sample(hamiltonian, num_reads) {
44            Ok(results) => Ok(results),
45            Err(e) => Err(SamplerError::InvalidParameter(e.to_string())),
46        }
47    }
48}